Меню XNA не работает - PullRequest
0 голосов
/ 27 марта 2012

У меня проблема с логикой этого кода, метод обновления XNA - быстрый, поэтому, когда я пытаюсь увеличить значение на 1 каждый раз, когда нажимается кнопка «вниз» на клавиатуре, это приводит к обновлению более чем просто на 1

Посмотрите на код и посмотрите, сможете ли вы придумать лучший способ сделать это,

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

Это был метод обновления, а это метод Draw

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

Я думаю о другом способе сделать это, но это будет означать, что мне придется изменить весь код, так что взгляните на него и посмотрите, есть ли у вас лучший способ сделать это

Спасибо и С уважением, .....:)

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Вы, кажется, пытаетесь заставить определенные клавиши активироваться только один раз за нажатие.Для этого этот код:

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

должен быть переписан как:

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

Вам также следует подумать о том, чтобы поместить этот код, связанный с вводом, в его собственный класс.

0 голосов
/ 27 марта 2012
 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;
            }

Я добавил переменную с плавающей запятой, чтобы удерживать время, прошедшее с прошлого раза, если оно прошло 0,5 секунды, выполните команду и сбросьте

...