1

同じスプライトの複数の子を挿入してアクセスする (または実行時にそれらの位置を設定する) のに問題があります。適切な方法があれば、できれば私の間違いを指摘してください。これが私のアプローチです。

//In the Init Method...

//int i is defined in the start.

    for (i = 1; i < 4; i++)

    {

        hurdle = [CCSprite spriteWithFile:@"hurdle1.png"];

        [self addChild:hurdle z:i tag:i];

        hurdle.position = CGPointMake(150 * i, 0);

    }

キャンバス上のすべてのスプライトを広げます。次に、いくつかの「UPDATE関数」でこれを呼び出しています。

hurdle.position = CGPointMake(hurdle.position.x - 5, 10);

if (hurdle.position.x <= -5) {
    hurdle.position = ccp(480, 10);
}

動作しますが、予想通り、水平方向に移動するインスタンスは 1 つだけです。すべてのインスタンスを移動したいので、これを使用しようとしています....

for (i = 1; i < 4; i++){

   [hurdle getChildByTag:i].position = CGPointMake(hurdle.position.x - 5, 10);

//OR
   [hurdle getChildByTag:i].position = CGPointMake([hurdle getChildByTag:i].position.x - 5, 10);

}

さまざまな場所でログを取得しようとしましたが、getChildByTag が使用しようとしている方法で機能しないことに気付きました。

4

2 に答える 2

2

問題はコードの最後のブロックにあります。for ループ内で各 CCSprite へのローカル参照を作成する必要があります。

にスプライトを追加したのでself、それらを の子として取得します。self

for (i = 1; i < 4; i++){
   CCSprite * enumHurdle = [self getChildByTag:i];
   enumHurdle.position = CGPointMake(enumHurdle.position.x - 5, 10);
}

同じシーンでこの方法で他のスプライトを作成する場合は注意してください。任意の 2 つのスプライトに同じタグを付けるのは良くない設計です。

タグの重複を避けることについて編集します。

スプライトの数がわかっている場合。タグの列挙を使用して、スプライトを名前で参照します。

そうでない場合は、グループの数を把握し、グループのサイズに制限を設けることで、管理しやすくなります。

つまり、このようなスプライトを生成するコードの 3 つの部分があるとします。enum.m (@implementation 行の下) にan を含めて、そこに制限を設定できます。

// Choose names that describe the groups of sprites
enum { kGroupOne = 0, // limiting the size of each group to 100 
    kGroupTwo = 100, // (besides the last group, but that is not important)
    kGroupThree = 200, 
};

次に、各グループを作成するときに

// group 1
for (i = kGroupOne; i < 4; i++){
   // set up code here
}

// group 2 
// g2_size is made up, insert whatever you want
for (i = kGroupTwo; i < g2_size; i++) {
   // set up code here
}
.
.
.

次に、グループで取得します

for (i = kGroupOne; i < 4; i++){
   CCSprite * enumHurdle = [self getChildByTag:i];
   enumHurdle.position = CGPointMake(enumHurdle.position.x - 5, 10);
}
.
.
.

うまくいけば、それがあなたの創造性を刺激します。さあ、楽しんでください。

于 2012-01-18T06:17:51.807 に答える
0

Something that I do often is group objects of like kind that I want to act on in a similar way by adding them to a CCNode and add that CCNode to the layer.

I would create a class that derives from CCNode

Then I can put all my logic in that node and access then via [self children]

for(CCSprite *hurdle in [self children]) {
    // Do what you need to do
}
于 2012-01-18T15:17:15.783 に答える