2011-01-24 6 views
1

私は単純なゲームを試しています。ほんの数個のボタンとテキストが表示されます。 ゲームエンジンをビュー、ビューコントローラなどから完全に分離したいと思いました。そのため、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関連のものからゲームロジックコードを分離するにはあなたに同意

+0

Objective-Cは、Appleがそれをやりたいなら、クロスプラットフォームになる可能性があります。しかし、彼らは(まだ?)...私は、Kayがそれらを再利用するために言及したように、ゲームロジックコードにC/C++を使用することをお勧めします。 – Eonil

+0

それも私が考えていることです。今は構造のアイデアを試していますので、Objective-Cに残しました。私はGameEngineの中にあるCoreDataパーシスタンスコードを削除し、他のプラットフォーム固有のモジュールに取り込みたいと思います。 GameEngineは、実行中の場所を完全に無視してこれらのサービスにアクセスする必要があります。 –

答えて

2

-Martin

はなかれ、私はあなたのアプローチは、最初のビューで罰金だと思います:-)良いアイデアですが、 2つの質問が私の心に入ります:

1.)なぜシングルトンを使いませんか?したがって、Obj-CプロジェクトでCコードを使用する必要はなく、シミュレータ上で実行している特別な状況や、テスト用にモックアップを使用したい場合など、いつでもアプリケーションを拡張できます。 Singletons, AppDelegates...をご覧ください。小さなヘッダーファイルSynthesizeSingleton.hがあります。自分のプロジェクトで頻繁に使用しました。

2.)あなたの答えが「私は別のシステムで実行したいから...」と答えた場合は、GameEngineクラスをCまたはC++として実装することをお勧めします。したがって、他のプラットフォームへの移行が容易になります。

関連する問題