別のクラスのセッターメソッドへのアクセス

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

すばらしいです!

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

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

だから私はGameWorldの私の(int)スコアをどのように設定することができますか?GameObjectから、スコアを減算する(int)コストが含まれていますか?

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

ありがとう!

1
追加された 編集された
ビュー: 1

3 答え

あなたの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を保持すると、サイクルを保持し、シーン全体をリークさせます。

0
追加された
あなたのGameWorldが存在する間はシングルトンのみが存在するため、一時的です。たとえば、メニュー画面では使用できない場合があります。 「通常の」シングルトンはアプリの生涯を通じて利用できますが、厳密に言えばパターンとは異なります。
追加された 著者 LearnCocos2D,
私はこのようなことをやっている。あまりにも多くのシングルトンを作成したくないのですが、GameWorldのようなオブジェクトは、そのようなもののようなものです。なぜこれを「一時的な」シングルトンと呼んだのですか?それは正常に見えます。
追加された 著者 Danyal Aytekin,

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
追加された