2014-03-12 113 views
0

假设您有一个继承DrawableGameComponent的ScreenManager和一个继承GameScreen的GamePlayScreen。 GamePlayScreen通过ScreenManagers ContentManager绘制,其功能与Game1.cs一样。而其LoadContent样子:将对象加载到另一个类的列表中XNA C#

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 ....啊ahhh,已经击败你的朋友.....

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

并且在您提及ScreenManager2之前,它处理PauseScreen和PauseMenu,并尝试过。我成功地操作了所有的代码,直到ScreenManager选择Play来告诉LoadingScreen功能,然后调用GamePlayScreen ...

这导致Asik正确,我的内容是空的,因为我无法弄清楚方式为我的对象类/类被调用和初始化与此代码的工作方式。

导致我问正确的问题...

你怎么调用类初始化,只是足够长的时间让LoadContent在GamePlayScreen聚集说类/对象信息,将其放在其对象列表?

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

+0

感谢您的编辑说,我在“Not-so-Smart”手机上 –

回答

0

随着屏幕管理的复杂性,我发现没有办法直接从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); 

2天后KS之后,这次终于要解决了,我还引用自己:

“这一切看起来那么容易,直到你谁需要弄明白的一个......”

+0

我感谢你们试图帮助,这是非常感谢:-) –

0

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

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

+0

我不确定如何传递ContentManager。我模仿的对象类就像ScreenManager添加新的屏幕一样,这些类甚至没有Initialize方法。我认为调用Object.Add(new object());'只会复制对象信息的副本,除非它的确如​​此,并且您的意思是在复制之前需要初始化信息。好吧,我会尝试添加一个初始化方法到对象类。 –

+0

最简单的事情就是在你的Game类上创建一个公共静态属性“ContentManager”,并在启动时初始化它。然后每个其他类都通过Game.ContentManager进行访问。 – Asik

+0

是的,我认为它是因为所有的东西都在ScreenManager上运行,因为它继承了DrawableGameComponent。它的加载方法说'ContentManager内容= Game.Content;'。好吧,我会做一个静态的,并希望这不会干扰ScreenManagers shenanigans ... –

1

您正在使用GameComponentDrawableGameComponent。你的子类,从这些继承必须通过他们的GameComponent.Game特性(也就是说,如果你已经通过它进入它们的构造函数,而不是指定null访问Game实例。

这是一件好事。只要使用GameComponent。Game.Content访问。ContentManager每个

相关问题