0

我已经挣扎了很久。

我有一个名为Game1的主游戏类和一个名为myShowUp的DrawableGameComponent继承的ShowUp

通常的方法是将组件myShowUp添加到Game1对象中,使其成为游戏的一部分(直接在Game1的 Initialize 方法中),如下所示:

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);
    }

    ...
}

到目前为止,我找到了一个方法,我只保留第一个语法(即,将实例化保留到 Initialize 方法中)并在ShowUp类中定义一个名为activate的布尔值。如果激活是真的,我会执行指令来显示它,否则什么也不会。在我的Game对象的 Update 方法中,如果按下左按钮将激活的变量更改为 true,我会调用myShowUp的activate ( )

这种方法有效,但我不太满意,我希望它就像在代码中的任何位置实例化我的游戏对象中的对象以使其成为其中的一部分一样简单。有没有办法做到这一点?

就像是 :

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);
    }

    ...
}

这会很好。

4

1 回答 1

1

您的代码中有一个小错误。您将创建组件的多个实例 - 每次更新一个。这是因为在创建组件之前,您没有检查之前的鼠标状态是否ReleasedmyShowUp空。这是一些经过测试的工作代码(检查两个条件):

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);
}

当然 - 我不确定为什么这个错误会导致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分别针对该实例。

于 2013-02-08T10:20:03.957 回答