将对象加载到另一个类';s列表XNA C#

将对象加载到另一个类';s列表XNA C#,xna,Xna,假设您有一个ScreenManager继承DrawableGameComponent,还有一个GamePlayScreen继承GameScreen。GamePlayScreen是通过ScreenManagers ContentManager绘制的,其功能与Game1.cs一样。其加载内容如下所示: public override void LoadContent() if (content == null) content = new ContentManager(ScreenManager.

假设您有一个ScreenManager继承DrawableGameComponent,还有一个GamePlayScreen继承GameScreen。GamePlayScreen是通过ScreenManagers ContentManager绘制的,其功能与Game1.cs一样。其加载内容如下所示:

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(“-”)。。。我得到了一个错误:

“content=newcontentmanager(ScreenManager.Game.Services,“content”)
-对象引用未设置为对象的实例。”在我的对象类LoadContent方法中

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

好的,我已经意识到问题的症结所在。我使用的是GameStateManagement示例的逻辑,“由Xbox Indie Games的首席技术人员创建”,它本身就是一个出色的代码。。。如果你只是做一个主菜单。。。哈哈

但是,ScreenManager是DrawableGameComponent,它的GameScreen列表使其成为游戏中唯一的功能部件。或者可能只有屏幕是,当它们转换为关闭屏幕管理器时,被调用,醒来,添加新屏幕并再次进入睡眠

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

现在人们可能会想,只需创建一个新的
ScreenManager2:DrawableGameComponent
,甚至可能创建一个
ObjectManager:DrawableGameComponent
。。。。啊啊啊啊,已经打败你了,朋友

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

在你提到ScreenManager2之前,为了处理PauseScreen和PauseMenu,你也试过了。我成功地操纵了所有的代码,直到ScreenManager选择Play,让LoadingScreen运行,然后调用GamePlayScreen

这导致Asik是正确的,我的内容是空的,因为我无法找到一种方法来调用和初始化我的对象类

这让我正确地提出了这个问题

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

Lehman的术语:“LoadContent函数上的GamePlayScreen,唤醒Object1.cs,在ObjectList中添加对象信息,告诉Object1.cs睡眠,GamePlayScreen继续你的坏自我……”?

“对象引用未设置为对象的实例”是一个
NullReferenceException
:它表示您试图从当前为null的变量访问某些内容。在你发布的那条线上,我看到了两种可能性:要么
ScreenManager.Game
为空,要么
ScreenManager.Game.Services
为空。为什么?因为在调用此行时,您没有初始化它们


也就是说,为什么不将
ContentManager
传递给任何需要它的类,而不是实例化新的类呢?

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


这很好。只需使用GameComponent。要访问每个中的
ContentManager

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

在Object1类中

Texture2D image;

public Object1(Texture2D texture)
{
  this.image = texture;
  //other information...
}
尽管从未在objects类中声明过SpriteBatch,但我能够调用:

public override void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(image, Rectangle, Color.White);
}
在GamePlayScreen的加载内容中:

Texture2D tempImage = content.Load...
objectList.Add(new Object1(tempImage));
然后在GamePlayScreen的Draw函数中调用GameTime,我调用:

foreach (Objects object in objectList)
    object.Draw(spriteBatch);
两周后,问题终于解决了……我引用自己的话:


“这一切看起来都很简单,直到你成为需要解决的人……”

谢谢你编辑,我的答案是“不太聪明”Phone我不知道如何传递ContentManager。我模拟的对象类就像ScreenManager添加新屏幕一样,这些类甚至没有初始化方法。我想调用
Objects.Add(new object());
将只复制对象信息,除非它这样做,您的意思是在复制之前需要初始化信息。好的,我将尝试向对象类添加一个初始化方法。最简单的方法是创建一个公共静态属性“ContentManager”在游戏类上,并在启动时对其进行初始化。然后其他所有类都可以通过Game.ContentManager进行访问。是的,我认为这是因为所有内容都运行在ScreenManager上,因为它继承了DrawableGameComponent。其加载方法是
ContentManager content=Game.content;
。好的,我将创建一个静态类,希望不会干扰屏幕管理器的诡计…您将如何准确地在Game1.cs中写出静态属性?我的8次尝试都是徒劳的
public static ContentManager GlobalContentManager;
-名称必须与类型名称不同。感谢大家的帮助,非常感谢:-)