1

在我的游戏状态管理系统中,我有一个屏幕管理器和一个菜单屏幕,它们都添加到我当前的游戏中。屏幕管理器打开一个 spritebatch,然后调用所有订阅屏幕的绘制方法,但是当我在我的第一个订阅屏幕中进行第一个 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 类中传递了一个 spritebatch,因此它们应该是相同的 spriteBatch。

4

0 回答 0