2017-09-06 109 views
0

我不理解如何在將代碼放入類定義時將對象添加到列表中。我正在使用C#。將對象添加到子類中的列表(C#)

我正在做一個平臺遊戲,並設置了一些東西,這樣遊戲中的每個對象,無論是玩家角色,敵人,移動平臺還是固定對象,都會繼承我的「StaticObject 「類(它本身繼承了」Sprite「類),根據它們的特定功能構建它。我想將所有對象(不管它們的類型)添加到列表中以幫助我檢查碰撞。

例如,繼承的一個序列是:精靈> StaticObject> MovingObject>字符> PlayerCharacter

我創建了一個「的GameInfo」級(和由靜態實例,使得它的屬性可以從任何地方在被訪問遊戲),並定義我的「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」類的構造函數(所有的遊戲對象繼承),我嘗試添加對象

然後正在建設中「的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」列表中,而無需在主遊戲代碼創建對象時明確添加每一個。我想要添加自動發生。

我在別處看到過類似的問題,但我無法找到答案。任何幫助,將不勝感激!謝謝! :)

+2

你的類'StaticObject'你沒有創建'GameInfo'的實例,所以它沒有任何東西可以添加到 –

+2

你的單例實現看起來有問題。 –

+0

而不是'GameInfo.gameInfo = this;'在CTOR中執行'public static GameInfo gameInfo {get;私人設置; } = new GameInfo();' – Fildor

回答

1

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

此外,你應該做的構造函數私有。儘管這樣做目前可以做到,但如果您打算進行更多的編碼,那麼將深入挖掘Singleton模式將會對您有所幫助。總之,設計模式總是值得一讀。

至於爲什麼它沒有工作:

你(嘗試)設置靜態參考構造函數的類(單例)實例。但是,當您嘗試訪問該靜態字段時,該構造函數尚未執行。它永遠不會被執行該代碼,除非你明確這樣做(你可以自CTOR公開以來)。

+0

我真的很想關注自己在設計層面製作遊戲。編碼是一種達到目的的手段。我可以選擇更簡單的路線,比如GameMaker,Unity或者虛幻引擎,但是我希望能夠更好地理解我的遊戲正在做什麼。感謝您的解釋,以及關於學習更多的建議。我會那樣做的! –

+1

這是一個很棒的態度!保持良好的工作和祝你好運。順便說一句,歡迎來到SO。 – Fildor

相關問題