pygame-理解事件


event = pygame.event.get()    返回當前全部事件隊列並從隊列中刪除事件

不管當前有事件還是無事件,都會繼續往下執行 

可以指定需要獲取的事件類型

返回值是列表

import pygame,time
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("處理事件")

while True:
    time.sleep(1)
    event = pygame.event.get(pygame.KEYDOWN)  #從隊列中獲取鍵盤按下事件

    print(event)

 

event = pygame.event.wait()     等待事件的發生,有事件發生就繼續往下執行,無事件發生就一直等待

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("處理鼠標事件")

i=0
while True:
    event = pygame.event.wait()  #等待事件的發生並返回事件
    if event.type == pygame.QUIT:
        exit()
    str1=str(event)
    print(i,str1)
    i=i+1
    pass

 

pygame.event.set_blocked()    控制哪些事件禁止進入隊列

如果傳入 None,則表示禁止所有的事件進入隊列

import pygame,time
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("處理事件")

pygame.event.set_blocked((pygame.MOUSEMOTION,pygame.MOUSEBUTTONDOWN))  #禁止鼠標移動和鼠標按下事件進入隊列

while True:
    event = pygame.event.wait()  

    print(event)
#此程序運行時,鼠標移動和鼠標按下事件沒有被打印,說明被禁止了

pygame.event.set_allowed()       控制哪些事件允許進入隊列

import pygame,time
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("處理事件")

pygame.event.set_blocked(None)
pygame.event.set_allowed((pygame.MOUSEBUTTONDOWN,pygame.KEYDOWN))  # 允許鼠標按下和鍵盤按下事件進入隊列
#這條語句的作用是把前面禁止進入隊列的事件再允許進入隊列
#如果傳入 None,則表示允許所有的事件進入隊列
while True:

    time.sleep(1)
    event = pygame.event.get()

    print(event)

 

pygame.event.pump()        讓 Pygame內部自動處理事件

pygame.event.poll()       從隊列中獲取一個事件

從隊列中返回並刪除一個事件。如果事件隊列為空,那么會立刻返回類型為 pygame.NOEVENT 的事件

import pygame,time
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("處理事件")

while True:
    time.sleep(2)
    event = pygame.event.poll()   #從隊列中獲取一個事件

    print(event)
#此程序運行時,你可以快速產生一些事件,可以看到每2秒打印出一個事件

pygame.event.peek()      檢測某類型事件是否在隊列中

import pygame,time
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("處理事件")

while True:
    time.sleep(1)
    event = pygame.event.peek((pygame.MOUSEBUTTONDOWN,pygame.KEYDOWN))   #檢測鼠標按下事件或鍵盤按下事件是否在隊列中
    #如果隊列中沒有指定的事件就返回0,有就返回1。如果指定了多個事件類型,只要有一個就返回1
    #注意:不會刪除事件

    print(event)

pygame.event.clear()   從隊列中刪除所有的事件

從隊列中刪除所有的事件,如果通過參數指定事件的類型,則刪除該類型的所有事件。該函數的效果跟 pygame.event.get() 相同,只是沒有返回任何東西

 

 

 

 

 

 

常用事件集:

事件 產生途徑 參數
QUIT 用戶按下關閉按鈕 none
ATIVEEVENT Pygame被激活或者隱藏 gain, state
KEYDOWN 鍵盤被按下 unicode, key, mod
KEYUP 鍵盤被放開 key, mod
MOUSEMOTION 鼠標移動 pos, rel, buttons
MOUSEBUTTONDOWN 鼠標按下  pos, button
MOUSEBUTTONUP 鼠標放開 pos, button
JOYAXISMOTION 游戲手柄(Joystick or pad)移動 joy, axis, value
JOYBALLMOTION 游戲球(Joy ball)移動 joy, axis, value
JOYHATMOTION 游戲手柄(Joystick)移動 joy, axis, value
JOYBUTTONDOWN 游戲手柄按下 joy, button
JOYBUTTONUP 游戲手柄放開 joy, button
VIDEORESIZE  Pygame窗口縮放 size, w, h
VIDEOEXPOSE Pygame窗口部分公開(expose) none
USEREVENT 觸發了一個用戶事件 code

   

 

處理鼠標事件:

MOUSEMOTION事件會在鼠標移動時發生,它有三個參數:

buttons:一個含有三個數字的元組,三個值分別代表左鍵、中鍵和右鍵,1就是按下了。
pos:鼠標光標的位置--相對於pygame窗口的坐標
rel:代表了現在距離上次產生鼠標事件時的距離(橫坐標方向距離,縱坐標方向距離)--正負表示方向

 

MOUSEBUTTONDOWN  鼠標按下時發生,它有兩個參數:

 pos:鼠標光標的位置--相對於pygame窗口的坐標

button:1代表左鍵,2代表中鍵,3代表右鍵

 

MOUSEBUTTONUP   鼠標釋放時發生,它有兩個參數:

 pos:鼠標光標的位置--相對於pygame窗口的坐標

button:1代表左鍵,2代表中鍵,3代表右鍵

滾輪的滾動:

滾輪的滾動也會產生MOUSEBUTTONDOWN和MOUSEBUTTONUP事件,如果向上滾動button屬性返回4,如果向下滾動button屬性返回5

 

 

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("處理鼠標事件")

i=0
while True:
    event = pygame.event.wait()  #等待事件的發生並返回事件
    if event.type == pygame.QUIT:
        exit()
    if event.type == pygame.MOUSEMOTION:
        zuobiao=event.pos   #返回鼠標當前坐標值(x,y)--元組,相對於窗口左上角
        print(i,'坐標為:',zuobiao,type(zuobiao))
        #event.rel    鼠標相對運動距離(X, Y),相對於上次事件
        #event.buttons 鼠標按鈕狀態(a,b,c),對應於鼠標的三個鍵
        pass
    if event.type == pygame.MOUSEBUTTONDOWN:
        print(i,'鼠標鍵按下了',event)
    if event.type == pygame.MOUSEBUTTONUP:
        print(i,'鼠標鍵釋放了',event)
    i=i+1
    pass

 

 

 

處理鍵盤事件:

鍵盤和游戲手柄的事件比較類似,為KEYDOWN和KEYUP 

 

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("處理事件")

x, y = 0, 0
i=0
while True:
    event = pygame.event.wait()
    if event.type == pygame.QUIT:
        exit()
    if event.type == pygame.KEYDOWN:  #如果有鍵盤按下
        if event.key == pygame.K_LEFT:  #如果按下是向左鍵
            x = -1
        if event.key == pygame.K_RIGHT:  #如果按下是向右鍵
            x = 1
        if event.key == pygame.K_UP:  #如果按下是向上鍵
            y = -1
        if event.key == pygame.K_DOWN:  #如果按下是向下鍵
            y = 1
        print(i,event,x,y)
    elif event.type == pygame.KEYUP:  #如果有鍵盤釋放
        print('有鍵釋放',event)

    i=i+1
    pass

 

 unicode -代表了按下鍵的Unicode值

key -按下或者放開的鍵值,是一個數字,Pygame中可以使用K_xxx來表示,比如字母a就是K_a,還有K_SPACE和K_RETURN等,具體看:https://blog.csdn.net/mouday/article/details/80457220

mod -包含了組合鍵信息,如果mod & KMOD_CTRL是真值,表示用戶同時按下了Ctrl鍵。類似的還有KMOD_SHIFT,KMOD_ALT

 

按鍵和組合鍵實例:

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("組合鍵練習")

i=0
while True:
    event = pygame.event.wait()
    if event.type == pygame.QUIT:
        exit()
    if event.type == pygame.KEYDOWN:  #如果有鍵盤按下
        if event.key == pygame.K_LEFT:  #如果按下是向左鍵
            print(i,'向左鍵')
        if event.key == pygame.K_w:  #如果按下是w鍵
            print(i,'w鍵')
        if event.key == pygame.K_LCTRL:  #如果按下是左CTRL鍵
            print(i,'左CTRL')
        if event.key == pygame.K_RCTRL:  #如果按下是右CTRL鍵
            print(i,'右CTRL')
        if event.mod & pygame.KMOD_CTRL:  #如果按下了CTRL鍵
            print(i,'CTRL')
        if event.mod & pygame.KMOD_CTRL and event.key == pygame.K_a:  #如果按下了CTRL鍵+a鍵
            print(i,'CTRL+a')
        if event.mod & pygame.KMOD_CTRL |pygame.KMOD_ALT and event.key == pygame.K_a:  #如果按下了CTRL鍵+ALT鍵+a鍵
            print(i,'CTRL+ALT+a')
    i+=1
    pass

 

 

 

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM