2013-10-14 136 views
0

似乎不可能,但必須有解決方案。與另一個精靈作爲父母的精靈碰撞

我有以下類別:

@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; 
    } 
    } 

回答

0

的問題是在這條線,我認爲:

CGPoint newPosition = [laserBeam convertToWorldSpace:laserBeam.position]; 

的激光光束是不是在激光光束的空間,但laserBeams父空間。因此,正確的是:

CGPoint newPosition = [[laserBeam parent] convertToWorldSpace:laserBeam.position]; 

整個代碼

- (BOOL)collidesWithLaser:(CCSprite *)激光光束 { CGPoint在newPosition = [激光光束convertToWorldSpace:laserBeam.position]; CGRect laserBoundingBox = [laserBeam boundingBox]; laserBoundingBox.origin = newPosition;

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

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

}

0

兩個boundingboxes做:

bbox.origin = [self convertToWorldSpace:bbox.origin]; 

現在你可以比較rects ...

更新來更新:

boundingBox的是軸對齊包圍盒。

如果實體被旋轉,邊界框的大小會增加以包含所有精靈的邊角。因此,當測試軸對齊的邊界框時,甚至可以在離節點相對較遠的地方檢測到碰撞(相交)。

ccConfig.h有可以打開繪製精靈包圍盒,你應該將其設置爲1,看邊界框的選項:#define CC_SPRITE_DEBUG_DRAW 1

對於面向矩形,你需要不同的數據結構和不同的相交測試,例如參見this tutorial

+0

嗨Steffen,謝謝,但不幸的是它不工作。激光束似乎沒有旋轉信息(就像它在類中它將旋轉值保持爲0,即使父類具有不同的旋轉值(例如-135.0f))。我將用我試過的代碼添加一個編輯。 – mm24