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

假设你有一个继承了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") - 未将对象引用设置为对象的实例。” 在我的对象类LoadContent方法中。

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

好的,我已经意识到问题到底是什么。 我正在使用GameStateManagement Sample的逻辑,“由Xbox Indie Games的头部技术创建”,它本身就是精彩的代码......如果你只是在制作主菜单......大声笑...

但是,ScreenManager是DrawableGameComponent,其GameScreen的列表使其成为并说屏幕是游戏中唯一可用的东西。 或者可能只有屏幕是,并且当它们转换到屏幕管理器被调用时,唤醒,增加新的屏幕并再次进入睡眠。

因此,不允许你调用任何类,对象列表或其他类中包含的任何东西......

现在人们可能会认为,只需创建一个新的ScreenManager2 : DrawableGameComponent ,或者甚至可以创建一个ObjectManager : DrawableGameComponent .... Ahh ahhh,已经将您击败了它的朋友.....

创建一个新的ObjectManager允许你的对象被绘制在你的原始ScreenManager处理的所有东西上......真正的......包括你的PauseScreen和PauseMenu ....垃圾!

并且在提到ScreenManager2之前,还需要处理PauseScreen和PauseMenu。 我成功地操作了所有的代码,直到ScreenManager选择Play来告诉LoadingScreen运行,然后调用GamePlayScreen ...

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

这导致我正确地询问问题...

你如何调用一个类来初始化,只要足够长的时间以允许GamePlayScreen中的LoadContent收集所述类/对象信息,并将其放入其对象列表中?

雷曼的条款:“你的LoadContent函数上的GamePlayScreen,唤醒Object1.cs,在你的ObjectList中添加对象信息,告诉Object1.cs进入睡眠状态,GamePlayScreen继续你的糟糕自我......”


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

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


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

这就是说,为什么不通过ContentManager让任何类需要它而不是实例化新的?


由于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);

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

“这一切看起来都很简单,直到你需要弄清楚为止......”

链接地址: http://www.djcxy.com/p/95521.html

上一篇: Load object into another class's List XNA C#

下一篇: The dream to inherit from a struct in c#