游戏引擎全球化?这是正确的方法吗?

时间:2011-01-24 17:31:52

标签: iphone objective-c

我正在尝试一个简单的游戏。只显示几个按钮和文本。 我想将游戏引擎与视图,视图控制器等完全分开。因此,我将其定义在一个名为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

1 个答案:

答案 0 :(得分:2)

我完全赞同你将游戏逻辑代码与所有GUI相关的东西分开总是一个好主意:-)我认为你的方法在第一次看来似乎很好,但我想到了两个问题:

1。)你为什么不使用单身人士?因此,您不必在Obj-C项目中使用C代码,如果您需要关注在模拟器上运行时的特殊情况,或者您希望使用模拟测试进行测试,那么您可以随时扩展应用程序。看看Singletons, AppDelegates...。有一个很好的小头文件SynthesizeSingleton.h我经常在我的项目中使用。

2。)如果您对1.)的回答是“因为我想在不同的系统上运行它......”,那么我建议将您的GameEngine类实现为C或C ++。因此,迁移到其他平台将更容易。