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];