2011-05-10 28 views
2

我正在完成構建我的OOP技巧的過程, 並編寫了一個抽象的Screen類,其中包含一個將KeyboardState和MouseState作爲參數的更新方法,以及一個繪製方法, SpriteBatch作爲參數。 該類還包含一個bool isEnabled,以及啓用/禁用它的方法。在XNA 4.0中管理自定義屏幕

到目前爲止,它的工作很好,擴展了這些並且在沒有問題的情況下使用 ,直到它從一個屏幕移動到另一個屏幕。 我想知道爲什麼屏幕被禁用,以及接下來要啓用的屏幕。

目前我在屏幕中使用一個int變量,並且主類檢查實現Screen的類是否被禁用並且具有「禁用原因」int。如果是這樣,它會根據該int進行操作。 我想int不是最好的選擇,Enum會更好嗎?

但我真正的問題是,有沒有更好的方式來傳遞數據回到主類? 我必須輪詢每個禁用的類,看看是否有「被禁用代碼的原因」?

回答

1

我只會回答以下問題:

I guess that an int isn't the best choice and an Enum would be better? 

即使你使用enumation你仍然可以使用一個整數值,因爲一個枚舉有一個與之相關的整數值。

枚舉的唯一好處是你將有一個文本表示的原因,而不是(0,1,2,3 ..)。

+0

感謝您的回答:) 是的,我的想法只是給我的代碼賦予純整數值的意義是不好的做法。當我稍後將其擴展時,更不用說混淆了。 – mhorne 2011-05-10 15:15:54

1

我猜int不是最好的選擇,Enum會更好嗎?

正確。做一個枚舉,例如:

enum DisabledReason { Something, SomethingElse; } 

有中繼數據傳回主類的更好的辦法?我是否需要輪詢每個禁用的類,以查看是否存在「被禁用代碼的原因」?

給基本畫面類的事件 - 這樣的事情(MSDN for EventHandler):

public event EventHandler<DisabledReason> Disabled; 

使主類附加一個事件處理的屏幕,因爲它創造他們。

使屏幕類在禁用時調用Disabled事件處理程序。

其結果將是,當它被禁用的主類被告知爲什麼屏幕被禁用,。您將屏幕的this作爲源參數傳遞給Disabled事件 - 因此主類將知道事件來自哪個屏幕。

(注:這是非常使用的事件速成班 - 做一點關於如何使用事件,如果你需要更多的研究。)

+1

我還沒有遇到寫作活動。 它肯定比持續輪詢更有效。你已經給了我下一個學習領域:P 感謝您的回答:D – mhorne 2011-05-10 15:21:55

1

我從Game State Management樣本建議「借」在Microsoft App Hub網站上。這完全是關於屏幕管理。 (請務必下載適用於Windows的示例 - 除非您製作電話應用程序)。

屏幕管理類是可重複使用的部件 維持 一個或多個GameScreen實例的疊層。它 協調從一個 屏幕到另一個屏幕的轉換,並照顧 將用戶輸入路由到堆棧頂部的任何一個屏幕 。

+0

我考慮過尋找類似的東西,但決定試圖找出我自己的方式作爲學習練習,以便更熟悉/舒適OOP編程。 感謝您的鏈接,但我會看看它是如何工作後,我已經盡我所能地推動自己:) – mhorne 2011-05-12 01:55:34

1

即使您最終「借用」代碼來找出解決方案,您仍然可以從中獲得一些良好的OOP原則。 EventHandlers是「觀察者」模式的典型例子。