我目前正在嘗試爲遊戲創建一個菜單系統,並且無法以任何真正可靠的方式實現它。有幾個菜單屏幕,每個菜單屏幕都是非平凡的,所以我想將它們保留爲單獨的類。我遇到的主要問題是在這些菜單屏幕之間傳遞控制權。OOP:設計一個菜單系統
我試着建立每個屏幕作爲一個單身人士,並從另一個直接調用一個屏幕,即。這在目標C中是[[MainMenu instance] display]
。這有點麻煩,因爲(1)我必須爲每個菜單屏幕編寫單例樣板代碼和(2)類彼此依賴,有時我必須圍繞圓依賴關係等
我想過讓這些類完全靜態來解決實例管理(在這種情況下有點額外,因爲實際上每個屏幕只有一個實例)。但是這看起來也很難看,特別是Objective C不得不通過聲明static
來「僞造」類變量。
然後我想到了一些可以創建實例並傳遞控制權的「經理」類,但我不確定引入額外的類會解決問題,特別是如果此類被命名爲Manager :-)
我應該注意到我做有一個工作系統,它只是不覺得很好。我的意思是說有一些代碼複製正在進行,如果我不小心,可能會掛起,等等。有任何想法嗎?我知道這是不明確的,所以討論可能更多是頭腦風暴,但我仍然對這些想法感興趣,即使它們不能徹底解決我的問題。
更新:謝謝大家的想法。我最後做了什麼:
我重寫了菜單內容(按鈕,圖形等),以適應名爲ScreenView
的一個界面。這是一個通用的接口,看起來像這樣:
@protocol ScreenView
- (void) draw;
- (BOOL) handlesPoint: (CGPoint) p;
- (void) appearWithAnimation;
- (void) disappearWithAnimation;
- (BOOL) hasFinishedAnimating;
@optional
- (void) fingerDown;
- (void) fingerUp;
@end
由於這個協議,我能夠扔掉所有特定的菜單界面,創建一個一般的菜單屏幕採用子視圖列表顯示和處理所有演示如繪畫,轉場,事件等。這個通用的菜單屏幕並沒有太多類型化,因爲大多數菜單屏幕都很高興,只是顯示了子視圖列表。這將是MVC中的V.
然後我還創建了一個控制器類來處理某個菜單屏幕的所有事件。 (顯然是MVC中的C)。根控制器類處理實例管理,菜單和其他一些小事情之間的轉換。大多數菜單屏幕都會獲得控制器的自定義子類,以處理按鈕和其他子視圖中的事件。
起牀的類的數量,但代碼更乾淨,不重複自己,不容易出錯。實例管理仍然不完美,但我對設計非常滿意。再一次感謝所有回答的人。