2017-05-17 82 views
-1

我正在研究一個C#遊戲,它將具有預定義的級別。我想要一個能夠保存所有級別的預定義數據的類。以下是我想要做的:一個類中的靜態預定義常量對象

public static GameLevel startLevel = new Level() { 
    startLevel.Actions.Add(action); 
    startLevel.Actions.Add(action); 
} 

依此類推。但是,似乎C#不希望我以這種方式進行初始化。我怎樣才能達到我想要的效果,而不會把它扔到一個龐大的構造函數?

回答

0

你怎麼想,如果我們改變靜態變量如下:

private static GameLevel _startLevel; 
public static GameLevel StartLevel 
{ 
    get 
    { 
     if(_startLevel == null) 
     { 
      _startLevel = new Level(); 
      _startLevel.Action.Add(action1); 
      _startLevel.Action.Add(action2); 
     } 

     return _startLevel; 
    } 
} 
0

「C#不希望我初始化這樣......」

您可以初始化這條路。你根本沒有正確的語法。這應該工作

public static Level startLevel = new Level() 
    { 
     Actions = new List<Action>() 
      { 
       new Action() {...}, 
       new Action() {...}  
      }, 
     OtherProprty = "Other" 
    }; 

注:這有下類範圍做

「大規模構造」 - 你平時不初始化靜態成員的構造函數,除非這是靜態構造函數。聽起來像你需要使用Singleton模式爲這件作品。然後再次,你在構造函數中調用所有需要的代碼,「巨大」或不。把它分解成方法。

0

既然你有預定義的水平,我建議一個不同的方法。

爲每個Level創建一個Level基類和一個類。每個關卡類的構造函數都可以設置Actions以及遊戲需要知道如何顯示自身的其他任何東西。

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     new GameState(new Level1()); 
     Console.WriteLine("Current level is " + GameState.CurrentLevel.Name); 
     Console.WriteLine("User leveled up"); 
     GameState.CurrentLevel = new Level2(); 
     Console.WriteLine("Current level is " + GameState.CurrentLevel.Name); 
    } 
} 

public class Level 
{ 
    public string Name; 
    // public static IEnumerable<Action> Actions { get; set; } 
} 

public class Level1 : Level 
{ 
    public Level1() 
    { 
     // level 1 init 
     Name = "1"; 
     // Actions = new List<Action> { ... } 
    } 
} 

public class Level2 : Level 
{ 
    public Level2() 
    { 
     // level 2 init 
     Name = "2"; 
    } 
} 

public class GameState 
{ 
    public static Level CurrentLevel { get; set; } 

    public GameState(Level startLevel) 
    { 
     CurrentLevel = startLevel; 
    } 
} 

工作副本:https://dotnetfiddle.net/qMxUbw