Cocos2d iphone Cocos2d-碰撞中的动作?

Cocos2d iphone Cocos2d-碰撞中的动作?,cocos2d-iphone,action,collision-detection,Cocos2d Iphone,Action,Collision Detection,我有一个碰撞检测,它工作正常,问题是,每当我的“鸟”碰到“云”时,云就会散开,我得到一些分数。同样的情况也发生在“sol”上,它应该这样做,但在云上却不行 如何改变这一点?我试了很多次,但似乎都失败了 冲突代码 - (void)update:(ccTime)dt { bird.position = ccpAdd(bird.position, skyVelocity); NSMutableArray *projectilesToDelete = [[NSMutableArray

我有一个碰撞检测,它工作正常,问题是,每当我的“
”碰到“
”时,云就会散开,我得到一些分数。同样的情况也发生在“
sol
”上,它应该这样做,但在云上却不行

如何改变这一点?我试了很多次,但似乎都失败了

冲突代码

- (void)update:(ccTime)dt {
    bird.position = ccpAdd(bird.position, skyVelocity);

    NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init];
    for (CCSprite *bird in _projectiles) {
        bird.anchorPoint = ccp(0, 0);  
        CGRect absoluteBox = CGRectMake(bird.position.x, bird.position.y, [bird boundingBox].size.width, [bird boundingBox].size.height);

        NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init];
        for (CCSprite *cloudSprite in _targets) {
            cloudSprite.anchorPoint = ccp(0, 0); 
            CGRect absoluteBox = CGRectMake(cloudSprite.position.x, cloudSprite.position.y, [cloudSprite boundingBox].size.width, [cloudSprite boundingBox].size.height);


            if (CGRectIntersectsRect([bird boundingBox], [cloudSprite boundingBox])) {
                [targetsToDelete addObject:cloudSprite];

            }                       
        }

        for (CCSprite *solSprite in _targets) {
            solSprite.anchorPoint = ccp(0, 0); 
            CGRect absoluteBox = CGRectMake(solSprite.position.x, solSprite.position.y, [solSprite boundingBox].size.width, [solSprite boundingBox].size.height);


            if (CGRectIntersectsRect([bird boundingBox], [solSprite boundingBox])) {
                [targetsToDelete addObject:solSprite];      
                score += 50/2;
                [scoreLabel setString:[NSString stringWithFormat:@"%d", score]];
            }                       
        }



        // NÅR SKYEN BLIVER RAMT AF FUGLEN
        for (CCSprite *cloudSprite in targetsToDelete) {
            //[_targets removeObject:cloudSprite];
            //[self removeChild:cloudSprite cleanup:YES];       
        }

        // NÅR SOLEN BLIVER RAMT AF FUGLEN
        for (CCSprite *solSprite in targetsToDelete) {
            [_targets removeObject:solSprite];
            [self removeChild:solSprite cleanup:YES];   


        }

        if (targetsToDelete.count > 0) {
            [projectilesToDelete addObject:bird];
        }
        [targetsToDelete release];
    }

    // NÅR FUGLEN BLIVER RAMT AF ALT ANDET
    for (CCSprite *bird in projectilesToDelete) {
        //[_projectiles removeObject:bird];
        //[self removeChild:bird cleanup:YES];
    }
    [projectilesToDelete release];

}

嗯,你的云和太阳光对象都在同一个数组中。因此,除非在循环中测试适当的类型,否则将无法对其中任何一个执行所需的操作。类似这样(假设cloud和sol是CCSprite的子类):


这样,您只能将云添加到targetsToDelete。关键是在你的目标中区分云和溶胶。子类化是防弹的。否则,您可以使用标记来实现它,但它可能是一个更脆弱的设计。一旦你能分辨出你的目标中的对象种类,这段代码就可以很容易地优化(在目标和目标上的迭代次数就更少了)。

我猜你应该删除这行:[targetsToDelete addObject:cloudSprite];刚刚试过,不起作用我得到这个错误:使用未声明的标识符“Cloud”-我猜是[Cloud class]这里有一个问题,怎么纠正呢?顺便说一句,谢谢你的回答!这就是问题的关键:我假设你已经为云和溶胶对象子类化了CCSprite。问题是,当你把CCSprite对象放在数组中时,你基本上已经“忘记”了一个特定的sprite对应于一个云或溶胶,除非你专门为r那。将其设计到代码库中的一种方法是将CCSprite子类化为一个Cloud类和一个Sol类。这样,当你从_targets数组中检索一个对象时,你将能够找出它是什么。不要认为我已经将我的任何Sprite子类化了,我只是这样做:CCSprite*Sol;etc..但是如果我需要子类,在哪里可以呢我读过,或者你知道我如何为两个精灵创建一个快速的子类吗?好吧,那将是非常基本的obj-c内容,我相信你可以阅读它,并找出你自己在这种环境下进行OO编程的方法。记住,关键是能够区分你从哪个类型的对象中提取,以便应用y删除它的适当逻辑。祝您的应用程序好运
for (CCSprite *cloudSprite in _targets) {
    if(![cloudSprite isKindOfClass:[Cloud class]]) continue;
    cloudSprite.anchorPoint = ccp(0, 0); 
    CGRect absoluteBox = CGRectMake(cloudSprite.position.x, cloudSprite.position.y, [cloudSprite boundingBox].size.width, [cloudSprite boundingBox].size.height);
    if (CGRectIntersectsRect([bird boundingBox], [cloudSprite boundingBox])) {
        [targetsToDelete addObject:cloudSprite];

    }                       
}