pygame | 事件监听与游戏设计

425 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

pygame主循环

在pygame中游戏都是基于一个主循环来实现的,设计的思维多数是基于函数的封装,以及定时器来不断更新画面。 具体实现如下:

注意:事件类型都是大写形式,退出事件QUIT默认都会有,不同事件类型下还有相应的函数进行操作。

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        # 监听键盘按下事件,打印出所按的键位信息
        if event.type == pygame.KEYDOWN:
            print(event.unicode, event.key, event.mod)

        # 监听鼠标事件,打印鼠标位置信息
        elif event.type == pygame.MOUSEMOTION:
            print("MOUSEMOTION", event.pos, event.rel, event.buttons)
        elif event.type == pygame.MOUSEBUTTONDOWN:
            print("MOUSEBUTTONDOWN", event.pos, event.button)

    pygame.display.update()

pygame事件监听

pygame事件监听包括鼠标事件、键盘事件、退出事件、自定义事件等... 以常用的鼠标键盘事件为例,每一类型的事件又可细分:

  • 鼠标事件:鼠标按下,鼠标放开,鼠标移动
  • 键盘事件:键盘按下,键盘放开
  • 游戏手柄:... image.png

在监听到用户的具体操作之后,有针对性的做出反应。同时,Pygame 定义了一个事件队列,队列的原则是先进先出,通过事件队列,我们可以有序的处理用户事件.

事件的操作方法如下:

方法说明
pygame.event.get()从事件队列中获取一个事件,并从队列中删除该事件 (常用)
pygame.event.wait() 阻塞直至事件发生才会继续执行,若没有事件发生将一直处于阻塞状态
pygame.event.set_blocked() 控制哪些事件禁止进入队列,参数值为None表示禁止所有事件进入
pygame.event.set_allowed()  控制哪些事件允许进入队列
pygame.event.pump() Pygame自动处理事件队列
pygame.event.poll() 会根据实际情形返回一个真实的事件,或者一个None
pygame.event.peek()  检测某类型事件是否在队列中
pygame.event.clear()从队列中清除所有的事件
pygame.event.get_blocked() 检测某一类型的事件是否被禁止进入队列
pygame.event.post()  放置一个新的事件到队列中
pygame.event.Event()  创建一个用户自定义的新事件