从子类中将对象添加到列表 (C#)

Adding objects to a list from within a subclass (C#)

当我将代码放入 class 定义时,我不明白如何将对象添加到列表中。我正在使用 C#。

我正在制作一款平台游戏并进行了设置,以便游戏中的每个对象,无论是玩家角色、敌人、移动平台还是静止对象,都继承了我的 "StaticObject" class(它本身继承了一个 "Sprite" class),根据它们的具体功能建立在这个之上。我想将所有对象(无论其类型如何)添加到列表中以帮助我检查碰撞。

例如继承顺序为:Sprite > StaticObject > MovingObject > Character > PlayerCharacter

我创建了一个 "GameInfo" class(并制作了一个静态实例,以便可以从游戏中的任何地方访问它的属性)并在其中定义了我的 "gameObjects" 列表:

class GameInfo
    {
        public static GameInfo gameInfo { get; private set; }
        public List<StaticObject> gameObjects { get; set; }

        public GameInfo()
        {
            GameInfo.gameInfo = this;
            gameObjects = new List<StaticObject>();
        }
    }

然后在我的"StaticObject"class(所有游戏对象继承)的构造函数中,我尝试将正在构造的对象添加到"GameInfo"中的列表中:

class StaticObject : Sprite
    {
        public StaticObject(Texture2D texture, Vector2 position, SpriteBatch spriteBatch) : base(texture, position, spriteBatch)
        {
            GameInfo.gameInfo.gameObjects.Add(this);
        }

        public override void Update(GameTime gameTime)
        {
            // Collision code.

            base.Update(gameTime);
        }
    }

这不起作用,我收到错误消息:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

我不知道如何在创建每个对象时将它们添加到我的 "gameObjects" 列表中,而不必在主游戏代码创建对象时显式添加每个对象。我希望自动添加。

我在其他地方看到过类似的问题,但我想不出答案。对此的任何帮助将不胜感激!谢谢! :)

而不是 GameInfo.gameInfo = this; 在 CTOR 中做 public static GameInfo gameInfo { get; private set; } = new GameInfo();

此外,您应该将构造函数设为私有。

虽然这暂时可行,但如果您打算进行更多编码,那么深入研究单例模式将对您有所帮助。当然,总体而言,设计模式总是值得一读。

至于为什么它没有起作用:

您(试图)在构造函数中设置对 class 的(单例)实例的静态引用。但是当您尝试访问该静态字段时,构造函数尚未执行。它永远不会用该代码执行,除非你明确地这样做(你可以这样做,因为 CTOR 是 public)。