我一直在苦苦思索。
我的主要游戏类名为 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);
}
...
}
这很不错。
答案 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
运行后添加组件将导致该组件的Initialize
和LoadContent
方法在添加到该组件后立即运行Components
集合。
请注意,为了您将来的参考,DrawableGameComponent
已附带Enabled
和Visible
属性,您可以分别跳过Update
和Draw
那个例子。