将对象加载到另一个类的列表中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继续你的糟糕自我......”
您正在使用GameComponent
和DrawableGameComponent
。 从这些继承的子类可以通过它们的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