2008-11-13 75 views
3

我目前正在嘗試爲遊戲創建一個菜單系統,並且無法以任何真正可靠的方式實現它。有幾個菜單屏幕,每個菜單屏幕都是非平凡的,所以我想將它們保留爲單獨的類。我遇到的主要問題是在這些菜單屏幕之間傳遞控制權。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)。根控制器類處理實例管理,菜單和其他一些小事情之間的轉換。大多數菜單屏幕都會獲得控制器的自定義子類,以處理按鈕和其他子視圖中的事件。

起牀的類的數量,但代碼更乾淨,不重複自己,不容易出錯。實例管理仍然不完美,但我對設計非常滿意。再一次感謝所有回答的人。

回答

4

我從體面設計中學到的技巧之一就是將您的數據從代碼中分離出來。這將爲您的具體問題做好事。由此我的意思是菜單項(字符串)和菜單之間的關係應該存儲在一個數組或單獨的文件(並讀入數組)中的某個位置。

然後,您可以使用此數組來實例化所有菜單類。一旦你重新編碼它以這種方式工作(我已經完成了這個菜單),所有你的代碼將落到原處,你還將分解 - 90%的菜單代碼(每個菜單不再是它自己的類,只是與它自己的唯一數據實例化的同一類。

菜單項的目標也存儲在「數據」中(作爲方法指針或類實例)。

2

我認爲MenuManager類是要走的路。您將有一個菜單基類,其中所有菜單屏幕都來自該菜單基類,並且管理器將具有指向當前活動菜單屏幕的指針。例如,它也可以跟蹤以前的菜單屏幕,以便在任意菜單屏幕調用中輕鬆使用菜單屏幕上的後退按鈕。也許只需使用std :: vector即可,因此您不必在返回時重新創建之前的菜單屏幕(這也可以防止輸入信息丟失,例如在具有高級子菜單的選項菜單中)。

1

將菜單中的所有內容放到字典中,傾倒到plist並根據需要通過菜單屏幕閱讀每個菜單可能是最簡單的路線,但是在所有的情況下,您應該考慮採用更多以MVC爲中心的方法來解決問題。屏幕應該用於顯示數據而不是存儲數據。如果您提供了從視圖中清晰分離數據,問題就解決了。