如何动态地在多个位置拥有相同的精灵?

时间:2012-12-02 20:00:14

标签: objective-c ios cocos2d-iphone sprite

如何动态地在多个位置拥有相同的精灵?我已经看到了另一个问题,但是,你只能用三个精灵来做。我希望有一个动态数量的精灵。我的目标是,我试图制作,而不是只射击一颗子弹,我希望它射击三个或更多。我已完成所有数学运算,但是,我需要在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'

1 个答案:

答案 0 :(得分:0)

你需要创建3个不同的精灵,并将其中所有3个精灵添加为孩子。 通常做这样的事情最好使用CCBatchNode(看看cocos doc)。 使用一个batchnode,你可以在1个绘制调用中绘制所有的孩子,唯一的约束是batchnode的所有孩子需要在同一个spriteSheet上拥有纹理(或者在你的情况下,如果他们有相同的&#34;文件名&# 34) 对于3个射弹而言,你不会遇到性能问题,但是它的设计方法是正确的,如果你需要在屏幕上使用几十个射弹而不使用蝙蝠侠,游戏就不会顺利运行。

回顾一下: 创建一个ccbatchnode, 添加batchnode作为自我的孩子(我想它的ur层或主节点) 创建3个精灵并将它们添加为batchnode的孩子