如何在事件队列中为pygame添加按键事件

时间:2016-09-24 16:58:42

标签: python pygame keyboard-events

我有一个用pygame制作的游戏,运行得非常好。我想创建一个系统,它从一个文件中读取按键(它将包含按键代码按下单独的行)并将它们添加到pygame事件队列中,以便玩家代理自己移动而不会实际按下按键。

在阅读了pygame文档后,我尝试创建一个新的事件对象并将其添加到队列中,但事件构造函数需要在任何地方都找不到的属性。

是否有人知道创建事件实例需要哪些属性,或者是否有其他更好的方法来实现我的目标?

更新:我已成功将我的事件添加到队列中,但即使它们与自动创建的完全相同,它们似乎也无法正常工作。我正在打印下面的事件队列。当我实际按下'a'键时,会添加突出显示的事件。正如您所看到的,我的事件(上面的事件)不会触发其他事件。

更新2:我在keydown事件的事件处理代码中添加了一些print语句。只有当我实际按下键盘上的键并且似乎忽略了我从代码中引发的事件时才会执行这些操作        input_list = [pg.K_RETURN, pg.K_a, pg.K_s] if self.cursor.state == c.PLAYER1: self.cursor.rect.y = 358 if keys[pg.K_DOWN]: print("down") self.cursor.state = c.PLAYER2 for input in input_list: if keys[input]: print("button") self.reset_game_info() self.done = True elif self.cursor.state == c.PLAYER2: self.cursor.rect.y = 403 if keys[pg.K_UP]: print("up") self.cursor.state = c.PLAYER1

我正在创建我的活动:
pg.event.post(pg.event.Event(pg.KEYDOWN, {'mod': 0, 'scancode': 30, 'key': pg.K_a, 'unicode': 'a'}))
我通过打印当我实际按下键'a'时发生的事件找到了这些值。

1 个答案:

答案 0 :(得分:0)

Event object's第一个参数是它的类型,它是pygame.USEREVENTpygame.NUMEVENTS之间的整数(24到32不包括)。这用于从其他事件中识别您的活动,例如pygame.KEYDOWNpygame.MOUSEBUTTONDOWN等。

第二个参数是字典或关键字参数。这些将是您的活动的属性。 dict应该包含字符串作为键。

这是一个简短的例子,演示如何使用它:

import pygame
pygame.init()

event1 = pygame.event.Event(pygame.USEREVENT, {"greeted": False, "jumped": 10, "ID": 1})
event2 = pygame.event.Event(pygame.USEREVENT, greeted=True, jumped=200, ID=2)

pygame.event.post(event1)
pygame.event.post(event2)

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        raise SystemExit
    elif event.type == pygame.USEREVENT:
        print("Player:", event.ID, "| Greeted:", event.greeted, "| Jumped:", event.jumped)
    elif event.type == pygame.USEREVENT + 1:
        print("Player:", event.ID, "| Greeted:", event.greeted, "| Jumped:", event.jumped)

这将输出:

Player: 1 | Greeted: False | Jumped: 10
Player: 2 | Greeted: True | Jumped: 200