2012-03-27 5 views
0

このコードのロジックに問題があります.XNAのアップデート方法は、キーボードのダウンボタンが押されるたびに値を1ずつ変更しようとすると高速になります。これはドローが 方法XNAメニューが機能しない

で更新方法だった
 public void Update(GameTime gameTime) 
    { 
     var now = Keyboard.GetState(); 

     KeyboardState old = Keyboard.GetState(); 

     if (now.IsKeyDown(Keys.Down) && !old.IsKeyUp(Keys.Down)) 
     { 
      properties.Menuposition++; 
     } 
     else if (now.IsKeyDown(Keys.Up) && !old.IsKeyUp(Keys.Up)) 
     { 
      properties.Menuposition--; 
     } 
     else if (now.IsKeyDown(Keys.Enter)) 
     { 
      properties.Menuposition = 5; 
     } 
     old = now; 
    } 

と、

1は、コードを見てください、あなたはそれを行うには良い方法を考えることができるかどうかだけでより多くの

 public void Draw(GameTime gametime, SpriteBatch spriteBatch) 
    { 
     if(properties.Menuposition == 0) 
     { 
      spriteBatch.DrawString(properties.Font, properties.Menu[0], properties.Playpos, Color.White); 
      spriteBatch.DrawString(properties.Font, properties.Menu[1], properties.Highscorepos, Color.White); 
      spriteBatch.DrawString(properties.Font, properties.Menu[2], properties.Exitpos, Color.White); 
     } 


     int menueitem = 0; 
     Vector2 play = new Vector2(320,117); 
     Vector2 highscore = new Vector2(320, 151); 
     Vector2 Exit = new Vector2(320,180); 

     spriteBatch.DrawString(properties.Font, properties.Menuposition.ToString(),new Vector2(100,100),Color.White); 

     if(properties.Menuposition == 1) 
     { 
      spriteBatch.DrawString(properties.Font, properties.Menu[0], play, Color.Yellow); 
      spriteBatch.DrawString(properties.Font, properties.Menu[1], highscore, Color.White); 
      spriteBatch.DrawString(properties.Font, properties.Menu[2], Exit, Color.White); 
      numberoftime = true; 
      menueitem = 1; 
     } 
     else if(properties.Menuposition == 2) 
     { 
      spriteBatch.DrawString(properties.Font, properties.Menu[0], play, Color.White); 
      spriteBatch.DrawString(properties.Font, properties.Menu[1], highscore, Color.Yellow); 
      spriteBatch.DrawString(properties.Font, properties.Menu[2], Exit, Color.White); 
      numberoftime = true; 
      menueitem = 2; 
     } 
     else if(properties.Menuposition == 3) 
     { 

      spriteBatch.DrawString(properties.Font, properties.Menu[0], play, Color.White); 
      spriteBatch.DrawString(properties.Font, properties.Menu[1], highscore, Color.White); 
      spriteBatch.DrawString(properties.Font, properties.Menu[2], Exit, Color.Yellow); 
      numberoftime = true; 
      menueitem = 3; 
     } 

私はそれを行うための別の方法のヒンクが、私はすべてのコードを変更する必要がありますので、それを見て、あなたがこれを行うより良い方法があるかどうかを参照することを意味するでしょう

ありがとう、よろしく、ご協力ありがとうございます ..... :)それは0.5秒を経過した場合、私は最後の時間からの経過時間を保持する変数floatを追加

答えて

0
private float timeSinceLastPush = 0; 
    public void Update(GameTime gameTime) 
     { 
       var now = Keyboard.GetState(); 
      timeSinceLastPush +=(float)gameTime.ElapsedGameTime.TotalSeconds; 

      KeyboardState old = Keyboard.GetState(); 

     if (now.IsKeyDown(Keys.Down) && !old.IsKeyUp(Keys.Down)&& timeSinceLastPush >0.5) 
      { 
        properties.Menuposition++; 
        timeSinceLastPush = 0; 

       } 
      else if (now.IsKeyDown(Keys.Up) && !old.IsKeyUp(Keys.Up)&& timeSinceLastPush >0.5) 
       { 
        properties.Menuposition--; 
        timeSinceLastPush = 0; 
       } 
       else if (now.IsKeyDown(Keys.Enter)&& timeSinceLastPush >0.5) 
       { 
        properties.Menuposition = 5; 
        timeSinceLastPush = 0; 
       } 
       old = now; 
      } 

はCOMANDを行うと

1

をリセットあなたは一度だけアクティブにするために特定のキーを取得しようとしているように見えますプレスごとに。これを行うには、このコード:あなたはまた、独自のクラスには、この入力関連のコードを置くことについて考えなければならない

private KeyboardState now; // suggest rename to something like mCurrentKeyboardState 
private KeyboardState old; // suggest rename to something like mLastKeyboardState 

... 

public void Update(GameTime gameTime) 
{ 
    old = now; 
    now = Keyboard.GetState(); 
    ... 

public void Update(GameTime gameTime) 
{ 
    var now = Keyboard.GetState(); 
    KeyboardState old = Keyboard.GetState(); 

はのように書き換えされなければなりません。

関連する問題