pygame實(shí)現(xiàn)鍵盤(pán)和鼠標(biāo)事件的處理
所謂事件,就是程序上發(fā)生的事。例如用戶按下鍵盤(pán)上的某個(gè)鍵或者單擊、移動(dòng)鼠標(biāo),對(duì)于這些事件,游戲程序需要作出反應(yīng)。如《 pygame 圖像/圖形繪制》中例子,程序會(huì)一直運(yùn)行下去,直到用戶關(guān)閉窗口而產(chǎn)生一個(gè) QUIT 事件,pygame 會(huì)接收用戶的各種操作(例如按鍵盤(pán)上的鍵、移動(dòng)鼠標(biāo)等)產(chǎn)生事件。事件隨時(shí)可能發(fā)生,而且量可能會(huì)很大,pygame 的做法是把一系列的事件存放到一個(gè)隊(duì)列里逐個(gè)處理。
在上節(jié)例子中使用了 pygame.event.get() 來(lái)處理所有事件,如果使用 pygame.event.wait() , pygame 會(huì)等到發(fā)生一個(gè)事件時(shí)才繼續(xù)下去,一般在游戲中不太實(shí)用,因?yàn)橛螒蛲切枰獎(jiǎng)討B(tài)運(yùn)作的。pygame 的常用事件如下所示:
| 事件 | 產(chǎn)生途徑 | 參數(shù) |
|---|---|---|
| QUIT | 用戶按下“關(guān)閉”按鈕 | None |
| ACTIVEEVENT | pygame 被激活或者隱藏 | gain 、state |
| KEYDOWN | 鍵盤(pán)被按下 | unicode 、key 、mod |
| KEYUP | 鍵盤(pán)被放開(kāi) | key 、mod |
| MOUSEMOTION | 鼠標(biāo)移動(dòng) | pos 、rel 、buttons |
| MOUSEBUTTONDOWN | 鼠標(biāo)被按下 | pos 、button |
| MOUSEBUTTONUP | 鼠標(biāo)被放開(kāi) | pos 、button |
1. pygame 的鍵盤(pán)事件的處理
通常用 pyagme.event.get() 獲取所有事件,若 event.type == KEYDOWN , 這時(shí)是鍵盤(pán)事件,再判斷按鍵的 event.key 的種類(即 K_a 、 K_b 、 K_LEFT 這種形式)。用戶也可以使用 pygame.key.get_pressed() 來(lái)獲取所有被按下的鍵值,對(duì)應(yīng)的就是鍵是否被按下。
keys_pressed = pygame.key.get_pressed() if keys_pressed[K_SPACE]: # 空格鍵被按下 fire() # 發(fā)射子彈
在 key 模塊下有很多函數(shù),如下:
- key.get_focused(): 返回當(dāng)前的 pygame 窗口是否被激活。
- key.get_pressed(): 獲得所有被按下的鍵值。
- key.get_mods(): 按下的組合鍵(Alt 、Ctrl 、Shift)。
- key.set_mods(): 模擬按下組合鍵的效果(KMOD_ALT 、 KMOD_CTRL 、 KMOD_SHIFT)。
使用 pygame 開(kāi)發(fā)一個(gè)由用戶控制坦克移動(dòng)的游戲。在上節(jié)例子的基礎(chǔ)上增加通過(guò)方向鍵控制坦克移動(dòng)的功能,并為游戲增加背景圖片。代碼如下:
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("用戶方向鍵控制移動(dòng)的坦克")
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()
當(dāng)用戶按下方向鍵時(shí)坦克按指定方向移動(dòng),釋放方向鍵時(shí)坦克停止移動(dòng)。如下所示:

2. pygame 的鼠標(biāo)事件的處理
pygame.mouse 的函數(shù)如下:
- pygame.mouse.get_pressed(): 返回按鍵的按下情況,返回的是一元組,分別為左鍵、中鍵、右鍵,如果被按下則為 True 。
- pygame.mouse.get_rel(): 返回相對(duì)偏移量,即(x 方向偏移量,y 方向偏移量)的一元組。
- pygame.mouse.get_pos(): 返回當(dāng)前鼠標(biāo)位置(x, y)。
例如:x, y = pygame.mouse.get_pos() 用于獲取鼠標(biāo)位置。
- pygame.mouse.set_pos(): 設(shè)置鼠標(biāo)位置。
- pygame.mouse.set_visible(): 設(shè)置鼠標(biāo)光標(biāo)是否可見(jiàn)。
- pygame.mouse.get_focused(): 如果鼠標(biāo)在 pygame 窗口內(nèi)有效,返回 True 。
- pygame.mouse.set_cursor(): 設(shè)置鼠標(biāo)的默認(rèn)光標(biāo)樣式。
- pygame.mouse.get_cursor(): 返回鼠標(biāo)的光標(biāo)樣式。
演示鼠標(biāo)事件的處理程序,代碼如下:
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:
# 按任意鍵可清屏,并把點(diǎn)恢復(fù)到原始狀態(tài)
points = []
srceen.fill((255, 255, 255)) # 用白色填充窗口背景
if event.type == pygame.MOUSEBUTTONDOWN: # 鼠標(biāo)按下
screen.fill((255, 255, 255))
# 畫(huà)隨機(jī)矩形
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))
# 畫(huà)隨機(jī)圓形
rc = (0, 255, 0) # 綠色
rp = (randint(0, 639), randint(0, 479))
rr = randint(1, 200)
pygame.draw.circle(screen, rc, rp, rr)
# 獲取當(dāng)前鼠標(biāo)單擊位置
x, y = pygame.mouse.get_pos()
points.append((x, y))
# 根據(jù)單擊位置畫(huà)弧線
angle = (x / 639) * pi * 2
pygame.draw.arc(screen, (0, 0, 0), (0, 0, 639, 479), 0, angle, 3)
# 根據(jù)單擊位置畫(huà)橢圓
pygame.draw.ellipse(screen, (0, 255, 0), (0, 0, x, y))
# 從左上和右下畫(huà)兩根連線到單擊位置
pygame.draw.line(screen, (0, 0, 255), (0, 0), (x, y))
pygame.draw.line(screen, (255, 0, 0), (640, 480), (x, y))
# 畫(huà)單擊軌跡圖
if len(points) > 1:
pygame.draw.lines(screen, (155, 155, 0), points, False, 2)
# 把鼠標(biāo)單擊的每個(gè)點(diǎn)畫(huà)明顯點(diǎn)
for p in points:
pygame.draw.circle(screen, (155, 155, 155), p, 3)
pygame.display.update()
運(yùn)行這個(gè)程序,在窗口上單擊鼠標(biāo)就會(huì)有圖形出來(lái),按鍵盤(pán)上任意鍵可清屏重新開(kāi)始。如下:

到此這篇關(guān)于pygame實(shí)現(xiàn)鍵盤(pán)和鼠標(biāo)事件的處理的文章就介紹到這了,更多相關(guān)pygame 鍵盤(pán)和鼠標(biāo)事件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 讀取用戶指令和格式化打印實(shí)現(xiàn)解析
這篇文章主要介紹了Python 讀取用戶指令和格式化打印實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
K-means聚類算法介紹與利用python實(shí)現(xiàn)的代碼示例
K-means聚類算法(事先數(shù)據(jù)并沒(méi)有類別之分!所有的數(shù)據(jù)都是一樣的)是我們大家應(yīng)該都聽(tīng)過(guò)的一種算法,下面這篇文章主要給大家介紹了關(guān)于K-means聚類算法的基礎(chǔ)知識(shí)與利用python如何實(shí)現(xiàn)該算法的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11
OpenCV+MediaPipe實(shí)現(xiàn)手部關(guān)鍵點(diǎn)識(shí)別
這篇文章主要介紹了如何通過(guò)OpenCV MediaPipe實(shí)現(xiàn)手部關(guān)鍵點(diǎn)識(shí)別,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的價(jià)值,需要的可以參考一下2022-01-01
django rest framework serializers序列化實(shí)例
這篇文章主要介紹了django rest framework serializers序列化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python實(shí)現(xiàn)動(dòng)態(tài)繪圖的示例詳解
matplotlib中的animation提供了動(dòng)態(tài)繪圖功能,這篇文章主要為大家詳細(xì)介紹了Python如何利用matplotlib實(shí)現(xiàn)動(dòng)態(tài)繪圖,感興趣的可以了解一下2023-05-05
python實(shí)現(xiàn)AHP算法的方法實(shí)例(層次分析法)
這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)AHP算法(層次分析法)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
基于多進(jìn)程中APScheduler重復(fù)運(yùn)行的解決方法
今天小編就為大家分享一篇基于多進(jìn)程中APScheduler重復(fù)運(yùn)行的解決方法,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
PyQt實(shí)現(xiàn)異步數(shù)據(jù)庫(kù)請(qǐng)求的實(shí)戰(zhàn)記錄
開(kāi)發(fā)軟件的時(shí)候不可避免要和數(shù)據(jù)庫(kù)發(fā)生交互,但是有些 SQL 請(qǐng)求非常耗時(shí),如果在主線程中發(fā)送請(qǐng)求,可能會(huì)造成界面卡頓,本文將介紹一種讓數(shù)據(jù)庫(kù)請(qǐng)求變得和前端的 ajax 請(qǐng)求一樣簡(jiǎn)單,希望對(duì)大家有所幫助2023-12-12
詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹
這篇文章主要介紹了詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

