如何在 Pygame 中添加自定义事件?
在本文中,我们将看到如何在 PyGame 中添加自定义事件。
安装
可以使用以下命令安装 PyGame 库:
pip install pygame
尽管 PyGame 带有一组事件(例如:KEYDOWN 和 KEYUP),但它允许我们创建自己的附加自定义事件 根据我们游戏的要求。自定义事件增加了我们对游戏的控制和灵活性。自定义事件与创建用户定义事件相同。
句法:
例子:
# Here ADDITION and SUBTRACTION is the event name
ADDITION = pygame.USEREVENT + 1
SUBTRACTION = pygame.USEREVENT + 2
现在,我们如何在创建自定义事件后发布它们?这可以通过两种方式完成:
- 使用pygame.event.post()方法。
- 使用pygame.time.set_timer()方法。
使用 pygame.event.post() 方法
我们可以使用pygame.event.post()方法直接发布我们的事件。此方法将我们的事件添加到队列中事件的末尾。为了执行这个,我们需要将我们的事件转换为 Pygame 的事件类型,以便匹配 post 方法的属性并避免错误。
句法:
# Step 1 – Convert event into event datatype of pygame
ADD_event = pygame.event.Event(event)
# Step 2 – Post the event
pygame.event.post(ADD_event) # event_name as parameter
使用 pygame.time.set_timer() 方法
使用 PyGame 计时器定期广播事件。在这里,我们将使用另一种方法通过set_timer()函数发布事件,该函数采用两个参数,用户事件名称和时间间隔(以毫秒为单位)。
句法:
# event_name, time in ms
pygame.time.set_timer(event, duration)
注意:在这里,我们不需要将用户定义的事件转换为 PyGame 事件数据类型。
现在首先创建一个带有自定义事件的图,屏幕的属性应该根据要求设置。然后创建一个事件并将其转换为 PyGame 事件数据类型。现在为您的操作添加将生成自定义事件的代码。
在给定的实现中,两种方法都得到了处理。
程序 :
Python3
# Python program to add Custom Events
import pygame
pygame.init()
# Setting up the screen and timer
screen = pygame.display.set_mode((500, 500))
timer = pygame.time.Clock()
# set title
pygame.display.set_caption('Custom Events')
# defining colours
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
# Keep a track of active variable
bg_active_color = WHITE
screen.fill(WHITE)
# custom user event to change color
CHANGE_COLOR = pygame.USEREVENT + 1
# custom user event to inflate defalte
# box
ON_BOX = pygame.USEREVENT + 2
# creating Rectangle
box = pygame.Rect((225, 225, 50, 50))
grow = True
# posting a event to switch color after
# every 500ms
pygame.time.set_timer(CHANGE_COLOR, 500)
running = True
while running:
# checks which all events are posted
# and based on that perform required
# operations
for event in pygame.event.get():
# switching colours after every
# 500ms
if event.type == CHANGE_COLOR:
if bg_active_color == GREEN:
screen.fill(GREEN)
bg_active_color = WHITE
elif bg_active_color == WHITE:
screen.fill(WHITE)
bg_active_color = GREEN
if event.type == ON_BOX:
# to inflate and deflate box
if grow:
box.inflate_ip(3, 3)
grow = box.width < 75
else:
box.inflate_ip(-3, -3)
grow = box.width < 50
if event.type == pygame.QUIT:
# for quitting the program
running = False
# Posting event when the cursor is on top
# of the box
if box.collidepoint(pygame.mouse.get_pos()):
pygame.event.post(pygame.event.Event(ON_BOX))
# Drawing rectangle on the screen
pygame.draw.rect(screen, RED, box)
# Updating Screen
pygame.display.update()
# Setting Frames per Second
timer.tick(30)
pygame.quit()
输出 :
在上面的实现中,我们使用.post()方法在光标位于框顶部时对框进行充气/放气,并使用.set_timer()方法在每 500 毫秒后切换背景颜色。