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

Cocos2d iphone Cocos2D一个精灵的简单碰撞检测,另一个精灵的孩子,cocos2d-iphone,collision-detection,ccsprite,bounding-box,Cocos2d Iphone,Collision Detection,Ccsprite,Bounding Box,我的碰撞检测有问题(我使用的是cocos2d,不是box2D或花栗鼠)。基本上,我有播放器,它是一个CCSprite,还有射弹,也是一个CCSprite。到目前为止,使用CGRECT一切正常,但在游戏中玩家可以激活一个超级末日激光,它总是在玩家面前。我包括它的方式是,我将它添加为播放器的子项,因此我没有更多的代码来处理旋转或移动之类的事情。但我的问题是,它不能正确地检测到与射弹的碰撞,因为激光的位置总是0,0,因为它被添加到播放器中,而不是场景中 这是我的密码: Player.m - (bool

我的碰撞检测有问题(我使用的是cocos2d,不是box2D或花栗鼠)。基本上,我有播放器,它是一个CCSprite,还有射弹,也是一个CCSprite。到目前为止,使用CGRECT一切正常,但在游戏中玩家可以激活一个超级末日激光,它总是在玩家面前。我包括它的方式是,我将它添加为播放器的子项,因此我没有更多的代码来处理旋转或移动之类的事情。但我的问题是,它不能正确地检测到与射弹的碰撞,因为激光的位置总是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;
}
在GameSecene.m中(用于碰撞检测):

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


非常感谢你的回答

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

您可以尝试以下方法:

  • 从场景和播放器中使用
    convertToWorldSpace
    convertToNodeSpace

  • 将激光器置于场景中,移动播放器时也会移动激光器

    • 您可以向播放机发送激光参考,并覆盖播放机中的方法
      setPosition()

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

    • 另一个选项是当你移动玩家时,向激光发送相同的动作

  • 不起作用:(我的激光看起来像这样:O O>-============其中:O是屏幕的中心,O>是播放器,-是激光的定位点,是激光。convertToWorldSpace是否考虑了精灵的旋转?@LearnCos2D如果父精灵旋转,但子精灵位置从未改变,该怎么办怎么办?我遵循了你的第二个选择,效果非常好,非常感谢
    - (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];
    
    }
    
        -(void) setPosition(CGPoint newPos){
                [laser setPosition:newPos];
                [super setPosition:newPos];
        }