2012-08-29 99 views
2

即時通訊使用Visual C#2010 express。我正在做一個遊戲,並且遇到了一個小小的新手問題。事情是,我想我們正在處理一個最佳實踐類型的情況,並且沒有一些我真正幫​​助過的初學者書籍,所以我希望你們可以。使用一個類來存儲遊戲數據,最佳實踐?

所以,我有兩種形式,一種是splashscreen /啓動形式,另一種是主遊戲窗口。我創建了一個包含所有世界數據的類,當用戶在第一個屏幕中單擊「新遊戲」時,會生成此類的新實例並使用數據填充。

到目前爲止這麼好。

新遊戲按鈕除了創建世界實例外,還打開了主遊戲窗口。問題是,在主遊戲窗口中,當我嘗試使用gameworld實例的屬性時,它說它不存在於此上下文中。

所以,如果我得到它的權利,創建的實例只存在於第一個窗體類...是否正確?所以如果我想要移動整個數據,我應該實際序列化並保存世界類實例數據,並將其加載到第二個表單中嗎?或者我應該如何解決這個問題。

我知道這是一個非常新手的問題,我可以推測它工作,但事情是 - 我真的覺得我必須理解我所做的一切。

在此先感謝!

回答

1

如果在啓動畫面中有世界數據對象的引用,您可以將其分配給主屏幕中的公共成員,或通過構造函數將其傳遞到主屏幕。

所以在啓動畫面

FrmMain frmMain = new FrmMain(); 
frmMain.WorldData = this.WorldData; 

如果是閃屏的實例成員

或可能像

FrmMain frmMain = new FrmMain(); 
frmMain.WorldData = new WorldData(); 

甚至

FrmMain frmMain = new FrmMain(this.WorldData); 

要麼

FrmMain frmMain = new FrmMain(new WorldData()); 

與FrmMain構造函數

public FrmMain(WorldData worldData) 
{ 
    this.m_WorldData = worldData; 
} 

看一看Passing Data Between Forms

+0

謝謝,我現在明白了。我必須在表單之間傳遞對象才能使用它。 – MikaV84

3

您需要在您的遊戲表單上創建一個構造函數,該構造函數接受您的世界類的實例並將其分配給相同類型的字段 - 該字段可供遊戲窗體方法訪問。

World world; 

// constructor 
public GameForm (World world) 
{ 
    this.world = world; 
} 

// Can now use `world` in all `GameForm` methods 

而是構造器注入的(正如我在我的例子已經證明),您可以使用property injection,雖然我喜歡好於前者(往往以確保正確的初始化 - 儘管你可能要檢查的null傳遞在)。

+0

也謝謝你回答。 – MikaV84

1

假設你只使用Windows窗體,而不是XNA或類似的框架,在世界上沒有的WinForms。

啓動形式:

void StartButton_Click(object sender, EventArgs e) 
{ 
    GameWorld gw = new GameWorld(); 
    // Initialize gw instance here 

    GameForm mainForm = new GameForm(gw); 
    mainForm.Show(); 
} 

和構造函數添加到遊戲形式:

public class GameForm 
{ 
    private GameWorld _gw; 
    public GameForm() 
    { 
     InitializeComponent(); 
    } 
    public GameForm(GameWorld gw) : this() 
    { 
     _gw = gw; 
    } 
} 

在這一點上,你可以在遊戲中使用的形式私有變量_gw。

此外,我建議通過構造函數傳遞GameWorld實例,而不是屬性,因爲該值對於窗體至關重要。通常,屬性可能更適合提供調整某些行爲的方法,並且任何構造函數參數都可以視爲強制對象按其應該的方式工作。 你也可以使默認的構造函數(沒有參數的)爲private。

0

根據數據的大小以及世界對象類是否可序列化,您可能會考慮緩存它。然後,只要需要,每個需要數據的表單都可以從緩存中獲取。