2013-12-16 21 views
2

我正在用一個菜單打開遊戲,每個級別都會打開新的表單。當你完成一個關卡時,它應該通過一個消息框(它確實)祝賀你,然後在不同的菜單表單上啓用下一關的按鈕。所以我訪問了設計師,並將按鈕公開並嘗試:如何通過不同的表單啓用表單上的按鈕?

new LevelMenu().button2.Enabled = true; 

但是這並不奏效。 我也試着這樣做:

public event Action levelCompleted; 
//then down lower i did (after it is declared that you won the level): 
if (levelCompleted != null) 
    levelCompleted(); 
W1L1.levelCompleted +=() => LevelMenu.button2.Enabled = true; 

但是,這給我的錯誤: 的對象引用需要非靜態字段,方法或屬性「The_Levels.W1L1.levelCompleted」

的我正在使用的形式是「W1L1」,而「LevelMenu」是菜單形式。在此先感謝

+0

而不是W1L1.levelCompleted + =()=> LevelMenu.button2.Enabled = true;嘗試公共事件Action levelCompleted =()=> LevelMenu.button2.Enabled = true; (不含+)。它有效嗎? – Vinicius

+0

刪除最後一行,並如先前評論所示,初始化「levelCompleted」。 – Vinicius

回答

0

您基本上需要參考您的實例LevelMenu。 所以當你創建你的「W1L1」表格時,你可能只需將LevelMenu傳遞給它。

public class W1L1 
{ 
    private readonly LevelMenu _levelMenu; 

    public W1L1(LevelMenu levelMenu) 
    { 
     this._levelMenu = levelMenu; 
    } 

    //Where you want to enable the button 
    this._levelMenu.button2.Enabled = true; 
} 

這不是一個最好的解決方案,在架構上,但它的工作原理。

但是,如果您創建更多的OOP方式來啓用下一級別的按鈕會更好。

+0

這不起作用:( – user3105642

0

當您打開下一級時,將其作爲單獨的對象作爲新窗體打開。現在當關卡完成時,您可以從原始類訪問該表單上的公共控件。像這樣的東西可能會有所幫助:

LevelMenu NextLevel = new LevelMenu(); 
public event Action levelCompleted; 
if (levelCompleted != null) 
    levelCompleted(); 
NextLevel.button2.Enabled = true; 
0

這裏就是我做我希望這有助於

我創造了2種形式

Form1中=式菜單(按鈕),窗體2 =遊戲一級(即1)

然後在窗體2我增加了一個甚至LevelCompleted將通知Form1中,玩家完成了水平

//add this to form2 
    //the delegate 
    public delegate void LevelCompleted(Int32 level); 

    //the event 
    public event LevelCompleted LevelCompletedEvent; 

然後在Form1(菜單形式),當您創建窗體2(具有事件)的實例訂閱它,並創建一個處理程序,在我的情況下,我加入它,我創建窗體2

實例
private void button1_CLick(object sender, EventArgs e) 
    { 
    Form2 level1 = new Form2(); 
    level1.LevelCompletedEvent += new Form2.LevelCompleted(level1_LevelCompletedHandler); 
    level1.Show(); 
    } 

    //and this is the handler method 
    void level1_LevelCompletedHandler(int level) 
    { 
     //the logic for controlling the button states 
     // the level parameter can be used to indicate what is the current level completed. 
     if(level == 1) 
     { 
     button1.Enabled = false; 
     button2.Enabled = true; 
     } 
    } 

注意:在Form2(遊戲關卡)中,我創建了一個現場gameOver,如果他沒有完成遊戲,則可以使用 如果他被允許進入下一關,則必須在此表單中提出事件以通知Form1(菜單)
他(用戶)完成了關卡並且Form1將執行方法level1_LevelCompletedHandler(int level)。

我知道這個問題沒有很好的解釋,但我希望我能給你一個關於這個事件的想法。

+0

謝謝你KiX Ortillan!這工作完美!:D – user3105642

相關問題