私は単純なゲームを試しています。ほんの数個のボタンとテキストが表示されます。 ゲームエンジンをビュー、ビューコントローラなどから完全に分離したいと思いました。そのため、GameEngineという別のファイルとクラスで定義しました。Game Engine as global?これは正しいアプローチですか?
私は宣言すると、このようにAppDelegateでGameEngineインスタンスをintialize:その方法のうちで、これは、
#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];
...
}
OK:AppDelegateの実装は次のようになります
#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
メインビューコントローラのヘッダーファイルではどうなりますか:
#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のために受け入れられている練習の文脈で本当に「正しい」か適切かという疑問があります。もしそうなら、このアプローチは可能でしょうか?
これは悪い考えですか?どうして? 良い方法がありますか?なぜそれは良いですか?
私の意図は、このプラットフォームと他のモバイルプラットフォームの両方で簡単に再利用できるように、GameEngineコードを分離することです。ネイティブのウィンドウとUIのすべてのものは、ゲームロジックから離れている必要があります。
おかげで、私は完全にすべてのGUI関連のものからゲームロジックコードを分離するにはあなたに同意
Objective-Cは、Appleがそれをやりたいなら、クロスプラットフォームになる可能性があります。しかし、彼らは(まだ?)...私は、Kayがそれらを再利用するために言及したように、ゲームロジックコードにC/C++を使用することをお勧めします。 – Eonil
それも私が考えていることです。今は構造のアイデアを試していますので、Objective-Cに残しました。私はGameEngineの中にあるCoreDataパーシスタンスコードを削除し、他のプラットフォーム固有のモジュールに取り込みたいと思います。 GameEngineは、実行中の場所を完全に無視してこれらのサービスにアクセスする必要があります。 –