2012-03-27 14 views
0

Ich habe ein Problem mit der Logik dieses Codes, XNAs Update-Methode ist zu schnell, also wenn ich versuche, den Wert um 1 jedes Mal, wenn die Ab-Taste auf der Tastatur gedrückt wird, endet es update ein mehr als nur um 1XNA-Menü funktioniert nicht

einen Blick auf den Code und sehen, ob Sie einen besseren Weg denken kann, es zu tun,

 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; 
    } 

, dass das Update-Methode war und dies ist der Draw-Methode

 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; 
     } 

Ich bin t einen anderen Weg zu tun, aber es würde bedeuten, dass ich den ganzen Code ändern müsste, also sieh es dir an und sieh nach, ob du einen besseren Weg dazu hast

Danke und Grüße, ..... :)

Antwort

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; 
      } 

ich habe eine Variable float die Zeit seit dem letzten Mal vergangen zu halten, wenn sie 0,5 Sekunden, um die comand tun bestanden hat und zurückgesetzt

1

Sie scheinen nur einmal zu versuchen, bestimmte Tasten zu erhalten, aktivieren pro Presse. Um das zu tun, dieser Code:

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

Sollte neu geschrieben werden als:

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(); 
    ... 

Sie sollten auch über das Setzen dieses Eingangs bezogenen Code in eine eigene Klasse denken.

Verwandte Themen