0

同じスプライトを複数の場所に動的に配置するにはどうすればよいですか? 他の質問はすでに見ましたが、それは 3 つのスプライトでしかできません。動的な数のスプライトが必要です。私の目的は、弾丸を 1 発だけ発射するのではなく、3 発以上撃つようにすることです。計算はすべて完了しましたが、3 つのスプライトを for ループで描画する必要があります。これが私がこれまでに持っているものです。

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];
    CGPoint pointOne = [touch locationInView:[touch view]];
    CGSize size = [[CCDirector sharedDirector] winSize];
    CGPoint position = turret.position;
    CGFloat degrees = angleBetweenLinesInDegrees(position, pointOne);
    turret.rotation = degrees;
    pointOne.y = size.height-pointOne.y;
    CCSprite *projectile = [CCSprite spriteWithFile:@"projectile.png"];
    projectile.position = turret.position;

    // Determine offset of location to projectile
    int angle = angleBetweenLinesInDegrees(position, pointOne);
    int startAngle = angle-15;

    int shots = 3;

    NSMutableArray *projectiles = [[NSMutableArray alloc] initWithCapacity:shots];

    // Ok to add now - we've double checked position
    for(int i = 0;i<shots;i++) {
        [self addChild:projectile z:1];

        int angleToShoot = angle;

        int x = size.width;
        int y = x*tan(angle);

        CGPoint realDest = ccp(x,y);

        projectile.tag = 2;
        if (paused==0 ) {
            [_projectiles addObject:projectile];
            // Move projectile to actual endpoint
            [projectile runAction:
             [CCSequence actions:
              [CCMoveTo actionWithDuration:1 position:realDest],
              [CCCallBlockN actionWithBlock:^(CCNode *node) {
                 [_projectiles removeObject:node];
                 [node removeFromParentAndCleanup:YES];
             }],
              nil]];
        }
    }
}

これは私にエラーを与えます:'NSInternalInconsistencyException', reason: 'child already added. It can't be added again'

4

1 に答える 1

0

3 つの異なるスプライトを作成し、3 つすべてを子として追加する必要があります。通常、このようなことを行うには、CCBatchNode を使用することをお勧めします (cocos のドキュメントを参照してください)。バッチノードを使用すると、バッチノードのすべての子が同じスプライトシートにテクスチャを持つ必要があるという唯一の制約を使用して、すべての子を 1 回の描画呼び出しで描画できます (または、同じ「ファイル名」を持っている場合)。 3 つの発射体を使用してもパフォーマンスの問題は発生しませんが、バッチノードを使用せずに画面に多数の発射体を表示する必要がある場合、ゲームはスムーズに実行されません。

要約: ccbatchnode を作成し、batchnode を self の子として追加します (私はその ur レイヤーまたはメインノードを想定しています) 3 つのスプライトを作成し、batchnode の子として追加します

于 2012-12-02T20:12:58.303 に答える