2016-09-24 112 views
1

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

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

有谁知道创建一个事件的实例需要哪些属性,或者如果有另一个更好的方法,我正在尝试做什么?

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

更新2:我加了一些打印语句事件处理代码为KEYDOWN事件。只有当我实际按下键盘上的键时,才会执行这些操作,并且似乎忽略了从代码中提出的事件。
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'}))
我通过打印当我真正按下键“一”,这发生在事件中找到的这些值。

+0

虽然这不是你要的,也许会更好排队这些行动游戏中的更高级别。例如,如果按键改变了玩家的动力,并且想要自动移动,则可以直接改变动力而不是排队等待关键事件。 –

+0

您已将事件与状态混淆;这就是为什么它不起作用。我没有看到你定义'keys'的位置,但我猜你正在做'keys = pygame.key.get_pressed()'。这将返回所有键的状态,而不是*事件。 –

+0

你猜对了。当我按下按键时,它会更改按键元组中的相应值,但我的事件不会这样做。我希望这种行为是由于我的代码而发生的。 –

回答

0

Event object's第一个参数是它的类型,它是一个介于pygame.USEREVENTpygame.NUMEVENTS(不包括24到32)之间的整数。这用于识别来自其​​他事件的事件,如pygame.KEYDOWN,pygame.MOUSEBUTTONDOWN等。

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

这里有一个简单的例子演示如何使用它:

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 
+0

'第二个参数是字典或关键字参数。 ' 我需要这本词典来进行按键事件,所以如果我在我的游戏加载后立即添加我的自定义事件(比方说右箭头),只要他加载,角色就会向右移动。 本字典中的值是什么? –

+0

任何你想要的。这些事件只会添加到事件循环中;你需要做检查和处理你自己。假设您首先发布带有属性移动的事件,然后您需要检查该事件以及它的移动属性。比如[this](http://hastebin.com/omatucobir.cs)。 –

+0

我已将自己的按键事件添加到事件队列中。它们与自动添加的完全相同,但是我的事件不会触发手动按键所执行的代码。 –