2011-05-02 88 views
2

我想在XNA中用按鈕和滑塊創建頁面,並嘗試了一些想法,但我似乎在保持「面向對象」的東西和讓按鈕和滑塊保持有用而沒有多加實際'按鈕'和'滑塊'類。是否可以將方法添加到集合中的類中?

所以我想知道是否有一種神奇的方式來實例化一個Button類,然後添加一個方法或某種方法的鏈接,以便我可以迭代通過我的按鈕或滑塊集合,如果一個'hit'是否執行與該按鈕相關的特定方法?

最好我想在代表當前屏幕即時繪圖的父類中一個接一個地寫這些方法。

幻想的代碼示例:

class Room // Example class to manipulate 
{ 
    public bool LightSwitch; 
    public void Leave() { /* Leave the room */ } 
} 

class Button 
{ // Button workings in here 
    public bool GotPressed(/*click location */) 
    { /* If click location inside Rect */ return true; } 

    public void magic() {} // the method that gets overidden 
} 

public class GameScreen 
{ 
    public Room myRoom; 
    private List<Button> myButtons; 

    public GameScreen() 
    { 
     myRoom = new Room(); 
     myRoom.LightSwitch = false; 
     List<Button> myButtons = new List<Button>(); 

     Button B = new Button(); 
     // set the buttons rectangle, text etc 
     B.magic() == EscapeButton(B); 
     myButtons.Add(B); 

     Button B = new Button(); 
     B.magic() == SwitchButton(B); 
     myButtons.Add(B); 
    } 

    public void Update() // Loop thru buttons to update the values they manipulate 
    { foreach (Button B in myButtons) 
     { if(B.GotPressed(/*click*/)) { B.magic(B) } }} 
     // Do the specific method for this button 

    static void EscapeButton(Button b) 
    { myRoom.Leave(); } 

    static void SwitchButton(Button b) 
    { myRoom.LightSwitch = true; } 
} 

回答

6

我認爲你正在尋找爲事件的代表。我推薦你使用事件:

首先,在你的類創建的一切公衆活動,如:

public delegate void ClickedHandler(object sender, EventArgs e); 
public event ClickedHandler Clicked; 
private void OnClidked() 
{ 
    if (Clicked != null) 
    { 
    Clicked(this, EventArgs.Empty); 
    } 
} 

然後,你讓在檢查按鈕類的方法,如果是點擊

public void CheckClick(Vector2 click) 
{ 
    if (/* [i am clicked] */) 
    { 
    OnClicked(); 
    } 
} 

按鈕,您可以訂閱點擊事件這樣的外部:

var b = new Button(); 
b.Clicked += new ClickedHandler(b_Clicked); 

/* [...] */ 

private void b_Clicked(object sender, EventArgs e) 
{ 
    /** do whatever you want when the button was clicked **/ 
} 

要了解更多關於事件的信息,請點擊這裏:http://www.csharp-station.com/Tutorials/lesson14.aspx。希望這可以幫助。

+1

+1擊敗我吧 – 2011-05-02 14:35:36

+0

這就是我想要的,我只是還沒有看到事件的一個好例子,msdn的例子似乎增加了很多faff並且隱藏了更多的實際用途! 非常感謝! – Trinnexx 2011-05-03 07:45:40

0

C#有擴展方法,這可能滿足您的需求。

擴展方法在某些靜態類中用特殊的語法定義。這方面的一個樣本可能是:

public static char GetLastChar(this string some) 
{ 
     return some[some.length - 1]; 
} 

string a = "hello world"; 
char someChar = a.GetLastChar(); 

您可以在這裏瞭解更多:

+0

從我可以收集到的東西擴展(或添加)靜態方法,我想要做的是重寫一個perticual方法,以便當我遍歷集合並激發相同的方法時,它做了不同的事情。 – Trinnexx 2011-05-02 15:39:24

+0

閱讀答案很重要。讀取Msdn鏈接,你會發現一個擴展方法的行爲像一個實例。 – 2011-05-03 06:50:02

0

我的遊戲編程的要求模糊認識,但我看到了一個介紹有關這個框架最近 - http://dynobjects.codeplex.com/ 聽起來像ti解決了類似的問題,如果不是相同的問題。

+0

謝謝,遺憾的是演示文稿是Office 2010,代碼是演播室2010(我使用快遞,這是免費的)。 – Trinnexx 2011-05-02 15:45:16

+0

我很確定你可以用Express來建立圖書館。看起來其他項目只是一個演示。您應該也可以使用Visual C#Express構建WPF項目。 – Stilgar 2011-05-04 13:53:10

相關問題