将对象加载到另一个类的列表XNA C#中

时间:2014-03-12 21:25:35

标签: xna

假设您有一个继承DrawableGameComponent的ScreenManager,以及一个继承GameScreen的GamePlayScreen。 GamePlayScreen是通过ScreenManagers ContentManager绘制的,其功能就像Game1.cs一样。它的LoadContent看起来像:

public override void LoadContent()

if (content == null)
content = new ContentManager(ScreenManager.Game.Services, "Content")

foreach (Objects object in objects)
   object.LoadContent();

对象类调用相同的LoadContent方法,但当然会说object = content.Load<Texture2D>(" - "); ...我收到错误:

"content = new ContentManager(ScreenManager.Game.Services, "Content") - 未将对象引用设置为对象的实例。&#34;在我的对象类LoadContent方法。

有没有办法从对象类调用GamePlayScreen的内容或ContentManager? +++++++++++++++++++++++

好的,我已经意识到问题到底是什么。我正在使用GameStateManagement Sample的逻辑,&#34;由Xbox Indie Games&#34;的头脑技术创建,这本身就是精彩的代码...如果您正在做的事情正在制作一个主菜单...大笑......

但是,ScreenManager是DrawableGameComponent,它的GameScreen列表使得它和屏幕显示游戏中唯一正常运行的东西。或者可能只有屏幕,当它们调用ScreenManager时,会唤醒,添加新屏幕并再次进入睡眠状态。

因此,不允许您调用任何类,对象列表或其他类中包含的任何内容......

现在有人可能会想,只是创建一个新的ScreenManager2 : DrawableGameComponent,或者甚至是ObjectManager : DrawableGameComponent ......啊啊啊啊,已经打败了你的朋友......

创建一个新的ObjectManager允许您的对象被绘制在原始ScreenManager处理的所有内容上......真实; ...包括您的PauseScreen和PauseMenu ....垃圾!

在你提到一个用于处理PauseScreen和PauseMenu的ScreenManager2之前,也试过了。我成功地操作了所有代码,直到PlayManager被选为ScreenManager告诉LoadingScreen运行,然后调用GamePlayScreen ......

这导致Asik正确,我的内容是Null,因为我无法找到一种方法来调用我的对象类/类,并使用此代码的工作方式进行初始化。

这导致我正确地提出问题......

如何调用一个类来初始化,只要足够长的时间允许GamePlayScreen中的LoadContent收集所说的类/对象信息,放在它的对象列表中?

Lehman的术语:&#34;你的LoadContent函数上的GamePlayScreen,唤醒Object1.cs,在你的ObjectList中添加对象信息,告诉Object1.cs睡觉,GamePlayScreen继续你的坏自我...... &#34; ???

3 个答案:

答案 0 :(得分:1)

您正在使用GameComponentDrawableGameComponent。从这些子类继承的子类可以通过Game属性访问GameComponent.Game实例(也就是说,如果您已将其传递给构造函数而不是指定null

这很好。只需使用GameComponent。Game.Content即可访问每个ContentManager

答案 1 :(得分:0)

“未将对象引用设置为对象的实例”是NullReferenceException:这意味着您正在尝试从当前为null的变量访问某些内容。在您发布的行上,我看到两种可能性:ScreenManager.Game为空,或ScreenManager.Game.Services为空。为什么?因为在调用此行时您没有初始化它们。

那就是说,为什么不通过ContentManager任何类需要它而不是实例化新的?{/ p>

答案 2 :(得分:0)

由于ScreenManager的复杂性,我发现无法直接从Object1类加载内容,但是我能够调用旧的对象处理形式:

在Object1类中......

Texture2D image;

public Object1(Texture2D texture)
{
  this.image = texture;
  //other information...
}

即使SpriteBatch从未在对象类中声明,我也可以调用:

public override void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(image, Rectangle, Color.White);
}

在GamePlayScreen的LoadContent:

Texture2D tempImage = content.Load...
objectList.Add(new Object1(tempImage));

然后在GamePlayScreen的Draw函数中调用了GameTime,我打电话给:

foreach (Objects object in objectList)
    object.Draw(spriteBatch);

两周后,终于解决了......我自己引用了:

&#34;这一切看起来都很简单,直到你成为那个需要弄明白的人......&#34;