我正在使用XNA(C#)開發2D平臺變形器。 我想知道處理按住特定按鈕的最佳方法。例如,您按住的越多,激光束就越大。實現按鍵處理持續時間的方法
到目前爲止,由於我已經使用了保存鍵盤最後2個狀態的輸入機制,因此我可以額外檢查每個更新週期以增加持續時間。但是,這種方法是相當有限的,因爲它只處理一個特定的按鈕(即火按鈕),它應該做的伎倆,但我想知道如果也許有一個更一般的解決方案的問題。
我正在使用XNA(C#)開發2D平臺變形器。 我想知道處理按住特定按鈕的最佳方法。例如,您按住的越多,激光束就越大。實現按鍵處理持續時間的方法
到目前爲止,由於我已經使用了保存鍵盤最後2個狀態的輸入機制,因此我可以額外檢查每個更新週期以增加持續時間。但是,這種方法是相當有限的,因爲它只處理一個特定的按鈕(即火按鈕),它應該做的伎倆,但我想知道如果也許有一個更一般的解決方案的問題。
float ElapsedSecondsPerFrame = (float) gametime.Elapsed.TotalSeconds;
KeyFirePressedTime = Keyboard.GetState().IsKeyDown(FireKey)
? (KeyFirePressedTime + ElapsedSecondsPerFrame)
: 0;
泛型方法
Dictionary<int, float> PressedKeysTime = new ...
void Update(float Elapsed)
{
List<int> OldPressedKeys = PressedKeysTime.Keys.ToList();
foreach (int key in Keyboard.GetState().GetPressedKeys.Cast<int>())
{
if (!PressedKeysTime.ContainsKey(key))
{
PressedKeysTime[key] = 0;
} else {
OldPressedKeys.Remove(key);
PressedKeysTime[key] += Elapsed;
}
}
foreach (int keynotpressed in OldPressedKeys)
PressedKeysTime.Remove(keynotpressed);
}
是的,這與我的方法非常相似。 – CodinRonin 2012-04-09 11:03:01
有沒有其他不同的方法來處理按鍵的持續時間,你必須積累時間,當按鍵火災...我不明白在哪裏是... – Blau 2012-04-09 12:39:44
我在思考更多的行一個更強大的系統來處理持續時間管理。也許一些輔助類與更通用的方法,第三方庫作爲參考... – CodinRonin 2012-04-10 07:48:04
檢測單個按鍵...
lastKeyboardState = CurrentKeyState;
CurrentKeyState = Keyboard.GetState();
if ((CurrentKeyState.IsKeyUp(Keys.Enter)) && (lastKeyboardState.IsKeyDown(Keys.Enter))
{
//Enter was pressed
}
爲了檢測鍵被按下...
lastKeyboardState = CurrentKeyState;
CurrentKeyState = Keyboard.GetState();
if (CurrentKeyState.IsKeyDown(Keys.Enter)
{
//Enter was pressed (You could do BeamSize++ here
}
這似乎做到這一點的最好辦法。這是你已經使用的方法嗎?
這裏有一個簡單的僞代碼示例:
public void Update(GameTime pGameTime)
{
private TimeSpan mKeyDuration = TimeSpan.FromSeconds(0);
...
if key is pressed this frame
mKeyDuration += pGameTime.ElapsedGameTime;
else if key was pressed last frame
mKeyDuration = TimeSpan.FromSeconds(0);
...
}
:
// to cancel immediately
if key is pressed this frame, but was released last frame
begin effect
else if key is pressed this frame, and also was last frame
increase magnitude of effect
else if key is released this frame and effect is active
end effect
// or to gradually decrease
if key is pressed this frame, and effect is inactive
begin effect
else if key is pressed this frame, and effect is active
increase magnitude of effect
else if key is released this frame and effect is active
decrease magnitude of effect
if magnitude decreased enough, end effect
像你說會是這樣的特異性測量持續時間
是的,這是我目前正在實施的一種方式。 但是恐怕問題本身就在計算按鍵的持續時間。在你描述的場景中,我在「增加magnitde」步驟中實現它。 我在想如果可能有一些開箱即用的功能。 – CodinRonin 2012-04-09 11:02:27
據我所知,從X中可以看出不適用KeyboardState文檔,KeyboardState類沒有像您所描述的那樣的限制。從[MSDN文檔](http://msdn.microsoft.com/en-us/library/bb203903%28v=xnagamestudio.10%29.aspx)來判斷,您應該可以使用它來獲取當前狀態每一個關鍵,無論有多少人被壓下,無論他們被壓下多久。您的輸入代碼可能存在問題? – 2012-04-08 17:35:38
感謝您檢查它,我自己確認了您的發現。 而且我也意識到輸入機制,這只是我正在尋找更多的設計/體系結構解決方案。 – CodinRonin 2012-04-09 09:25:26