2013-03-20 120 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