我正在尝试一个简单的游戏。只显示几个按钮和文本。 我想将游戏引擎与视图,视图控制器等完全分开。因此,我将其定义在一个名为GameEngine的单独文件和类中。
我在AppDelegate中声明并初始化一个GameEngine实例,如下所示:
#import "GameEngine.h"
GameEngine *this_game; //It's global!
@interface ...{
...
// this_game is not declared here at all
...
}
//No getter/setter defined for this_game
AppDelegate实现如下所示:
#import "MyGameAppDelegate.h"
@implementation ...
// this_game not synthesized
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after app launch
this_game = [[GameEngine alloc] init];
this_game.managedObjectContext = self.managedObjectContext;
[this_game initialize_data];
[window addSubview:game_vc.view]; // Display the primary application view
[window makeKeyAndVisible];
}
...
-(void)dealloc{
...
[this_game release];
...
}
好的,这样就可以了,这就是主视图控制器头文件中发生的情况:
#import "GameEngine.h"
extern GameEngine *this_game;
// No other reference to this_game in the .h file
现在是.m中的代码:
-(void)viewDidLoad{
...
NSLog([this_game test], nil); //Just a quick "I am here" test
...
}
这一切都很好,我可以从程序中的各个点整天调用全局this_game对象的方法。它有效。
问题是关于在Objective-C的公认实践中如何“正确”或适当,如果你愿意,这种方法可能是什么?
这是个坏主意吗?为什么? 有没有更好的办法?为什么会更好?
我的意图是BTW,它将GameEngine代码分开,以便更容易重复使用此平台和其他移动平台。所有本机窗口和UI内容都需要远离游戏逻辑。
谢谢,
-Martin
答案 0 :(得分:2)
我完全赞同你将游戏逻辑代码与所有GUI相关的东西分开总是一个好主意:-)我认为你的方法在第一次看来似乎很好,但我想到了两个问题:
1。)你为什么不使用单身人士?因此,您不必在Obj-C项目中使用C代码,如果您需要关注在模拟器上运行时的特殊情况,或者您希望使用模拟测试进行测试,那么您可以随时扩展应用程序。看看Singletons, AppDelegates...。有一个很好的小头文件SynthesizeSingleton.h我经常在我的项目中使用。
2。)如果您对1.)的回答是“因为我想在不同的系统上运行它......”,那么我建议将您的GameEngine类实现为C或C ++。因此,迁移到其他平台将更容易。