zoukankan      html  css  js  c++  java
  • 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

      

  • 相关阅读:
    如何处理请求返回的二进制数据流转化成xlsx文件?
    iview 表单验证不通过问题?
    如何发布一个npm包?
    async 与 await
    数据库事务的四个基本特征以及事务的隔离级别
    遍历Map的四种方式
    HashMap详解
    HashMap和Hashtable的区别
    java中的堆、栈和常量池简介
    Spring IOC(转载)
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13023617.html
Copyright © 2011-2022 走看看