【问题标题】:cocos2d: Collision detection doesn't work rightcocos2d:碰撞检测无法正常工作
【发布时间】:2012-02-25 22:30:36
【问题描述】:

大家好,我在碰撞检测方面遇到了问题。

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

-(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 已初始化 酒碰撞拦截(?????????) 为什么酒??

敌人初始化 Jetpack 碰撞拦截 (????? ) 为什么是 jetPack??

但有时还可以

敌人初始化 敌人碰撞拦截

我哪里错了?

谢谢大家的欢呼

【问题讨论】:

    标签: cocos2d-iphone collision-detection collision


    【解决方案1】:

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

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

    这样,事情会更加清晰和安全,也可能会解决您的问题。

    【讨论】:

    • 这是个好主意,但不起作用,我无法回答你,因为我没有名誉
    • cmets 是正确的沟通方式。当它真的是一个问题或评论时,不要写答案;)
    • @GabrieleCarbonai:但这不太可能——这意味着你确实初始化了那些对象,而你不应该这样做。也许您将不得不向我们展示更多您的代码。
    【解决方案2】:

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

    精灵在 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
    

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

    生成精灵的方法调用碰撞

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

    在 init 方法中,调用了带有随机数的方法对象生成器

         [self schedule:@selector(initObjects) interval:8];
    

    精灵有时间死去

    在日志中总是一样的

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

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

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

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

    谢谢你

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多