Cocos2D简单碰撞检测精灵,另一个精灵的孩子

时间:2013-03-20 16:07:28

标签: cocos2d-iphone collision-detection ccsprite bounding-box

我的碰撞检测有问题(我使用的是cocos2d,而不是box2D或Chipmunk)。基本上,我有播放器,它是一个CCSprite, Projectiles ,也是CCSprite。到目前为止,使用CGRectIntersectRect一切正常,但在游戏中,玩家可以激活一个永远在玩家面前的超级激光。我加入它的方式是我将其添加为播放器的子项,因此我没有更多的代码可以处理旋转或移动等内容。但我遇到的问题是它没有正确检测到与射弹的碰撞,因为激光的位置总是0,0因为它被添加到了玩家而不是场景。

这是我的代码:

Player.m

- (bool) activateSuper{
bool activated = NO;
if (powerReady) {
    NSLog(@"Super Activated!!!!!");
    activated = YES;
    _state = pSuper;

    //Super sprite which is supposed to collide with projectiles
    _sprSuper = [CCSprite spriteWithSpriteFrameName:@"Laser.png"];
    _sprSuper.anchorPoint = ccp(0.5, 0.0);
    _sprSuper.position = ccp(self.contentSize.width/2, self.contentSize.height);
    [self addChild:_sprSuper];

    //Delete
    int duration = 5;
    [self runAction:[CCSequence actionOne:[CCDelayTime actionWithDuration:duration]
                                      two:[CCCallBlock actionWithBlock:^{
        [self removeChild:_sprSuper cleanup:YES];
        powerReady = NO;
        curSuper = 0;
        _state = pOK;
    }]]];

    //Empty super bar
    GameScene *g = (GameScene*)[self parent];
    [g.gameHUD emptyBar:duration];
}

return activated;
}

GameScene.m (用于碰撞检测):

- (void) update:(ccTime)dt{
Projectile *pToRemove = nil;
for (Projectile *p in projectiles){

    if (player.state == pSuper && CGRectIntersectsRect(p.boundingBox, player.sprSuper.boundingBox)) {
        pToRemove = p;
        break;
    }
}

if (pToRemove != nil) [self destroyProjectile:pToRemove];

}

您认为我应该关注什么?是否有一种简单的方法来检测碰撞,或者我应该在场景中添加激光并添加代码以使其随播放器一起移动?

非常感谢您的回答!

2 个答案:

答案 0 :(得分:0)

使用CCNode方法convertToWorldSpace:将射弹的边界框位置(原点)转换为世界空间坐标。这将转换坐标,就像将射弹添加到场景中一样,即位置相对于屏幕坐标0,0。

答案 1 :(得分:0)

你可以尝试一些事情:

  1. 使用场景和播放器中的convertToWorldSpaceconvertToNodeSpace进行游戏

  2. 将激光放入场景,当您移动播放器时也移动激光器

    • 您可以将激光的参考发送给播放器并覆盖播放器中的setPosition()方法

          -(void) setPosition(CGPoint newPos){
                  [laser setPosition:newPos];
                  [super setPosition:newPos];
          }        
      

      这里,每当你移动播放器(CCMoveTo,CCMoveBy等)时,激光也会移动。

    • 其他选项是当您移动播放器时向激光器发送相同的动作