OOP:设计菜单系统

时间:2008-11-13 18:01:46

标签: objective-c model-view-controller oop

我目前正在尝试为游戏创建一个菜单系统,并且无法以任何真正合理的方式实现这一目标。有几个菜单屏幕,每个都是非平凡的,所以我想把它们作为单独的类。我遇到的主要问题是在这些菜单屏幕之间传递控制权。

我尝试将每个屏幕构建为单例并直接从另一个屏幕调用一个屏幕,即。目标C中的[[MainMenu instance] display]之类的东西。这有点乱,因为(1)我必须为每个菜单屏幕编写单例样板代码和(2)类相互依赖,有时我有围绕循环依赖等进行编码。

我考虑过使类完全静态以绕过实例管理(在这种情况下这有点多余,因为每个屏幕实际上只有一个实例)。但这看起来也很难看,尤其是Objective C必须通过声明类static来“伪造”类变量。

然后我考虑了一些创建实例并传递控件的“manager”类,但我不确定引入一个额外的类会解决问题,特别是如果这个类被命名为Manager: - )< / p>

我应该注意,我有一个工作系统,它感觉不太好。我的意思是有一些代码重复,如果我不小心,事情可能会挂起,等等。有任何想法吗?我知道这是不明确的,所以讨论可能更多的是集思广益,但我仍然对这些想法感兴趣,即使他们没有彻底解决我的问题。

更新:谢谢大家的想法。我到底做了什么:

我重新设计了菜单内容(按钮,图形等)以适应名为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语言。)根控制器类处理实例管理,菜单之间的转换以及其他一些小事情。大多数菜单屏幕都有一个控制器的自定义子类,用于处理按钮和其他子视图中的事件。

课程数量增加,但代码更清晰,不会重复,也不容易出错。实例管理仍然不完美,但我对设计感到满意。再次感谢所有回答的人。

3 个答案:

答案 0 :(得分:4)

我学到的体面设计技巧总是将您的数据与代码分开。这将针对您的具体问题进行WONDERS。

我的意思是菜单项(字符串)和菜单之间的关系应该存储在数组或单独的文件中(并读入数组)。

然后使用此数组实例化所有菜单类。

一旦你按照这种方式重新编码(我用菜单完成了这个),你的所有代码都将落实到位,你也会考虑到 - 90%的菜单代码(每个菜单将不再是它是自己的类,只是用自己独特的数据实例化的同一个类。

菜单项的目标也存储在“数据”中(作为方法指针或类实例)。

答案 1 :(得分:2)

我认为一个MenuManager类就可以了。您将拥有一个菜单基类,所有菜单屏幕都来自该基类,并且管理器将具有指向当前活动菜单屏幕的指针。例如,它还可以跟踪以前的菜单屏幕,以便在任意菜单屏幕调用中轻松使用菜单屏幕上的后退按钮。也许只需使用std :: vector,这样您就不必在返回时重新创建以前的菜单屏幕(这也可以防止丢失输入的信息,例如在带有Advanced子菜单的Options菜单中)。

答案 2 :(得分:1)

将菜单的所有内容放入字典中,倾倒到plist并根据需要通过菜单屏幕阅读每个内容可能是最简单的路线,但是说实话,你应该考虑采用更加以MVC为中心的方法来解决问题。问题。屏幕应该用于呈现数据而不是存储数据。如果您提供数据与视图的清晰分离,问题就解决了。