我目前正在尝试为游戏创建一个菜单系统,并且无法以任何真正可靠的方式实现它。有几个菜单屏幕,每个菜单屏幕都是非平凡的,所以我想将它们保留为单独的类。我遇到的主要问题是在这些菜单屏幕之间传递控制权。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)。根控制器类处理实例管理,菜单和其他一些小事情之间的转换。大多数菜单屏幕都会获得控制器的自定义子类,以处理按钮和其他子视图中的事件。
起床的类的数量,但代码更干净,不重复自己,不容易出错。实例管理仍然不完美,但我对设计非常满意。再一次感谢所有回答的人。