稍后在XNA游戏中创建一个DrawableGameComponent的实例

时间:2013-02-07 10:05:43

标签: c# xna xna-4.0

我一直在苦苦思索。

我的主要游戏类名为 Game1 DrawableGameComponent - 已加载的 ShowUp 类名为 myShowUp

通常的方法是将 myShowUp 组件添加到 Game1 对象中,使其成为游戏的一部分(直接在 Game1 <的初始化方法中/ strong>)如下:

class Game1 : Microsoft.Xna.Framework.Game
{
    ShowUp myShowUp;

    ...

    protected override Initialize ()
    {
        this.myShowUp = new ShowUp(this);
        this.Components.Add(this.myShowUp);
    }
    ...
}

此方法确实有效, myShowUp 会在游戏中显示并成为一个独立的对象。

我想要的是稍后在游戏对象列表中实例化并添加对象(例如在窗口中单击后)

这是我的尝试:

class Game1 : Microsoft.Xna.Framework.Game
{
    MouseState myMouseState;

    ...

    ...

    protected override void Update(GameTime gameTime)
    {
        myMouseState = Mouse.GetState();

        if (myMouseState.LeftButton == ButtonState.Pressed)
        {
            this.myShowUp = new ShowUp(this);   // Nothing
            this.Components.Add(this.myShowUp); // Happens..
        }

        base.Update(gameTime);
    }

    ...
}

到目前为止我找到了一个方法,我只保留第一个语法(即将instanciation保留在Initialize方法中)并在名为激活的 ShowUp 类中定义一个布尔值 。 如果已激活为真,我会执行说明以显示它,或者不执行任何操作。 在我的游戏对象的更新方法中,如果按下我的左按钮更改激活,我会调用 myShowUp 激活() 变量为true。

这种方法有效,但我不太满意,我希望它只是简单地在代码中的任何地方实现我的 Game 对象中的对象,使它们成为它的一部分。 有没有办法让这种方式成为?

类似的东西:

class Game1 : Microsoft.Xna.Framework.Game
{
    ShowUp myShowUp;
    MouseState myMouseState;

    ...

    ...

    protected override Initialize ()
    {
        this.Components.Add(this.myShowUp);
    }

    ...

    protected override void Update(GameTime gameTime)
    {
        myMouseState = Mouse.GetState();

        if (myMouseState.LeftButton == ButtonState.Pressed)
        {
            this.myShowUp = new ShowUp(this);
        }

        base.Update(gameTime);
    }

    ...
}

这很不错。

1 个答案:

答案 0 :(得分:1)

您的代码中存在一个小错误。您将创建组件的多个实例 - 每个更新一个。这是因为在创建组件之前,您不会检查上一个鼠标状态是Released还是myShowUp为空。这是一些经过测试的工作代码(检查两种情况):

MouseState lastMouseState;

protected override void Update(GameTime gameTime)
{
    MouseState mouseState = Mouse.GetState();

    if(mouseState.LeftButton == ButtonState.Pressed
            && lastMouseState.LeftButton == ButtonState.Released
            && myShowUp == null)
    {
        Components.Add(myShowUp = new ShowUp(this));
    }

    lastMouseState = mouseState;

    base.Update(gameTime);
}

当然 - 我不确定为什么这个bug会导致ShowUp根本不显示 - 因为你正在创建它的多个实例 - 你希望能够看到它。您的ShowUp组件可能存在错误。

对于它的价值,这是我测试过的代码:

class ShowUp : DrawableGameComponent
{
    public ShowUp(Game game) : base(game) { }

    Texture2D texture;
    SpriteBatch sb;

    protected override void LoadContent()
    {
        sb = new SpriteBatch(GraphicsDevice);
        texture = this.Game.Content.Load<Texture2D>("test");
        base.LoadContent();
    }

    public override void Draw(GameTime gameTime)
    {
        sb.Begin();
        sb.Draw(texture, new Vector2(100), Color.White);
        sb.End();
        base.Draw(gameTime);
    }
}

请注意,在 Game.Initialize运行后添加组件将导致该组件的InitializeLoadContent方法在添加到该组件后立即运行Components集合。

请注意,为了您将来的参考,DrawableGameComponent已附带EnabledVisible属性,您可以分别跳过UpdateDraw那个例子。