2010-04-14 62 views
2

我很親密!我使用的XNA遊戲狀態管理示例發現here並試圖修改它如何處理輸入,所以我可以延遲鍵/創建輸入緩衝區。延遲鍵盤輸入幫助

在GameplayScreen.cs我聲明瞭一個名爲雙和elapsedTime設置等於0

在HandleInput方法我已經改變了與Key.RIGHT按鈕按:

if (keyboardState.IsKeyDown(Keys.Left)) 
        movement.X -= 50; 

       if (keyboardState.IsKeyDown(Keys.Right)) 
       { 
        elapsedTime -= gameTime.ElapsedGameTime.TotalMilliseconds; 
        if (elapsedTime <= 0) 
        { 
         movement.X += 50; 
         elapsedTime = 10; 
        } 
       } 
       else 
       { 
        elapsedTime = 0; 
       } 

僞代碼:

如果如果它被按壓右箭頭鍵沒有按下設定elapsedTime爲0時,elapsedTime等於本身減去自上一幀的毫秒。如果差值等於0或更小,則移動對象50,然後將elapsedTime設置爲10(延遲)。

如果該鍵被按下elapsedTime應該永遠不會被通過,否則設置爲0。相反,在成功檢查後,elapsedTime設置爲10後,elapsedTime應該變得越來越低,因爲它將被TotalMilliseconds減去。當它達到0時,它再次成功通過檢查並再次移動對象。

的問題是,它每按移動對象一次,但如果你按住它不工作。任何人都可以提供任何類型的提示/示例/位知識對此?在此先感謝,它一直在讓我瘋狂。理論上我認爲這肯定會奏效。

澄清

想到一個網格,當你對我多麼希望塊移動的思維。它不是在屏幕上流暢地移動,而是沿着它的寬度(按順序跳躍)移動到下一個位置。如果我按住鍵,它會在屏幕上進行比賽。我想減慢整個過程,這樣按住鍵可以在「跳躍」/移動它的寬度之間創建一個X毫秒的延遲。

編輯:原來gameTime.ElapsedGameTime.TotalMilliseconds將返回0 ...所有的時間。我不知道爲什麼。

解決:發現了gameTime.ElapsedGameTime.TotalMilliseconds返航0 ...搬到別的地方。

回答

1

找到了gameTime.ElapsedGameTime.TotalMilliseconds返回0 ...在Update方法中使用了GameTime參數設置一個名爲GameT的公共雙變量。 GameT然後在HandleInput方法中使用並返回有效時間。不是最合法的方式,但它現在起作用。

0

所以問題是,你想要你的實體有什麼行爲?

  1. 如果你想要它,當你按下按鈕(就好像通過菜單移動)移動一次,然後要在KeyboardState存儲在一個類級別的變量,以便每次更新,你可以檢查它逆水州。如果該按鈕沒有保持在先前的狀態,而只是現在被保持,您只能移動。這可以確保您只會觸發一次動作。
  2. 如果你想讓它通過一定量的規律,平穩地移動(如,向右滾動,當你按下右箭頭),然後擴展您的運動參數(目前硬編碼爲50),(你可以調整)。所以像movement.X += 50 * .05;。您可以上下調整它,直到它所做的移動與您希望它移動的速度相匹配
+0

既不是。我有一個50像素寬的塊,我不想一次移動一個像素......我希望它每次移動它的寬度。問題是,如果我只按住鍵,它移動得非常快。我需要通過計時器來延遲輸入。使用類似.05的東西將無法正常工作=/ 我不想要選項1,因爲這意味着我必須每次按下按鍵。而選項2因爲我所做的第一個陳述而不起作用。 – Stradigos 2010-04-14 19:08:47

0

如果你使用固定的遊戲時間,你不必拖延時間。你可以保持跟蹤基於該「框架」和更新的變量:

int elapsedFrames = 10; //<- Set up somewhere higher than the function call 
if (keyboardState.IsKeyDown(Keys.Right)) 
{ 
    elapsedFrames++; 
    if (elapsedFrames >= 10) 
    { 
     movement.X += 50; 
     elapsedTime = 0; 
    } 
} 
else 
{ 
    elapsedTime = 10; 
} 

這樣,你不必應付gameTime。