似乎不可能,但必須有解決方案。與另一個精靈作爲父母的精靈碰撞
我有以下類別:
@interface EnemiesEntities : CCSprite {
bool isFunctional;
CCSprite * laserBeam; // <----------- !!!!! That's where I want to check the collision.
CCSprite * leftRingEffect;
CCSprite * rightRingEffect;
}
@interface ShipEntity : CCSprite
{}
我只是想驗證ShipEntity和激光光束精靈(激光光束是EnemiesEntities類的成員變量和子)之間的碰撞。 [laserBeam boundingBox]方法不起作用,因爲boundingBox會將座標相對於父節點轉換爲座標系。
我試圖thend增加CCNode的方法boundingBox的相對於世界計算也是這樣一個沒有工作:
- (CGRect) worldBoundingBox
{
CGRect rect = CGRectMake(0, 0, contentSize_.width, contentSize_.height);
return CGRectApplyAffineTransform(rect, [self nodeToWorldTransform]);
}
我在網上查,發現只有無用的(對我來說)答案,same問題。
然後我嘗試了不同的方法,並試圖從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;
}
}
不幸的是這樣做纔有效,當父Sprite的旋轉設置爲0.0,但當它實際更改後,它不起作用(可能是因爲boundingBox相對於父節點而不是世界)。
我有點失落,想知道你們中的任何一個人是否在解決這個問題上有更好的運氣,以及你使用了哪種解決方案(代碼片段:))。
編輯迴應@ LearnCocos2D答案:
我跟着建議並添加以下代碼不正常工作(例如嘗試與EnemiesEntities對象旋轉到-130.0f)。
-(BOOL) collidesWithLaser:(CCSprite*)laserBeam
{
CCLOG(@"rotation %f", laserBeam.rotation);
CGRect laserBoundingBox = [laserBeam boundingBox];
laserBoundingBox.origin = [self convertToWorldSpace:laserBeam.position];
CGRect shipBoundingBox = [self boundingBox]; //As we are in ShipEntity class
shipBoundingBox.origin = [self convertToWorldSpace:shipBoundingBox.origin];
//As this method is in the ShipEntity class there is no need to convert the origin to the world space. I added a breakpoint here and doing in this way the CGRect of both ShipEntity and gets misplaced.
if(CGRectIntersectsRect(shipBoundingBox, laserBoundingBox))
{
return TRUE;
}
else {
return FALSE;
}
}
嗨Steffen,謝謝,但不幸的是它不工作。激光束似乎沒有旋轉信息(就像它在類中它將旋轉值保持爲0,即使父類具有不同的旋轉值(例如-135.0f))。我將用我試過的代碼添加一個編輯。 – mm24