【问题标题】:Cocos2D Simple Collision Detection of a sprite, children of another spriteCocos2D 简单碰撞检测一个精灵,另一个精灵的孩子
【发布时间】:2013-03-09 20:37:11
【问题描述】:

我的碰撞检测有问题(我使用的是 cocos2d,而不是 box2D 或 Chipmunk)。基本上,我有 Player,它是一个 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];

}

你认为我应该关注什么?有没有检测碰撞的简单方法,或者我应该在场景中添加激光并添加代码以使其与玩家一起移动?

非常感谢您的回答!

【问题讨论】:

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


    【解决方案1】:

    你可以尝试一些事情:

    1. 在场景和播放器中使用convertToWorldSpaceconvertToNodeSpace

    2. 将激光放在场景中,当你移动玩家时也移动激光

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

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

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

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

    【讨论】:

    • 我遵循了你的第二个选项,它就像一个魅力,非常感谢你! :D
    【解决方案2】:

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

    【讨论】:

    • 不起作用 :( 我的激光看起来像这样 :O o> -========= 其中 :O 是屏幕的中心,o> 是播放器,-是激光的锚点,=======是激光。convertToWorldSpace是否考虑了精灵的旋转?
    • @LearnCocos2d 如果父级旋转但子级精灵位置从未改变,那我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多