cocos2d:碰撞检测不正常

时间:2012-02-24 19:08:04

标签: cocos2d-iphone collision-detection collision

大家好,我有碰撞检测问题。

我有第一种添加随机对象的方法

-(void)initObjects{

    int randomNumber = arc4random() % 5 + 1;

    switch (randomNumber) {
        case 1:
            [self initEnemy];
            CCLOG(@"Random number 1");
            break;

        case 2:
            [self initJetpack];
            break;

        case 3:
            [self initWine];
            break;

        case 4:
          //  [self initNight];
            break;

        default:
            CCLOG(@"no number");
            break;
    }

}

然后何时会选择生成对象的方法,如果碰撞检测到删除精灵添加

将代码放入每个对象方法

[self schedule:@selector(collision) interval:1 / 60];

碰撞方法:

-(void)collision {
  if (CGRectIntersectsRect([_hero boundingBox], [_enemy boundingBox])) {
        CCLOG(@"Enemy collision intercect");
        [self spriteMoveFinished:_enemy]; // It's method like  [self removeChild:_enemy cleanup:YES];
        [self unschedule:@selector(collision)];
    }   else if (CGRectIntersectsRect([_hero boundingBox], [_powerNight boundingBox])) {
        CCLOG(@"PowerNight collision intercect");
       // the same up
    } else if (CGRectIntersectsRect([_hero boundingBox], [_wine boundingBox])) {
         CCLOG(@"Wine collision intercect");
       // the same up
    } else if (CGRectIntersectsRect([_hero boundingBox], [_jetPack boundingBox])) {
        CCLOG(@"Jetpack collision intercect");
        //the same up
    }
 }

现在有趣的日志

JetPack inizializated 葡萄酒碰撞拦截(?????????)为什么葡萄酒??

敌人inizializated Jetpack碰撞拦截(?????)为什么是jetPack ??

但有时候没关系

敌人inizializated 敌人碰撞拦截

哪里错了?

谢谢你们每个人的欢呼声

2 个答案:

答案 0 :(得分:0)

首先,在尝试检查碰撞之前检查每个对象是否存在是一件好事。例如:

if (_jetPack) {  // Check if jetPack exists
    if (CGRectIntersectsRect([_hero boundingBox], [_jetPack boundingBox])) {

    }
}

通过这种方式,事情更清晰,更安全,也可以解决您的问题。

答案 1 :(得分:0)

是的omega你是对的,在第一次我犯了错误。

精灵在CCSpriteBatchNode中,我这样调用:

[self addChild:nameSprite];

我改变了这样(原始代码)

self.jetPack = [CCSprite spriteWithSpriteFrameName:@"jetpack-4.png"];       
_jetPack.position = ccp(480, randomNumber);
[_batchNode addChild:_jetPack z:3 tag:3];

现在我尝试了很多可能性,我改变了碰撞方法

-(void)collision:(ccTime)dt andTag:(int)tag {


if (_enemy){

    if (CGRectIntersectsRect(_enemy.boundingBox, _hero.boundingBox)) { 
        CCLOG(@"Enemy collision intercect");
        [self spriteMoveFinished:_enemy andTag:6];
        [self unschedule:@selector(collision)];
    }
}// Continue with another collision

我想尝试宽度“标签”但不起作用

sprite调用碰撞的方法

[self schedule:@selector(collision:andTag:) interval:1/60];

在init方法中,调用方法对象生成器,其中包含随机数

     [self schedule:@selector(initObjects) interval:8];
精灵有时间去世

在日志中它始终是相同的

正确地生成精灵,当有一些碰撞有时是好的,有时也没有。

就像模拟器混淆精灵一样,但奇怪的是:

如果精灵是_jetPack我有结构控制if-else精灵怎么可能进入_enemy碰撞?

我希望我能得到很好的解释。

谢谢