Cocos2d iphone 与具有另一个精灵作为父对象的精灵冲突

Cocos2d iphone 与具有另一个精灵作为父对象的精灵冲突,cocos2d-iphone,collision-detection,affinetransform,Cocos2d Iphone,Collision Detection,Affinetransform,似乎不可能,但必须有一个解决办法 我有以下课程: @interface EnemiesEntities : CCSprite { bool isFunctional; CCSprite * laserBeam; // <----------- !!!!! That's where I want to check the collision. CCSprite * leftRingEffect; CCSprite * rightRingEffect; }

似乎不可能,但必须有一个解决办法

我有以下课程:

@interface EnemiesEntities : CCSprite {
    bool isFunctional;
    CCSprite * laserBeam;   // <----------- !!!!! That's where I want to check the collision.
    CCSprite * leftRingEffect;
    CCSprite * rightRingEffect;
}

@interface ShipEntity : CCSprite
{}
我在网上查了一下,发现这个问题的答案(对我来说)毫无用处

然后,我尝试了一种不同的方法,尝试从boudningBox开始,并将获得的矩形相对于父位置的位置更改如下:

-(BOOL) collidesWithLaser:(CCSprite*)laserBeam
{
    CGPoint newPosition = [laserBeam convertToWorldSpace:laserBeam.position];

    [laserBeam worldBoundingBox];

    CGRect laserBoundingBox = [laserBeam boundingBox];

    CGRect laserBox = CGRectMake(laserBeam.parent.position.x, laserBeam.parent.position.y, laserBoundingBox.size.width, laserBoundingBox.size.height);
    CGRect hitBox = [self hitBox];

    if(CGRectIntersectsRect([self boundingBox], laserBox))
    {
        laserBeam.showCollisionBox=TRUE;
        return TRUE;
    }
    else {
        return FALSE;
    }
}
不幸的是,只有当父精灵的旋转设置为0.0时,这才起作用,但当它实际更改时,它不起作用(可能是因为边界框相对于父节点而不是世界)

我有点不知所措,想知道你们中是否有人在解决这个问题时运气更好,以及使用了哪种解决方案(请使用代码片段:)

编辑以响应@LearnCos2D答案:

我按照建议添加了以下代码,但这些代码无法正常工作(例如,尝试使用Enemiesenties对象旋转到-130.0f)


问题在于我认为:

 CGPoint newPosition = [laserBeam convertToWorldSpace:laserBeam.position];
laserBeam不在laserBeam的空间中,而是在laserBeam的父空间中。因此,正确的答案是:

 CGPoint newPosition = [[laserBeam parent] convertToWorldSpace:laserBeam.position];
全部代码

-(BOOL)对撞激光:(CCSprite*)激光束 { CGPoint newPosition=[laserBeam convertToWorldSpace:laserBeam.position]; CGRect laserBeam boundingBox=[laserBeam boundingBox]; laserBoundingBox.origin=新位置

CGRect hitBox = [self boundingBox];
hitbox.origin = [[self parent] convertToWorldSpace:hitbox.origin];

if(CGRectIntersectsRect(hitbox, laserBoundingBox))
{
    laserBeam.showCollisionBox=TRUE;
    return TRUE;
}
else {
    return FALSE;
}

}

对于两个边界框,请执行以下操作:

bbox.origin = [self convertToWorldSpace:bbox.origin];
现在您可以比较矩形

更新到更新:

边界框是一个轴对齐的边界框

如果旋转实体,则边界框大小将增大,以包含精灵的所有角。因此,在测试轴对齐的边界框时,即使距离节点相对较远,也可能检测到碰撞(相交)

在ccConfig.h中,有一个选项可以打开以绘制精灵边界框,您应该将其设置为1以查看边界框:
\define CC\u sprite\u DEBUG\u draw 1


对于定向矩形,您需要不同的数据结构和不同的交集测试,请参见示例。

Hi Steffen,谢谢,但不幸的是,它不起作用。激光束似乎丢失了旋转信息(在类中,即使父类具有不同的旋转值(例如-135.0f),它仍将旋转值保持为0)。我将使用我尝试的代码添加编辑。
CGRect hitBox = [self boundingBox];
hitbox.origin = [[self parent] convertToWorldSpace:hitbox.origin];

if(CGRectIntersectsRect(hitbox, laserBoundingBox))
{
    laserBeam.showCollisionBox=TRUE;
    return TRUE;
}
else {
    return FALSE;
}
bbox.origin = [self convertToWorldSpace:bbox.origin];