2013-03-20 169 views
0

我在碰撞檢測中遇到問題(我正在使用cocos2d,而不是box2D或Chipmunk)。基本上,我有玩家,這是一個CCSprite,和投射物,也CCSprite。使用CGRectIntersectRect到目前爲止一切正常,但在遊戲中,玩家可以啓動超級激光厄運,這總是在玩家面前。我將它加入的方式是將其作爲玩家的孩子添加,因此我沒有任何其他代碼可以處理旋轉或移動等東西。但是我遇到的問題是,它沒有正確檢測到與彈丸的碰撞,因爲激光的位置總是0,0,因爲它被添加到了玩家而不是場景中。Cocos2D簡單碰撞檢測一個精靈,另一個精靈的子女

這裏是我的代碼:

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

} 

那你覺得我應該集中上?有沒有一種簡單的方法來檢測碰撞,還是應該在場景中添加激光並添加代碼以使其隨播放器一起移動?

非常感謝您的回答!

回答

0

你可以嘗試一些事情:

從現場播放的 convertToWorldSpaceconvertToNodeSpace
  1. 發揮

  2. 把激光在現場,當您移動播放器還移動激光

    • 您可以發送激光給玩家和覆蓋方法setPosition()在玩家

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

      這裏,每次當您移動播放器(CCMoveTo,CCMoveBy等)激光器的舉動太花時間。

    • 另一種選擇是,當您移動播放器發送相同的動作,以激光
+0

我跟着你的第二個選擇,它像一個魅力工作,非常感謝你! :d – RaphBlanchet 2013-03-24 07:24:34

0

使用CCNode方法convertToWorldSpace:將拋射體的邊界框位置(原點)轉換爲世界空間座標。這會轉換座標,就像投射物被添加到場景中一樣,即位置相對於屏幕座標0,0變化。

+0

不工作:(我的激光器是這樣的:Ω0> - ==== ===== 其中:O是屏幕的中心,o>是播放器, - 是激光的錨點,=======是激光。是否convertToWorldSpace旋轉了精靈考慮如何? – RaphBlanchet 2013-03-20 18:26:09

+0

@ LearnCocos2d如果父母輪換,但孩子的精靈位置從未改變,那麼該怎麼辦? – 2016-08-09 05:35:27