2013-03-06 75 views
1

Errm ...讓我們看看...我的項目遇到的錯誤是......奇怪。

我正在做一個怪物訓練遊戲,當它進入戰鬥模式時,在進入戰鬥之前,一旦你按下控制鍵的左邊或右邊的按鍵,就會出現一個錯誤。

這個錯誤很簡單,例如,如果您按A(左側按鈕),當它允許您選擇要採取的操作時,遊戲會持續識別A按鈕是否仍然按下,即使它不是「噸。

這是導致該錯誤代碼:

c上奇怪的輸入錯誤#

public static int ChooseAction() 
    { 
     int choosen = 0; 
     Battle.CanAct = true; 
     Battle.ChoosenAction = -1; 
     while (Battle.ChoosenAction == -1) 
     { 
      if (Battle.KeyDelay == 0) 
      { 
       if (Procedures.ButtonPressed(Procedures.KeyCodes.KeyRight)) 
       { 
        Battle.KeyDelay = 64; 
        int a = Battle.SelectedAction; 
        a++; 
        if (a >= BattleActions.Length) 
        { 
         a -= BattleActions.Length; 
        } 
        Battle.SelectedAction = a; 
       } 
       else if (Procedures.ButtonPressed(Procedures.KeyCodes.KeyLeft)) 
       { 
        Battle.KeyDelay = 64; 
        int a = Battle.SelectedAction; 
        a--; 
        if (a < 0) 
        { 
         a += BattleActions.Length; 
        } 
        Battle.SelectedAction = a; 
       } 
       else if (Procedures.ButtonPressed(Procedures.KeyCodes.Action)) 
       { 
        Battle.ChoosenAction = Battle.SelectedAction; 
       } 
      } 
      if (KeyDelay != 0 && !Procedures.ButtonPressed(Procedures.KeyCodes.KeyRight) && !Procedures.ButtonPressed(Procedures.KeyCodes.KeyLeft)) 
      { 
       KeyDelay = 0; 
      } 
      if (Battle.KeyDelay > 0) 
      { 
       Battle.KeyDelay--; 
      } 
     } 
     choosen = Battle.ChoosenAction; 
     Battle.CanAct = false; 
     return choosen; 
    } 


我不知道這是否會幫助,但由於它是基於的修改maden上一個線程,運行腳本,官方腳本,這是在C#控制檯。
另外,ButtonPress過程在按下按鈕時返回,但每次調用它時都會創建一個新的布爾值。

任何可能導致錯誤的線索?

The Procedures.ButtonPress(KeyCodes)腳本。

public static bool ButtonPressed(KeyCodes buttonKey) 
{ 
    bool pressed = false; 

    switch (buttonKey) 
    { 
     case KeyCodes.MenuKey: 
      if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.M) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.Start)) 
       pressed = true; 
      break; 

     case KeyCodes.RunKey: 
      if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.LeftShift) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.RightShift) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.B)) 
       pressed = true; 
      break; 

     case KeyCodes.KeyUp: 
      if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.W) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Up) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.DPadUp)) 
       pressed = true; 
      break; 

     case KeyCodes.KeyDown: 
      if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.S) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Down) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.DPadDown)) 
       pressed = true; 
      break; 

     case KeyCodes.KeyLeft: 
      if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Left) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.DPadLeft)) 
       pressed = true; 
      break; 

     case KeyCodes.KeyRight: 
      if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.D) || Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Right) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.DPadRight)) 
       pressed = true; 
      break; 

     case KeyCodes.Action: 
      if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Enter) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.A)) 
       pressed = true; 
      break; 

     case KeyCodes.Return: 
      if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Escape) || GamePad.GetState(PlayerIndex.One).IsButtonDown(Microsoft.Xna.Framework.Input.Buttons.B)) 
       pressed = true; 
      break; 
    } 
    return pressed; 
} 
+0

怎麼樣,而不是(像我起初)後一個新聞,你利用按鈕上/下跌事件? 一旦鬆開按鈕 - 退出循環。 – Shenaniganz 2013-03-06 18:58:43

+0

我不認爲它會起作用,而且,玩家會覺得很煩人,按下按鈕來調試它,如果這樣做是解決方案,但肯定不是......而且,您的建議沒有做到,工作。 – Nakano15 2013-03-06 19:00:40

+0

我們可以得到Procedures.ButtonPressed的代碼嗎?也許錯誤在那裏。我們也可以使用另一種方法來檢查keydown並查看是否可以解決問題 – Gaspa79 2013-03-06 19:10:14

回答

0

下載XNA和建立的一切(是的,我在工作無聊),我試過一個簡單的菜單上的代碼,它完美的作品。

問題是,由於某種原因XNA的輸入是不可線程化的。當我使用輸入創建另一個線程時,它根本不起作用。我嘗試了各種各樣的按鍵,但沒有一個按鍵被按下,而是一個按下的字母「R」,它保持這種狀態。

我也試着用R來保存原始的鍵盤狀態,一旦狀態改變,使用原來的比較如果R被按下,它的工作。然而,你只會知道R被按下了,你不知道它是否被再次按下。

做的一切,我用Google搜索,我發現建議要經常檢查上的更新方法,你的主線程的輸入

希望這有助於=)

+1

哇,這是意想不到的。順便說一句,我將不得不找到一種使用非線程方式來檢查輸入的方法。感謝您的幫助。 – Nakano15 2013-03-06 19:38:13

+1

好了,在繪製腳本上修正了不在線程中的錯誤,我添加了控制腳本,現在唯一的問題是fps太極端了,菜單切換太快了,但是這個我可以處理,再次感謝您的幫助。 – Nakano15 2013-03-06 19:48:06

+0

沒問題!很高興我能幫忙=)。這對我來說也是意外的。你可能知道這一點,但你可以限制Gametime類的具體事情。檢查遊戲時間的增量,如果它太小,您可以忽略輸入操作。 – Gaspa79 2013-03-06 19:52:51