目錄
首先解釋幾個(gè)問題:
1、事件處理需求主要有以下幾個(gè)方面:
2、Pygame事件隊(duì)列
3、Pygame事件
4、事件類型及屬性
?5、事件處理的重要函數(shù)
?6、鍵盤事件
7、鼠標(biāo)事件
8、處理事件函數(shù)
9、操作事件隊(duì)列
10、生成事件
其次給出代碼段,有利于大家對(duì)其進(jìn)行學(xué)習(xí)和分析
最后進(jìn)行小結(jié):
作為一款游戲,一方面是游戲的內(nèi)容是否吸引人,另一方面就是作為游戲者參與其中,因此如何與用戶互動(dòng)是需要著重解決的問題,因此第二部分是事件處理機(jī)制,也就是上篇中提到的event.type的處理。一般為鍵盤和鼠標(biāo)輸入,開發(fā)高級(jí)一點(diǎn)游戲還需要游戲桿,這里主要說一下鍵盤和鼠標(biāo)操作的處理。
首先解釋幾個(gè)問題:
1、事件處理需求主要有以下幾個(gè)方面:
? 響應(yīng)用戶鍵盤、鼠標(biāo)等外設(shè)操作
? 響應(yīng)屏幕尺寸和模式變化
? 響應(yīng)游戲情節(jié)的特定觸發(fā)條件
? 產(chǎn)生一些觸發(fā)條件
? ……
2、Pygame事件隊(duì)列
建立的一個(gè)隊(duì)列,用于緩存并派發(fā)所有事件
原則上先到先處理
3、Pygame事件
pygame.event.EventType
? 事件本質(zhì)上是一種封裝后的數(shù)據(jù)類型(對(duì)象)
? EventType是Pygame的一個(gè)類,表示事件類型
? 事件類型只有屬性,沒有方法
? 用戶可自定義新的事件類型
4、事件類型及屬性
?5、事件處理的重要函數(shù)
?6、鍵盤事件
針對(duì)事件類型,例如鍵盤中按下,然后針對(duì)不同的鍵值和修飾符組合,可以實(shí)現(xiàn)多種對(duì)游戲的操作反饋,從而實(shí)現(xiàn)人對(duì)游戲的全面操控,但是基于游戲的可玩性,盡量的減少按鍵的數(shù)量,對(duì)于游戲是有益的!
7、鼠標(biāo)事件
?(1)pygame.event.MOUSEMOTION鼠標(biāo)移動(dòng)事件
? event.pos?鼠標(biāo)當(dāng)前坐標(biāo)值(x,y),相對(duì)于窗口左上角
? event.rel?鼠標(biāo)相對(duì)運(yùn)動(dòng)距離(X,Y),相對(duì)于上次事件
? event.buttons?鼠標(biāo)按鈕狀態(tài)(a,b,c),對(duì)應(yīng)于鼠標(biāo)的三個(gè)鍵
(2)pygame.event.MOUSEBUTTONUP?鼠標(biāo)鍵釋放事件
? event.pos?鼠標(biāo)當(dāng)前坐標(biāo)值(x,y),相對(duì)于窗口左上角
? event.button?鼠標(biāo)按下鍵編號(hào)n,取值 0/1/2,分別對(duì)應(yīng)三個(gè)鍵
(3)pygame.event.MOUSEBUTTONDOWN?鼠標(biāo)鍵按下事件
? event.pos?鼠標(biāo)當(dāng)前坐標(biāo)值(x,y),相對(duì)于窗口左上角
? event.button?鼠標(biāo)按下鍵編號(hào)n,取值為整數(shù),左鍵為1,右鍵為3,設(shè)備相關(guān)
8、處理事件函數(shù)
(1)pygame.event.get()
? 從事件隊(duì)列中獲得事件列表,即獲得所有被隊(duì)列的事件
例如:
for event in pygame.event.get():
????????if event.type == pygame.QUIT:
????????sys.exit()
? 可以增加參數(shù),獲得某類或某些類事件:
pygame.event.get(type)
pygame.event.get(typelist)
(2)pygame.event.poll()
? 從事件隊(duì)列中獲得一個(gè)事件
While True:
????????event = pygame.event.poll()
? 事件獲取將從事件隊(duì)列中刪除
? 如果事件隊(duì)列為空,則返回 event.NOEVENT
(3)pygame.event.clear()
? 從事件隊(duì)列中刪除事件,默認(rèn)刪除所有事件
? 該函數(shù)與pygame.event.get()類似,區(qū)別僅是不對(duì)事件進(jìn)行處理
? 可以增加參數(shù),刪除某類或某些類事件:
pygame.event.clear(type)
pygame.event.clear(typelist)
9、操作事件隊(duì)列
pygame.event.set_blocked(type or typelist)
? 控制哪些類型事件不允許被保存到事件隊(duì)列中
pygame.event.set_allowed(type or typelist)
? 控制哪些類型事件允許被保存到事件隊(duì)列中
pygame.event.get_blocked(type)
? 測(cè)試某個(gè)事件類型是否被事件隊(duì)列所禁止
? 如果事件類型被禁止,則返回True,否則返回False
10、生成事件
pygame.event.post(Event)
? 產(chǎn)生一個(gè)事件,并將其放入事件隊(duì)列
? 一般用于放置用戶自定義事件(pygame.USEREVENT)
? 也可以用于放置系統(tǒng)定義事件(如鼠標(biāo)或鍵盤等),給定參數(shù)
pygame.event.Event(type, dict)
? 創(chuàng)建一個(gè)給定類型的事件
? 其中,事件的屬性和值采用字典類型復(fù)制,屬性名采用字符串形式
? 如果創(chuàng)建已有事件,屬性需要一致
其次給出代碼段,有利于大家對(duì)其進(jìn)行學(xué)習(xí)和分析
# Unit PYG03: Pygame Wall Ball Game version 8 鼠標(biāo)型
import pygame,sys
pygame.init()
size = width, height = 600, 400
speed = [1,1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size, pygame.RESIZABLE) #窗口大小可調(diào)
icon = pygame.image.load("PYG03-flower.png")
pygame.display.set_icon(icon)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.Clock()
still = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
elif event.key == pygame.K_UP:
speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
elif event.key == pygame.K_ESCAPE:
sys.exit()
elif event.type == pygame.VIDEORESIZE:
size = width, height = event.size[0], event.size[1]
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
still = True
elif event.type == pygame.MOUSEBUTTONUP:
still = False
if event.button == 1:
ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
elif event.type == pygame.MOUSEMOTION:
if event.buttons[0] == 1:
ballrect = ballrect.move(event.pos[0] - ballrect.left, event.pos[1] - ballrect.top)
if pygame.display.get_active() and not still:
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = - speed[0]
if ballrect.right > width and ballrect.right + speed[0] > ballrect.right:
speed[0] = - speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = - speed[1]
if ballrect.bottom > height and ballrect.bottom + speed[1] > ballrect.bottom:
speed[1] = - speed[1]
screen.fill(BLACK)
screen.blit(ball, ballrect)
pygame.display.update()
fclock.tick(fps)
上面的代碼中用到獲取事件,處理了關(guān)閉、鍵盤、鼠標(biāo)、窗口變化等,可以用于分析代碼使用
# Unit PYG04: Pygame Event Post
import pygame,sys
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pygame事件處理")
fps = 1
fclock = pygame.time.Clock()
num = 1
while True:
uevent = pygame.event.Event(pygame.KEYDOWN, {"unicode": 123, "key":pygame.K_SPACE, "mod":pygame.KMOD_ALT})
pygame.event.post(uevent)
num = num + 1
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.unicode == "":
print("[KEYDOWN {}]:".format(num), "#", event.key, event.mod)
else:
print("[KEYDOWN {}]:".format(num), event.unicode, event.key, event.mod)
pygame.display.update()
fclock.tick(fps)
上面的代碼段創(chuàng)建和產(chǎn)生事件的操作,可用于學(xué)習(xí)使用,代碼段來源于慕課
最后進(jìn)行小結(jié):
本文簡(jiǎn)單的介紹了pygame的事件處理機(jī)制。
1、事件的處理需求通俗的講,就是軟件如何應(yīng)對(duì)用戶的操作,何種操作對(duì)應(yīng)如何處置,那些需要響應(yīng),哪些不需要響應(yīng),哪些重點(diǎn)響應(yīng),哪些可以等會(huì)響應(yīng),以及如何響應(yīng)的問題。
2、事件隊(duì)列通俗講就是排隊(duì)需要解決的問題,一般是后來先處理,但也可以設(shè)置不同的處理方式。
3、事件類型是pygame可以處理的類型,并對(duì)鍵盤、鼠標(biāo)等進(jìn)行重點(diǎn)解釋。這些事件類型是應(yīng)用于事件處理中的,排在事件隊(duì)列中,但一般不需要我們管事件隊(duì)列的處理方式
4、事件處理的重要函數(shù)則是對(duì)事件進(jìn)行處理的方法,哪些需要處理,哪些不需要處理,如何處理都是由此處理的,甚至于根據(jù)自己需要生成事件進(jìn)行處理。文章來源:http://www.zghlxwxcb.cn/news/detail-461277.html
注:鍵盤的常用鍵值和修飾值一般不需要記憶,用的時(shí)候查一下就行了!有點(diǎn)太多了,了解一下就中了!文章來源地址http://www.zghlxwxcb.cn/news/detail-461277.html
到了這里,關(guān)于Pygame事件處理機(jī)制簡(jiǎn)介-慕課的python游戲開發(fā)入門02的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!