2008-11-13 78 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为中心的方法来解决问题。屏幕应该用于显示数据而不是存储数据。如果您提供了从视图中清晰分离数据,问题就解决了。