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

 

 

 

  

 

 

posted @ 2020-06-01 09:58  天子骄龙  阅读(1095)  评论(0编辑  收藏  举报