📜  Pygame——事件处理

📅  最后修改于: 2022-05-13 01:54:45.505000             🧑  作者: Mango

Pygame——事件处理

事件是用户为获得所需结果而执行的操作。例如,如果用户单击一个按钮,则它被称为单击事件。现在,用户执行的所有事件都被插入到一个称为事件队列的队列中。由于它是一个队列,它遵循先进先出规则,即先插入的元素将先出来。在这种情况下,当一个事件被创建时,它被添加到队列的后面,当事件被处理时,它从前面出来。此队列中的每个元素都与一个属性相关联,该属性只不过是一个整数,表示它是什么类型的事件。让我们了解一些常见事件类型的重要属性。

SR No.EventAttributes
1.KEYDOWN  key, mod, unicode
2.KEYUPkey, mod
3.MOUSEBUTTONUP pos, button
4.MOUSEBUTTONDOWNpos, button
5.MOUSEMOTION pos, rel, buttons
6.QUIT          –

由于您已经了解 pygame 中的事件是什么,现在让我们深入探讨这个主题。必须知道事件的处理必须在主函数内完成。这是因为如果万一完成了,那么就有可能出现输入滞后,从而导致糟糕的用户体验。处理是使用 pygame.event.get() 完成的。这是一个函数,它将返回可以一个接一个地处理的事件列表。

活动类型

1)键盘事件:

如上所述,事件是用户进行的动作。那么让我们想知道,可以在键盘上执行哪些操作?简单的答案是按下键或释放它。按下键称为KEYDOWN,松开键称为KEYUP。与这些事件关联的属性称为整数类型的键。它的用途是代表键盘的按键。公共键由一个预定义的整数常量表示,它是一个大写的 K。这个 K 后跟一个下划线,然后写入键的名称。例如 K_s、K_F7。

事实是大写字母没有整数常数。这个问题的解决方案是一种称为修饰符的东西,也称为 mod,它是同时作为键被按下的 shift、alt、ctrl 等修饰符。 mod 的整数值存储在称为 KMOD_ 的东西中,后面是键的名称。比如KMOD_RSHIFT、KMOD_CTRL等。让我们借助一个小代码来复习一下我们在键盘事件主题中学到的概念。

Python3
for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w:
            print("Move the character forwards")
        elif event.key == pygame.K_s:
            print("Move the character backwards")
        elif event.key == pygame.K_a:
            print("Move the character left")
        elif event.key == pygame.K_d:
            print("Move the character right")


Python3
for event in pygame. event.get():
    if event.type == pygame.QUIT:
        raise SystemExit
    elif event.type == pygame.MOUSEMOTION:
        if event.rel[0] > 0:
            print("Mouse moving to the right")
        elif event.rel[1] > 0:
            print("Mouse moving down")
    elif event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 3:
            print("Right mouse button pressed")
    elif event.type == pygame.MOUSEBUTTONUP:
        print("Mouse button has been released")


Python3
import pygame
pygame.init()
  
# Creating window
gameWindow = pygame.display.set_mode((800, 300))
pygame.display.set_caption("Event Handling")
  
  
exit_game = False
game_over = False
  
# Creating a game loop
while not exit_game:
    for event in pygame.event.get():  # For Loop
        if event.type == pygame.QUIT:
            exit_game = True
  
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                print("You have pressed right arrow key")
            elif event.key == pygame.K_LEFT:
                print("You have pressed left arrow key")
  
pygame.quit()
quit()


Python3
import pygame
pygame.init()
  
# Creating window
gameWindow = pygame.display.set_mode((800, 300))
pygame.display.set_caption("Event Handling")
  
  
exit_game = False
game_over = False
  
# Creating a game loop
while not exit_game:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit_game = True
  
        if event.type == pygame.QUIT:
            raise SystemExit
        elif event.type == pygame.MOUSEMOTION:
            if event.rel[0] > 0:
                print("Mouse moving to the right")
            elif event.rel[1] > 0:
                print("Mouse moving down")
        elif event.type == pygame.MOUSEBUTTONDOWN:  # Click event
            if event.button == 3:
                print("Right mouse button pressed")
        elif event.type == pygame.MOUSEBUTTONUP:  # Mouse released
            print("Mouse button has been released")
  
pygame.quit()
quit()


2) 鼠标事件

现在让我们了解不同类型的鼠标事件。前两个是 MOUSEBUTTONDOWN 和 MOUSEBUTTONUP,它们与 KEYDOWN 和 KEYUP 类似,只是这里我们使用的是鼠标。除了它们之外,还有另一个称为 MOUSEMOTION 的鼠标事件。让我们详细了解所有 3 个鼠标事件

i) MOUSEBUTTONDOWN:当用户按下鼠标按钮时,MOUSEBUTTONDOWN 事件发生。它有几个属性,如下所示:

  • button:它是一个整数,表示已按下的按钮。鼠标左键用 1 表示,对于鼠标滚轮,整数为 2,整数 3 表示鼠标右键按下时。
  • pos:是用户按下鼠标按键时鼠标的绝对位置(x,y)。  

ii) MOUSEBUTTONUP:当用户释放鼠标按钮时,MOUSEBUTTONUP 事件发生。它具有与上面提到的 MOUSEBUTTONDOWN 相同的按钮和位置属性。

iii) MOUSEMOTION:当用户在显示窗口中移动鼠标时发生此事件。它具有属性buttons、pos 和rel。

  • 按钮:它是一个元组,表示是否按下鼠标按钮(左、鼠标滚轮、右)。
  • pos:它是光标的绝对位置(x,y),以像素为单位。
  • rel:它表示与前一个位置(rel_x,rel_y)的相对位置,以像素为单位。

让我们借助下表修改每个鼠标按钮属性的值:

SR No.ButtonValue
1.Left mouse button 1
2.Mouse wheel button2
3.Right mouse button 3
4.Mouse wheel scroll up4
5.Mouse wheel scroll down5

让我们借助一个小代码来复习我们在鼠标事件主题中学到的概念。

Python3

for event in pygame. event.get():
    if event.type == pygame.QUIT:
        raise SystemExit
    elif event.type == pygame.MOUSEMOTION:
        if event.rel[0] > 0:
            print("Mouse moving to the right")
        elif event.rel[1] > 0:
            print("Mouse moving down")
    elif event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 3:
            print("Right mouse button pressed")
    elif event.type == pygame.MOUSEBUTTONUP:
        print("Mouse button has been released")

现在让我们看一些与事件处理相关的 pygame 程序。

示例 1:

以下程序将检查我们是否按下了左键或右键并相应地显示输出。

Python3

import pygame
pygame.init()
  
# Creating window
gameWindow = pygame.display.set_mode((800, 300))
pygame.display.set_caption("Event Handling")
  
  
exit_game = False
game_over = False
  
# Creating a game loop
while not exit_game:
    for event in pygame.event.get():  # For Loop
        if event.type == pygame.QUIT:
            exit_game = True
  
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                print("You have pressed right arrow key")
            elif event.key == pygame.K_LEFT:
                print("You have pressed left arrow key")
  
pygame.quit()
quit()

输出:

示例 2:

下面的程序将检查我们是否正在移动鼠标或按下鼠标按钮或释放它并相应地显示输出。

Python3

import pygame
pygame.init()
  
# Creating window
gameWindow = pygame.display.set_mode((800, 300))
pygame.display.set_caption("Event Handling")
  
  
exit_game = False
game_over = False
  
# Creating a game loop
while not exit_game:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit_game = True
  
        if event.type == pygame.QUIT:
            raise SystemExit
        elif event.type == pygame.MOUSEMOTION:
            if event.rel[0] > 0:
                print("Mouse moving to the right")
            elif event.rel[1] > 0:
                print("Mouse moving down")
        elif event.type == pygame.MOUSEBUTTONDOWN:  # Click event
            if event.button == 3:
                print("Right mouse button pressed")
        elif event.type == pygame.MOUSEBUTTONUP:  # Mouse released
            print("Mouse button has been released")
  
pygame.quit()
quit()

输出: