2011-11-12 15 views
1

私はCCLayerを継承し、CCSceneを返すGameWorldクラスを持っています。私のGameWorldには合成されたプロパティ「スコア」があります。スコアは2秒ごとに増分されます。ゲームをプレイする時間が長くなるほど、スコアは高くなります。別のクラスのセッターメソッドへのアクセス

素晴らしい!

私は、CCNodeを継承し、スプライトを返してレイヤーの子として追加するGameObjectを呼び出します。すべてのGameObjectには「コスト」プロパティがあります。

新しいスプライトを追加するたびに、スコアに応じてスコアが下がります。

スコアを減らす(int)コストを含むGameObjectからGameWorldに自分の(int)スコアを設定するにはどうすればよいですか?

つまり、クラス内からGameWorldスコアを設定/取得するのは簡単ですが、私のGameObjectクラスはGameWorldを見ることができません。クラスのプロパティのセッターメソッドを別のクラスに公開する方法はありますか?

ありがとうございます!

答えて

0

GameWorldGameObjectのインスタンスを保持している場合は、GameWorldの範囲内で実行してください。

self.score -= anObject.cost; 

そうでなければ、GameWorldへの参照を維持するクラスがなければなりません。それをしてください。

aWorld.score -= anObject.cost 
0

他のクラスオブジェクトのプロパティを設定するには、そのオブジェクトを他のオブジェクトのプロパティオブザーバとして登録するか、それらの2つのオブジェクト間に弱い参照を作成します。

たとえば、GameObjectクラスに@property (nonatomic, assign) GameWorld* gameWorld;を追加することを検討してください。次に、2つのset gameObjectプロパティgameWorldを作成します。

GameWorld *gameWorld = //init; 
GameObject *gameObject = //init; 
gameObject.gameWorld = gameWorld; 

次に、gameWorldオブジェクトとそのすべてのプロパティにGameObjectクラスからアクセスできます。

0

GameWorldクラスを「一時的な」シングルトンにします(このパターンの名前が不足しています)。これは、Cocos2Dのシーンや、兄弟/子供よりもノードの階層にとどまることが保証されている他のノード(レイヤー)には適しています。あなたは、単に次のようにその世界内の任意のオブジェクトからあなたのゲームの世界のインスタンスにアクセスすることができ

static GameWorld* instance; 

-(id) init 
{ 
    if ((self = [super init])) 
    { 
     instance = self; 
    } 
    return self; 
} 

-(void) dealloc 
{ 
    instance = nil; 
    [super dealloc]; 
} 

+(GameWorld*) sharedGameWorld 
{ 
    return instance; 
} 

:個人的に

[GameWorld sharedGameWorld].score += 10; 

保持する傾向があるので、私は、これは弱参照の周りに渡して打つと思います。また、GameWorldに含まれるオブジェクトの1つにGameWorldを保持すると、retain cycleがあり、シーン全体がリークします。

+0

私はこのようなことをしています。あまりにも多くのシングルトンを作成したくないのですが、GameWorldのようなオブジェクトは、そのようなもののようなものです。なぜこれを「一時的な」シングルトンと呼んだのですか?それは正常に見えます。 –

+0

あなたのGameWorldが存在する間はシングルトンのみが存在するため、一時的です。たとえば、メニュー画面では使用できない場合があります。 「通常の」シングルトンはアプリの生涯を通じて利用できますが、厳密に言えばパターンとは異なります。 – LearnCocos2D

関連する問題