2016-09-24 117 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

我已將自己的按鍵事件添加到事件隊列中。它們與自動添加的完全相同,但是我的事件不會觸發手動按鍵所執行的代碼。 –