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

Python 如何在pygame的事件队列中添加按键事件,python,pygame,keyboard-events,Python,Pygame,Keyboard Events,我有一个用pygame制作的游戏,运行非常好。我想创建一个系统,从一个文件中读取要按下的键(其中包含要按的键代码,以单独的行显示),并将它们添加到pygame事件队列中,这样玩家代理就可以自己移动,而不会实际按下键 在阅读pygame文档之后,我尝试创建一个新的事件对象并将其添加到队列中,但事件构造函数需要的属性我在任何地方都找不到 是否有人知道创建事件实例需要哪些属性,或者是否有其他更好的方法来实现我正在尝试的操作 更新:我已成功将我的事件添加到队列中,但它们似乎不起作用,即使它们与自动创建的

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

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

是否有人知道创建事件实例需要哪些属性,或者是否有其他更好的方法来实现我正在尝试的操作

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

更新2:我在keydown事件的事件处理代码中添加了一些print语句。只有当我实际按下键盘上的键并且似乎忽略了从代码中引发的事件时,才会执行这些操作。
input_list=[pg.K_RETURN,pg.K_a,pg.K_s]
如果self.cursor.state==c.PLAYER1:
self.cursor.rect.y=358
如果键[pg.K_DOWN]:
打印(“向下”)
self.cursor.state=c.PLAYER2
对于输入列表中的输入:
如果键[输入]:
打印(“按钮”)
self.reset_game_info()
self.done=True
elif self.cursor.state==c.PLAYER2:
self.cursor.rect.y=403
如果键[pg.K_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”键时发生的事件来找到这些值

第一个参数是它的类型,它是介于
pygame.USEREVENT
pygame.NUMEVENTS
之间的整数(24到32互斥)。这用于从其他事件中识别您的事件,例如
pygame.KEYDOWN
pygame.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
第一个参数是它的类型,它是介于
pygame.USEREVENT
pygame.NUMEVENTS
之间的整数(24到32互斥)。这用于从其他事件中识别您的事件,例如
pygame.KEYDOWN
pygame.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

虽然这不是你所要求的,但也许最好在游戏中将这些动作排在更高的级别。例如,如果按键正在改变玩家的动量,而你想自动移动,你可以直接改变动量,而不是排队等待关键事件;这就是它不起作用的原因。我不知道你在哪里定义
键,但我猜你在做
键=pygame.key.get_pressed()
。这将返回所有键的状态,而不是事件。您猜对了。当我按下一个键时,它会更改keys元组中的相应值,但我的事件不会这样做。我希望由于我的代码而发生这种行为。因为当
pygame.key.get_pressed()
返回每个键的状态时,事件被放入事件队列。您的事件不是密钥,不能触发任何密钥,因此不会影响任何密钥的状态。当使用您自己的事件时,您需要手动发布它,然后遍历事件队列,找到它并处理它。按键是事件,但按键的状态不是;通过迭代事件队列来处理事件(如我在示例中所示)。以您当前的方式执行此操作不会处理事件。以下是有关状态检查和事件循环的Stackoverflow文档:虽然这不是您要求的,但最好在游戏中将这些操作排在更高的级别。例如,如果按键正在改变玩家的动量,而你想自动移动,你可以直接改变动量,而不是排队等待关键事件;这就是它不起作用的原因。我不知道你在哪里定义
键,但我猜你在做
键=pygame.key.get_pressed()
。这将返回所有键的状态,而不是事件。您猜对了。当我按下一个键时,它会更改keys元组中的相应值,但我的事件不会这样做。我希望由于我的代码而发生这种行为。因为当
pygame.key.get_pressed()
返回每个键的状态时,事件被放入事件队列。您的事件不是密钥,不能触发任何密钥,因此不会影响任何密钥的状态。当使用您自己的事件时,您需要手动发布它,然后遍历事件队列,找到它并处理它。按键是事件,但按键的状态不是;通过迭代事件队列来处理事件(如我在示例中所示)。以您当前的方式执行此操作不会处理事件。以下是有关状态检查和事件循环的Stackoverflow文档:
第二个参数是字典或关键字参数