0

基本的に、ゲームオーバー画面(および後で一時停止画面など)を実装しようとしています。現時点では、ゲーム オーバーを示す文字列を使用して画面を再描画するだけでこれを実行しようとしています。ゲーム オーバー画面にはテクスチャを使用していません。

また、キーボード入力を取得するのに苦労しているので、ゲームオーバーと言ったときに、キーが押されたときに(ENTERキーなど)実際にゲームを再開できるようにしたいのですが、XNAを使用すると、メニューのキーを押すと、処理が速すぎます (更新メソッドと描画メソッドが呼び出される回数が原因であると想定しています... たとえば、1 秒間に 60 回)。以上のことから、ゲーム オーバー画面でキーが押されてから、ゲームが実際に再起動して再描画されるまでにわずかな遅延が欲しいので、他のメニューにこれを実装できることを願っています。同様の質問をし続ける必要があるため、人々に休憩を与えます! :D笑

わかりましたので、私の状況に最も関連するコードは次のとおりです。

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

        spriteBatch.Begin();

        //if (userPlayer.Lives <= 0) //if hascollided is used here, it may change from true to false and vice versa, therefore the game over screen wont stay displayed and will revert back to the other screen when there isnt a coliison.

        if (inGameScreenShowing == true)
        {
            InGameScreen(spriteBatch, gameTime);
        }


        spriteBatch.DrawString(someText, "time?...: " + delay, new Vector2(screenWidth / 2, screenHeight / 6), Color.Pink);
            spriteBatch.End();

            base.Draw(gameTime);

    }


public void InGameScreen(SpriteBatch spriteBatch, GameTime gameTime)
    {
        if (userPlayer.Lives <=0)
        {
            if (inGameScreenShowing == true)
            {
                inGameScreenShowing = false;
                gameOverScreenShowing = true;
                GameOverScreen(spriteBatch, gameTime);
            }
        }

        if (gameOverScreenShowing == false)
        {
            userPlayer.Draw(spriteBatch);
            computerPlayer.Draw(spriteBatch);

            //spriteBatch.DrawString(someText, "Plyr&CompCrashed: " + playerCompHaveCollided, new Vector2(screenWidth - 300, 30), Color.Blue);
            spriteBatch.DrawString(someText, "Plyr Pos: " + userPlayer.Position, new Vector2(30, 30), Color.Red);
            spriteBatch.DrawString(someText, "Plyr Lives: " + userPlayer.Lives, new Vector2(screenWidth - 300, 30), Color.Orange);
            spriteBatch.DrawString(someText, "Plyr Score: " + userPlayer.Score, new Vector2(screenWidth - 300, 60), Color.LightBlue);
            spriteBatch.DrawString(someText, "Window Size: " + screenWidth + " , " + screenHeight, new Vector2(30, 60), Color.Purple);
        }
    }


public void GameOverScreen(SpriteBatch spriteBatch, GameTime gameTime)
    {

        if (gameOverScreenShowing == true)
        {
            spriteBatch.DrawString(someText, "Game Over", new Vector2(screenWidth / 2 - 30, screenHeight / 2), Color.Yellow);
        }

        if (lastKeyboardState == null && currentKeyboardState == null)
        {
            lastKeyboardState = currentKeyboardState = Keyboard.GetState();
        }
        else
        {
            if (currentKeyboardState.IsKeyDown(Keys.Enter) && lastKeyboardState.IsKeyUp(Keys.Space))
            {
                delay += dt;
                if (delay >= 1)
                {
                    gameOverScreenShowing = false;
                    inGameScreenShowing = true;
                    userPlayer.Lives = 3;
                    this.Draw(gameTime);
                    //InGameScreen(spriteBatch, gameTime);
                }
            }

        }

            lastKeyboardState = currentKeyboardState;
      }

これらのメソッドの一部のコードの一部がまったく意味をなさないことはわかっています。たとえば、遅延 +=dt などです...キーが押されてからゲームステートが実際に変更されるまでの間に遅延を導入しようとしていました...また、lastKeyboardState = currentKeyboardState はゲーム オーバー メソッドの別の場所にあるはずですが、かなり前にこのメソッドでこれを使用していたので、そのままにしておきました... :)

入力していただきありがとうございます(しゃれは意図していません)みんな:D

4

1 に答える 1