2012-01-18 9 views
1

同じスプライトの複数の子を挿入してアクセスする(または実行時に位置を設定する)のに問題があります。適切な方法を教えて、私の間違いを指摘することをお勧めします。ここに私のアプローチがあります。CCスプライトの追加とアクセス

//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 Function"ではこれを呼び出しています。

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

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

予想どおり、1つのインスタンスだけが水平方向に移動します。私は、様々な場所にログを取得しようとしたgetChildByTagは私がしようとしているように動作しないことに気づきました

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); 

} 

....すべてのインスタンスが、私はこれを使用しようとしていますので、移動することにしたいですこれを使って。

答えて

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つあるとします。あなたは(@implementationラインの下に)あなた.Mでenumを含めると、あなたはグループ

for (i = kGroupOne; i < 4; i++){ 
    CCSprite * enumHurdle = [self getChildByTag:i]; 
    enumHurdle.position = CGPointMake(enumHurdle.position.x - 5, 10); 
} 
. 
. 
. 
に取得するために、その後、各グループ

// 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 
} 
. 
. 
. 

を作成するときに

// 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, 
}; 

を限界を置くことができます

うまくいけば、それはあなたの創造性を喚起します。今楽しみましょう。

+0

私のように何をenumHurdle宣言する必要がありますか? CCSprite? –

+0

@ToughGuyそれは正しいです。ありがとう、私はそれを編集します。 –

+0

あなたの助けをたくさんありがとう。しかし今、私はスプライトを追加することについてはうんざりですが、同じタグを共有しないようにしたいと思います。D –

0

私がしばしばするようなものは、CCNodeにCCNodeを追加してそのCCNodeをレイヤーに追加することで、同じような種類のグループオブジェクトです。私はその後、私が[自己子供]を経由してそのノードとアクセス中のすべての私のロジックを置くことができCCNode

から派生したクラスを作成します

for(CCSprite *hurdle in [self children]) { 
    // Do what you need to do 
} 
関連する問題