2013-12-08 4 views
1

Так что я использую Gamestates в своей игре, и у меня ошибка при достижении игры или выигрыш экрана. Я попытался закодировать его так, что, когда вы нажимаете M, он возвращается в исходное главное меню, чтобы вы могли снова начать воспроизведение.
Однако при нажатии M игра кажется ошибкой, и главное меню постоянно мигает, и когда она останавливается, вы нажимаете кнопку воспроизведения, и она возвращает вас на экран игры или выигрыша! Я пробовал отлаживать его, но безрезультатно. Я попробую добавить соответствующий код ниже.Gamestates, вызывающий ошибку в моей игре

В Update:

switch (CurrentGameState) 
{ 
    case GameState.MainMenu: 
     if (btnPlay.isClicked == true) CurrentGameState = GameState.Playing; 
     btnPlay.Update(mouse); 

     if (btnInstructions.isClicked == true) CurrentGameState = GameState.Instructions; 
     btnInstructions.Update(mouse); 
     break; 

    case GameState.Instructions: 
     if (instrPlay.isClicked == true) CurrentGameState = GameState.Playing; 
     instrPlay.Update(mouse); 
     break; 

    case GameState.Playing:  
     //functions for game playing here 

     #region game over 
     if (hastouched2 > 0 && Ball.ballPos.Y > 740 || hastouched3 > 0 && Ball.ballPos.Y > 740 || Box == null && Ball.ballPos.Y > 740) 
      CurrentGameState = GameState.Gameover; 

     #endregion 
     break; 

    case GameState.Gameover: 
     if (Keyboard.GetState().IsKeyDown(Keys.M)) 
      CurrentGameState = GameState.MainMenu;    
     break; 

    case GameState.YouWin: 
     if (Keyboard.GetState().IsKeyDown(Keys.M)) 
      CurrentGameState = GameState.MainMenu; 
     break; 
} 

base.Update(gameTime); 

В розыгрыше:

protected override void Draw(GameTime gameTime) 
{ 
    GraphicsDevice.Clear(Color.Black); 

    spriteBatch.Begin(); 
    switch (CurrentGameState) 
    { 
     case GameState.MainMenu: 
      spriteBatch.Draw(Content.Load<Texture2D>("mainMenu"), new Rectangle(0, 0, screenWidth, screenHeight), Color.White); 
      btnPlay.Draw(spriteBatch); 
      btnInstructions.Draw(spriteBatch); 
      break; 

     case GameState.Instructions: 
      spriteBatch.Draw(Content.Load<Texture2D>("instructions_screen"), new Rectangle(0, 0, screenWidth, screenHeight), Color.White); 
      instrPlay.Draw(spriteBatch); 
      break; 

     case GameState.Playing: 
      spriteBatch.Draw(background, bgPos, Color.White); 
      if (Box != null) 
      { 
       Box.Draw(spriteBatch); 
      } 

      if (Box2 != null) 
      { 
       Box2.Draw(spriteBatch); 
      } 

      if (Box3 != null) 
      { 
       Box3.Draw(spriteBatch); 
      } 
      break; 

     case GameState.Gameover: 
      spriteBatch.Draw(Content.Load<Texture2D>("gameover"), new Rectangle(0, 0, screenWidth, screenHeight), Color.White); 
      break; 

     case GameState.YouWin: 
      spriteBatch.Draw(Content.Load<Texture2D>("youwin"), new Rectangle(0, 0, screenWidth, screenHeight), Color.White); 
      break; 

Спасибо, Rich

+0

Прежде всего, если у вас есть проблема, попробуйте опубликовать соответствующий код, а не ссылку на весь ваш проект, вы должны приложить все усилия. И что вы подразумеваете под «сбросом нулевых объектов»? Если они вам понадобятся, вы можете создать новый экземпляр. – pinckerman

+0

В любом случае, если игра вернет вас к экрану игры или выиграть при перезагрузке, вы, вероятно, не настроите игру для игр на что-то другое, кроме «Gameover» или что-то еще. Вы должны добавить код, который вы используете для перезапуска игры. – pinckerman

+0

попытается добавить соответствующий код сейчас – Rich

ответ

0

Эта вещь

if (hastouched2 > 0 && Ball.ballPos.Y > 740 || hastouched3 > 0 && Ball.ballPos.Y > 740 || Box == null && Ball.ballPos.Y > 740) 

запускает GameOver.

Но когда вы установили GameState.Playing, вы должны сбросить все переменные и Ball.ballPos, или вы вернетесь в состояние игры. То же самое происходит с GameState.YouWin.

+0

Хорошо, спасибо, я попробую - мне нужно сбросить все объекты, которые были обнулены? (Если это так, просто повторите его?) Еще раз приветствую – Rich

+0

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

+0

Любая идея, если есть более простой способ «перезапустить игру» или сбросить переменные. Я пытаюсь сбросить каждую переменную в GameOver и YouWin gamestates, однако мне трудно найти каждую отдельную переменную, а затем найти ее исходное состояние и установить ее ..? – Rich

Смежные вопросы