2012-11-10 38 views
2

我試圖做一個跳躍機制在我的比賽,這將工作是這樣的:XNA:如何衡量一個按鍵被按下的時間量?

// velocity.Y是我想這個我想跳

if (keystate.IsKeyDown(Keys.W)) 
     { 
      velocity.Y = 3 - (time elapsed since start of jump); 
     } 

精靈的速度可能是一個簡單而優雅的解決方案,使我的精靈跳躍,但如果這是不可能的,只是這樣說,它回到了繪圖板。

+1

給它最初的衝動,以及不斷增加的速度高達只要按下按鍵。當然,你添加的速度低於重力。無需計算時間或任何東西。除此之外,無論如何,速度或加速度總是與時間有關。 – LightStriker

+0

你是什麼意思的初始衝動? –

+0

最初的impusle是您按下跳轉鍵時的速度。基本上,你給速度= 10(向上),只是保持重力下降。就這樣,角色跳了起來。如果你想讓你在拿着鑰匙的時候跳到空中控制或者更大的範圍,你可以繼續增加一小部分向上的速度。 – LightStriker

回答

1

我建議不物理學所以直接連接到播放器的輸入,它不是一個非常可擴展的架構。

有一個接口定義物理屬性,如由角色對象實現的速度。當玩家按下向上鍵時,你應該檢查玩家是否在地上,如果他們然後設置他們的加速度向上移動。然後讓一個物理系統遍歷實體物理接口的每個對象的列表,在移動實體之前應用重力和其他力。通過這種方式,您可以爲遊戲中的每個實體使用相同的物理代碼。

我也建議不要將鍵盤輸入直接連接到播放器的移動。你可以有一個名爲'ICharacterController'的接口,它定義了一個'nextInstruction'方法,它返回'CharacterInstructions',它定義了字符可以採取的各種動作,比如跳躍和移動,這可以通過輸入類來實現。然後你的角色類持有對CharacterController的引用,所以它只是調用nextInstruction,這樣角色可以通過玩家輸入,AI或網絡通信控制,但仍然與玩家共享相同的行爲。

Game Coding Complete如果您認真對待遊戲編程,是一本很棒的書。

我也可以推薦Game Engine Architecture

當你使用XNA你應該考慮使用Game Components

+0

感謝您的信息,很高興知道我是否可以更高效和我的方法專業。我會看看那本書。而且你肯定是對的,一個影響整個遊戲的物理系統在長遠看來會更有幫助,然後只是暫時的修正,讓玩家跳躍。 –

+1

沒問題,我剛剛爲你添加了幾個鏈接。 – Joel

0

XNA沒有內置的方法來檢測印刷機與按下並保持;它只能告訴你,如果密鑰是目前被按下。

然後,您需要做的是存儲兩個KeyboardState-s,「舊」和「當前」。一旦你有這個,你可以檢測到按鍵開始時(old.isKeyDown == false && current.isKeyDown == true;)和結束時間(old.isKeyDown == true && current.isKeyDown == false;

所以一旦你有這個,當你記錄一個基於GameTime的「jumpStart」變量是一件簡單的事情檢測到按鍵,以及當你檢測到按鍵釋放時發現一個「jumpEnd」變量。

如果你希望根據按鍵被按下的時間長度來確定跳躍的持續時間,你可以通過設置增加一個上限,之後再按下該鍵不起作用

0

不是如果你正在尋找換句話說速度函數正在執行while你按住按鈕,但您可以同時使用stopwath來衡量

Stopwatch stopWatch = new Stopwatch(); 
if (keystate.IsKeyDown(Keys.W)) 
     { 
      velocity.Y = 3 - (time elapsed since start of jump); 
      stopWatch.Start(); 
     } 
if (keystate.IsKeyUp(Keys.W)) 
{ 
     stopWatch.Stop(); 
     TimeSpan ts = stopWatch.Elapsed; 

} 

更這裏

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

+0

這會觸發stopWatch.Start()每按一次鍵。這很重要嗎? (我不熟悉秒錶) –

+0

我相信新實例應該在每次按下時啓動,因此它可能是新的時間,但您可以隨時爲每次迭代提供時間 –

相關問題