XNA 2D Gamestate, перезапуск игры

Я работаю над игрой в XNA, и когда я запускаю игру, появляется всплывающее меню. Если вы нажмете «пробел», запустится сама игра. Для этого я использую переключатель состояния игры с тремя разными случаями. Хотя, когда я дохожу до последнего состояния (экран завершения игры) и хочу перезапустить игру, нажав «пробел», это не работает, если вы не УДЕРЖИВАЕТЕ «пробел».

Итак, в основном. Игра начинается с экрана меню. Если нажать пробел, запустится сама игра. Если вы столкнетесь с чем-либо и умрете, вы попадете на экран завершения игры. Я хочу, чтобы вы могли вернуться к запуску игры, если вы нажмете пробел, это не работает (если вы не удерживаете пробел и не держите его таким образом)

PS: я готов добавить больше кода, если это необходимо, просто попросите об этом. Заранее спасибо!

Вот мой код обновления:

const int introMenu = 0, gameRunning = 1, gameOver = 2;
switch (gameState)
         {
          case introMenu:
          if (ks.IsKeyDown(Keys.Space))
           {
             gameState = gameRunning;
           }
                break;
            case gameRunning:
                if(colliding)
                {
                        gameState = gameOver;
                }
                break;
            case gameOver:
                if (ks.IsKeyDown(Keys.Space))
                {
                    gameState = gameRunning;     //NOT WORKING!
                }
                break;
        }

Вот мой код отрисовки:

        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();
            switch (gameState) 
       {
        case introMenu:
        background.Draw(spriteBatch);  
        break;
            case gameRunning:
                //draw the player, new background and everything nessecary
                break;
            case gameOver:
                //draw new gameover background
                break;
        }
        spriteBatch.End();

        base.Draw(gameTime);

person user1775668    schedule 30.10.2012    source источник


Ответы (2)


Теперь у меня недостаточно, чтобы дать точный ответ, но если я угадаю, ваше colliding условие остается верным, а игровое состояние просто возвращается.

Как я сказал в своем комментарии, вы можете использовать отладчик, чтобы проверить, так ли это на самом деле.

Я также ожидаю, что вы повторно инициализируете игровые переменные до их исходного состояния, поэтому, когда вы начинаете игру снова, это похоже на то, как если бы вы запускали ее в первый раз (и убедитесь, что столкновение не верно)

person Sam I am says Reinstate Monica    schedule 30.10.2012
comment
Это 95% причин неправильного перезапуска. Убедитесь, что каждый раз, когда вы «перезапускаете» программу, вы сбрасываете все свои переменные. Чтобы устранить любые возможные ошибки, я бы порекомендовал сбросить их до того, что вы их инициализируете, как в первую очередь, чтобы в следующий раз игра видела все, как будто это действительно совершенно новое. - person Josh Bibb; 31.10.2012
comment
Да, я заметил это сейчас. Столкновение оставалось верным, и корабль продолжал сталкиваться снова и снова. Я установлю для него значение false и сброслю все переменные и посмотрю, как это сработает. Спасибо. - person user1775668; 31.10.2012
comment
Хотя, у меня возник вопрос. Должен ли я сбросить переменные вручную или есть более простой способ их повторной инициализации? - person user1775668; 31.10.2012
comment
Если бы это был я, id поместил большую часть базовой логики инициализации в метод, а затем снова вызвал бы этот метод при нажатии пробела. - person Sam I am says Reinstate Monica; 31.10.2012

Ответ выше и комментарий полностью верны. Чтобы решить эту отдельную проблему, просто измените свой код следующим образом:

if(colliding)
{
     colliding = false;  
     gameState = gameOver;
}

Проблема возникает из-за того, что при нажатии клавиши пробела после завершения игры состояние игры переключается на запуск, а затем мгновенно возвращается к экрану окончания игры, потому что столкновение все еще верно.

person Jesse Carter    schedule 30.10.2012
comment
Если вы сделаете это, убедитесь, что то, что вызвало установку colliding на true, не приведет к тому, что оно немедленно снова будет установлено на true, иначе цель будет потеряна. - person Sam I am says Reinstate Monica; 31.10.2012
comment
Хорошая точка зрения. Хотя я предполагал, что он устанавливается на основе обнаружения коллизий между некоторыми объектами, которые, надеюсь, будут сброшены при изменении состояния игры. - person Jesse Carter; 31.10.2012