0

私はxnaでペナルティシャウトゲームをプログラミングしています。私の質問は、1つのゴールだけを数えて、ゴールメッセージの時間を与えるにはどうすればよいですか??、

私はすでにゴールキーパー、ゴール、ゴールエリアの衝突を解決し、キープして得点しましたが、ボールがゴールエリアに触れたとき、ボールがゴールエリアに触れたときにスコアは常に増加します。ゴールメッセージを表示しますか?

これは私がこれまでに持っているものです、私は遅れについて考えますが、それは機能していません、私がこれで立ち往生しているのを助けてください

 if (_gameState == GameState.Playing)
         {

             if (CollideGoalArea())
             {
                 if (CollideGoalKeeper())
                 {
                     _messageToDisplay = "Goalie defends the goal!";
                     this.Window.Title = "Missed!";
                     _gameState = GameState.Message;
                 }
                 else
                 {
                     score++;
                     _messageToDisplay = "GOAL!";

                     this.Window.Title = "Goal!";

                     _gameState = GameState.Message;
                 }
             }
             else
             {
                 _messageToDisplay = "You missed the goal.";
                 _gameState = GameState.Message;
             }



         }
         else if (_gameState == GameState.Message)
         {

             if (Mouse.GetState().RightButton == ButtonState.Pressed)
             { // right click to continue playing
                 _gameState = GameState.Playing;
                 balonpos.X = 300;
                 balonpos.Y = 350;

             }

         }
4

1 に答える 1

3

scoreボールがゴール内にあることを検出するとコードがインクリメントするため、問題が発生しています。(デフォルトでUpdateは)毎秒60回呼び出されるため、ボールがゴール内にある場合、スコアは毎秒60ずつ増加します。

ゲームが2つの状態になるようにコードを書き直すことができます。メッセージ状態の表示と再生状態:

enum GameState
{
    Playing,
    Message
}

GameState _gameState = GameState.Playing;

String _messageToDisplay = "";
int _score = 0;

protected override void Update(GameTime gameTime)
{
    if(_gameState == GameState.Playing)
    {
        if(CollideGoalArea())
        {
            if(CollideGoalkeeper())
            {
                _messageToDisplay = "Goalie defends the goal!";
                _gameState = GameState.Message;
            }
            else
            {
                _messageToDisplay = "GOAL!";
                score++;
                _gameState = GameState.Message;
            }
        }
        else
        {
            _messageToDisplay = "You missed the goal.";
            _gameState = GameState.Message;
        }
    }
    else if(_gameState == GameState.Message)
    {
        if(Mouse.GetState().RightButton == ButtonState.Pressed) // right click to continue playing
             _gameState = GameState.Playing;

        //you should also reset your ball position here
    }
}

このように、ボールがゴールエリアに入るときはいつでも、それはゴールキーパーにスコア、ミス、またはヒットのいずれかになります。その後、ゲームは即座に状態を変更し、マウスで右クリックするまでこれらの条件が再度チェックされないようにします。

また、入力検出ロジックとボールおよびゴールキーパーの位置更新ロジックをこれらの中に配置することもできます(メッセージが表示されている間、プレーヤーが別のボールを撃つことができないようにする場合があります)。

于 2012-04-26T05:33:23.493 に答える