假设您有一个继承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; ???
答案 0 :(得分:1)
您正在使用GameComponent
和DrawableGameComponent
。从这些子类继承的子类可以通过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;