2013-07-07 41 views
2

我需要檢查快速按下「D」或「A」鍵兩次,以便讓精靈改變並生成動畫。一旦這個鍵被釋放,精靈應該回到原來的形式。我有一個簡單的圖形,一旦任何一個鍵被按下,它都應該放下來並開始沿任一方向「滾動」,這取決於按下哪個鍵。任何幫助,將不勝感激!如果某個鍵被快速按下兩次,檢測到

回答

7

Paul_R and Nikola其實已經回答了但是既然你說你是XNA的新手(閱讀:還沒有讀過所有文檔),請允許我介紹一些重要的類:

我們知道鍵盤基本上可以觸發兩種類型的事件: KeyDown(發佈前正在發佈)和KeyUp(發佈時)。

當連續發生KeyDown事件和KeyUp事件時,將按下一個鍵。我通常爲此存儲2個狀態:

private KeyboardState previousKeyboardState; 
private KeyboardState currentKeyboardState; 

確保您還導入了使用這些類所需的軟件包。

using Microsoft.Xna.Framework.Input; 

雖然可能是低效的,因爲你可以有一個聽衆,我在遊戲主循環更新這兩個狀態:

protected override void Update(GameTime gameTime){ 
    previousKeyboardState = currentKeyboardState; 
    currentKeyboardState = Keyboard.GetState(); 
} 

如果我想知道,如果一個鍵被按下,我只需要調用此功能:

public bool isKeyPressed(Keys key){ 
    return previousKeyboardState.IsKeyDown(key) && currentKeyboardState.IsKeyUp(key); 
} 

Keys枚舉。它包含鍵盤鍵的枚舉。例如,鍵盤上的字母A由Keys.A表示。鍵盤按鍵PageDown是Keys.PageDown。舉例來說,我想知道如果按字母B,我只需要調用使用此語句上述方法:

isKeyPressed(Keys.B); //returns true or false 

現在我們知道,如果一個鍵被按下。這就是你的問題出現的地方:我們如何知道一個鍵是否被快速按下兩次。你需要定義什麼快速是。在這個例子中,假設在第一次按下後的1000毫秒內按下某個鍵時,快速按下該鍵。

elapsedTime = gameTime.ElapsedGameTime.TotalMilliseconds; 

:你的遊戲主循環接收參數GameTime gameTime.您可以利用這一點,通過Paul_R的建議

回想一下,使用這一說法得到了以前的更新與上次更新之間的時間注意到我們使用了Milliseconds財產,而不是Seconds。這只是爲了一致性。 gameTime.ElapsedGameTime.TotalMilliseconds是自上次更新後經過的遊戲時間量(以毫秒爲單位)。

這是不是一個真正的優雅的方式來做到這一點,但只是讓你可以明白我的意思,這裏是我做了檢查,如果一個鍵迅速按下一個方法:

public bool isKeyPressedRapidly(Keys key){ 
    return isKeyPressed(key) && elapsedTime <= 1000 && lastKeyPressed == key; 
} 

elapsedTime重置每次isKeyPressed(key)返回true。在主遊戲循環中增加elapsedTime,直到按下另一個鍵。 lastKeyPressed的值就是你按下的最後一個鍵。我會把剩下的留給你。歡呼,玩得開心!

+0

說感謝算法:) –

1

有一個計時器,只要它觸發就將布爾變量設置爲false。將此變量設置爲false並且定時器停止,直到用戶按下D或A鍵。然後啓動計時器。在計時器的滴答事件處理程序中 - 將該變量設置爲false,然後禁用計時器。這樣,您可以將計時器的間隔設置得儘可能小。如果用戶按下A或D,並且布爾變量已經爲true - 那麼你知道它最近被按下了(在你爲該定時器分配的任何間隔內)。這只是許多方法中的一種。

這很好,因爲它使用了內置的事件處理功能,並且會自動將其推送到後臺線程,以便它可以異步執行,並且允許您對允許的間隔進行任意控制 - 您甚至可以構建「雙按靈敏度」設置到遊戲中來調整這個間隔。

+0

對不起,我有點新 - 但是如何在XNA中設置一個計時器? – TheUnrealMegashark

+0

@TheUnrealMegashark你不需要一個計時器,只需在變量中存儲按鍵時間並減去時間 –

+0

好吧,我沒有意識到你正在使用XNA,因此正在處理一個緊湊的框架。但是,基本上所有的計時器都是一個自增的變量。我相信你可以在XNA中使用以下內容來返回自上次更新()以來的時間。嘗試:'gameTime.ElapsedGameTime.TotalSeconds;' – RutledgePaulV

1

你必須保存最後按下的鍵,按下該按鈕

在按鍵時間:

1.Check the pressed key and compare with previous (stored in variable) 
2.If keys matched then subtract the keypress time from lastpressed and previous pressed key 

你必須定義在毫秒的時間來檢查是否改變精靈和動畫

3. if the difference in time is less than the defined time then you have to animate 
4. Dont forget to set your last pressed key in variable for next keypress comparison 
相關問題