我試圖做一個跳躍機制在我的比賽,這將工作是這樣的:XNA:如何衡量一個按鍵被按下的時間量?
// velocity.Y是我想這個我想跳
if (keystate.IsKeyDown(Keys.W))
{
velocity.Y = 3 - (time elapsed since start of jump);
}
精靈的速度可能是一個簡單而優雅的解決方案,使我的精靈跳躍,但如果這是不可能的,只是這樣說,它回到了繪圖板。
我試圖做一個跳躍機制在我的比賽,這將工作是這樣的:XNA:如何衡量一個按鍵被按下的時間量?
// velocity.Y是我想這個我想跳
if (keystate.IsKeyDown(Keys.W))
{
velocity.Y = 3 - (time elapsed since start of jump);
}
精靈的速度可能是一個簡單而優雅的解決方案,使我的精靈跳躍,但如果這是不可能的,只是這樣說,它回到了繪圖板。
我建議不物理學所以直接連接到播放器的輸入,它不是一個非常可擴展的架構。
有一個接口定義物理屬性,如由角色對象實現的速度。當玩家按下向上鍵時,你應該檢查玩家是否在地上,如果他們然後設置他們的加速度向上移動。然後讓一個物理系統遍歷實體物理接口的每個對象的列表,在移動實體之前應用重力和其他力。通過這種方式,您可以爲遊戲中的每個實體使用相同的物理代碼。
我也建議不要將鍵盤輸入直接連接到播放器的移動。你可以有一個名爲'ICharacterController'的接口,它定義了一個'nextInstruction'方法,它返回'CharacterInstructions',它定義了字符可以採取的各種動作,比如跳躍和移動,這可以通過輸入類來實現。然後你的角色類持有對CharacterController的引用,所以它只是調用nextInstruction,這樣角色可以通過玩家輸入,AI或網絡通信控制,但仍然與玩家共享相同的行爲。
Game Coding Complete如果您認真對待遊戲編程,是一本很棒的書。
我也可以推薦Game Engine Architecture
當你使用XNA你應該考慮使用Game Components
感謝您的信息,很高興知道我是否可以更高效和我的方法專業。我會看看那本書。而且你肯定是對的,一個影響整個遊戲的物理系統在長遠看來會更有幫助,然後只是暫時的修正,讓玩家跳躍。 –
沒問題,我剛剛爲你添加了幾個鏈接。 – Joel
XNA沒有內置的方法來檢測印刷機與按下並保持;它只能告訴你,如果密鑰是目前被按下。
然後,您需要做的是存儲兩個KeyboardState-s,「舊」和「當前」。一旦你有這個,你可以檢測到按鍵開始時(old.isKeyDown == false && current.isKeyDown == true;
)和結束時間(old.isKeyDown == true && current.isKeyDown == false;
所以一旦你有這個,當你記錄一個基於GameTime的「jumpStart」變量是一件簡單的事情檢測到按鍵,以及當你檢測到按鍵釋放時發現一個「jumpEnd」變量。
如果你希望根據按鍵被按下的時間長度來確定跳躍的持續時間,你可以通過設置增加一個上限,之後再按下該鍵不起作用
不是如果你正在尋找換句話說速度函數正在執行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;
}
更這裏
這會觸發stopWatch.Start()每按一次鍵。這很重要嗎? (我不熟悉秒錶) –
我相信新實例應該在每次按下時啓動,因此它可能是新的時間,但您可以隨時爲每次迭代提供時間 –
給它最初的衝動,以及不斷增加的速度高達只要按下按鍵。當然,你添加的速度低於重力。無需計算時間或任何東西。除此之外,無論如何,速度或加速度總是與時間有關。 – LightStriker
你是什麼意思的初始衝動? –
最初的impusle是您按下跳轉鍵時的速度。基本上,你給速度= 10(向上),只是保持重力下降。就這樣,角色跳了起來。如果你想讓你在拿着鑰匙的時候跳到空中控制或者更大的範圍,你可以繼續增加一小部分向上的速度。 – LightStriker