1

私のゲーム状態管理システムには、現在のゲームに追加されたスクリーン マネージャーとメニュースクリーンがあります。画面マネージャーはスプライトバッチを開き、サブスクライブされたすべての画面の描画メソッドを呼び出しますが、最初のサブスクライブ画面で最初の SpriteBatch.Draw 呼び出しに到達すると、SpriteBatch.Begin を事前に呼び出す必要があるというエラーが表示されます。そうだった。

ScreenManager 描画コード:

    public override void Draw(GameTime gameTime)
    {
        SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);

        for (int i = 0; i < ScreenList.Count; i++)
        {
            if (ScreenList[i].Visible)
                ScreenList[i].Draw(gameTime);
        }

        SpriteBatch.End();

        base.Draw(gameTime);
    }

そして私のMenuScreen描画コード:

    public override void Draw(GameTime gameTime)
    {
        SpriteBatch.Draw(Background, new Rectangle(0, 0, ScreenManager.Game.Window.ClientBounds.Width, ScreenManager.Game.Window.ClientBounds.Height),
                                                   null, Color.White, 0f, new Vector2(Background.Width / 2, Background.Height / 2), SpriteEffects.None, 1f);

        SpriteBatch.DrawString(Font, Text, Position, Color, 0f, Origin, Scale, SpriteEffects.None, 0f);

        foreach (MenuEntry entry in EntryList)
        {
            entry.Draw(gameTime);
        }
    }

最後に、ベース ゲームの初期化コードで、これらすべてのコンポーネントを作成します。

    protected override void Initialize()
    {
        screenManager = new ScreenManager(this, Content.Load<SpriteFont>("Fonts/DefaultFont"), Content.Load<Texture2D>("Images/Background"));
        Components.Add(screenManager);

        screenManager.AddScreen(new MainMenuScreen(screenManager, "Tanks", new Vector2(screenManager.Game.Window.ClientBounds.Width / 2, 100)));

        base.Initialize();
    }

注: MainMenuScreen は、抽象クラスである MenuScreen から継承します。また、MenuScreen クラスには ScreenManager クラスからスプライトバッチが渡されるため、同じスプライトバッチである必要があります。

4

0 に答える 0