pygame實現(xiàn)鍵盤和鼠標事件的處理
所謂事件,就是程序上發(fā)生的事。例如用戶按下鍵盤上的某個鍵或者單擊、移動鼠標,對于這些事件,游戲程序需要作出反應。如《 pygame 圖像/圖形繪制》中例子,程序會一直運行下去,直到用戶關閉窗口而產(chǎn)生一個 QUIT 事件,pygame 會接收用戶的各種操作(例如按鍵盤上的鍵、移動鼠標等)產(chǎn)生事件。事件隨時可能發(fā)生,而且量可能會很大,pygame 的做法是把一系列的事件存放到一個隊列里逐個處理。
在上節(jié)例子中使用了 pygame.event.get()
來處理所有事件,如果使用 pygame.event.wait()
, pygame 會等到發(fā)生一個事件時才繼續(xù)下去,一般在游戲中不太實用,因為游戲往往是需要動態(tài)運作的。pygame 的常用事件如下所示:
事件 | 產(chǎn)生途徑 | 參數(shù) |
---|---|---|
QUIT | 用戶按下“關閉”按鈕 | None |
ACTIVEEVENT | pygame 被激活或者隱藏 | gain 、state |
KEYDOWN | 鍵盤被按下 | unicode 、key 、mod |
KEYUP | 鍵盤被放開 | key 、mod |
MOUSEMOTION | 鼠標移動 | pos 、rel 、buttons |
MOUSEBUTTONDOWN | 鼠標被按下 | pos 、button |
MOUSEBUTTONUP | 鼠標被放開 | pos 、button |
1. pygame 的鍵盤事件的處理
通常用 pyagme.event.get()
獲取所有事件,若 event.type == KEYDOWN
, 這時是鍵盤事件,再判斷按鍵的 event.key
的種類(即 K_a 、 K_b 、 K_LEFT 這種形式)。用戶也可以使用 pygame.key.get_pressed()
來獲取所有被按下的鍵值,對應的就是鍵是否被按下。
keys_pressed = pygame.key.get_pressed() if keys_pressed[K_SPACE]: # 空格鍵被按下 fire() # 發(fā)射子彈
在 key 模塊下有很多函數(shù),如下:
- key.get_focused(): 返回當前的 pygame 窗口是否被激活。
- key.get_pressed(): 獲得所有被按下的鍵值。
- key.get_mods(): 按下的組合鍵(Alt 、Ctrl 、Shift)。
- key.set_mods(): 模擬按下組合鍵的效果(KMOD_ALT 、 KMOD_CTRL 、 KMOD_SHIFT)。
使用 pygame 開發(fā)一個由用戶控制坦克移動的游戲。在上節(jié)例子的基礎上增加通過方向鍵控制坦克移動的功能,并為游戲增加背景圖片。代碼如下:
import pygame def tank_play(): pygame,inite() tank_image = pygame.image.load("../images/tank.png") tank_rect = tank_image.get_rect() back_image = pygame.iamge.load("../images/background2.jpg") back_rect = back_image.get_rect() screen = pygame.display.set_mode(back_rect.size) pygame.display.set_caption("用戶方向鍵控制移動的坦克") offset = 2 # 偏移量 fps_clock = pygame.time.Clock() while True: fps_clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() keys_pressed = pygame.key.get_presssed() if keys_pressed[pygame.K_RIGHT]: tank_rect.x += offset if keys_pressed[pygame.K_LEFT]: tank_rect.x -= offset if keys_pressed[oygame.K_UP]: tank_rect.y -= offset if keys_pressed[pygame.K_DOWN]: tank_rect.y += offset tank_rect.clamp_ip(back_rect) screen.blit(back_image, back_rect) screen.blit(tank_image, tank_rect) pygame.display.update() if __name__ == '__main--': tank_play()
當用戶按下方向鍵時坦克按指定方向移動,釋放方向鍵時坦克停止移動。如下所示:
2. pygame 的鼠標事件的處理
pygame.mouse 的函數(shù)如下:
- pygame.mouse.get_pressed(): 返回按鍵的按下情況,返回的是一元組,分別為左鍵、中鍵、右鍵,如果被按下則為 True 。
- pygame.mouse.get_rel(): 返回相對偏移量,即(x 方向偏移量,y 方向偏移量)的一元組。
- pygame.mouse.get_pos(): 返回當前鼠標位置(x, y)。
例如:x, y = pygame.mouse.get_pos()
用于獲取鼠標位置。
- pygame.mouse.set_pos(): 設置鼠標位置。
- pygame.mouse.set_visible(): 設置鼠標光標是否可見。
- pygame.mouse.get_focused(): 如果鼠標在 pygame 窗口內有效,返回 True 。
- pygame.mouse.set_cursor(): 設置鼠標的默認光標樣式。
- pygame.mouse.get_cursor(): 返回鼠標的光標樣式。
演示鼠標事件的處理程序,代碼如下:
from math import pi from random import randint import pygame pygame.init() screen = pygame.display.set_mode((640, 480)) points = [] while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if event.type == pygame.KEYDOWN: # 按任意鍵可清屏,并把點恢復到原始狀態(tài) points = [] srceen.fill((255, 255, 255)) # 用白色填充窗口背景 if event.type == pygame.MOUSEBUTTONDOWN: # 鼠標按下 screen.fill((255, 255, 255)) # 畫隨機矩形 rc = (255, 0, 0) # 紅色 rp = (randint(0, 639), randint(0, 479)) rs = (639 - randint(rp[0], 639), 479 - randint(rp[1], 479)) pygame.draw.rect(screen, rc, pygame.Rect(rp, rs)) # 畫隨機圓形 rc = (0, 255, 0) # 綠色 rp = (randint(0, 639), randint(0, 479)) rr = randint(1, 200) pygame.draw.circle(screen, rc, rp, rr) # 獲取當前鼠標單擊位置 x, y = pygame.mouse.get_pos() points.append((x, y)) # 根據(jù)單擊位置畫弧線 angle = (x / 639) * pi * 2 pygame.draw.arc(screen, (0, 0, 0), (0, 0, 639, 479), 0, angle, 3) # 根據(jù)單擊位置畫橢圓 pygame.draw.ellipse(screen, (0, 255, 0), (0, 0, x, y)) # 從左上和右下畫兩根連線到單擊位置 pygame.draw.line(screen, (0, 0, 255), (0, 0), (x, y)) pygame.draw.line(screen, (255, 0, 0), (640, 480), (x, y)) # 畫單擊軌跡圖 if len(points) > 1: pygame.draw.lines(screen, (155, 155, 0), points, False, 2) # 把鼠標單擊的每個點畫明顯點 for p in points: pygame.draw.circle(screen, (155, 155, 155), p, 3) pygame.display.update()
運行這個程序,在窗口上單擊鼠標就會有圖形出來,按鍵盤上任意鍵可清屏重新開始。如下:
到此這篇關于pygame實現(xiàn)鍵盤和鼠標事件的處理的文章就介紹到這了,更多相關pygame 鍵盤和鼠標事件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
K-means聚類算法介紹與利用python實現(xiàn)的代碼示例
K-means聚類算法(事先數(shù)據(jù)并沒有類別之分!所有的數(shù)據(jù)都是一樣的)是我們大家應該都聽過的一種算法,下面這篇文章主要給大家介紹了關于K-means聚類算法的基礎知識與利用python如何實現(xiàn)該算法的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11OpenCV+MediaPipe實現(xiàn)手部關鍵點識別
這篇文章主要介紹了如何通過OpenCV MediaPipe實現(xiàn)手部關鍵點識別,文中的示例代碼講解詳細,對我們學習或工作有一定的價值,需要的可以參考一下2022-01-01django rest framework serializers序列化實例
這篇文章主要介紹了django rest framework serializers序列化實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05python實現(xiàn)AHP算法的方法實例(層次分析法)
這篇文章主要給大家介紹了關于python實現(xiàn)AHP算法(層次分析法)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09PyQt實現(xiàn)異步數(shù)據(jù)庫請求的實戰(zhàn)記錄
開發(fā)軟件的時候不可避免要和數(shù)據(jù)庫發(fā)生交互,但是有些 SQL 請求非常耗時,如果在主線程中發(fā)送請求,可能會造成界面卡頓,本文將介紹一種讓數(shù)據(jù)庫請求變得和前端的 ajax 請求一樣簡單,希望對大家有所幫助2023-12-12