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

вы можете попробовать некоторые вещи:

  1. игру с convertToWorldSpace и convertToNodeSpace от сцены и игрок

  2. поставить лазер в сцене и при перемещении игрока также переместить лазер

    • Вы можете отправить ссылку на лазер для игрока и переопределения метода setPosition() в плеере

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

      здесь, каждый раз, когда вы перемещаете игрок (CCMoveTo, CCMoveBy и т.д.) лазерный ход тоже.

    • другой вариант, когда вы перемещаете игрок отправить такое же действие на лазер
+0

Я следил за вашим вторым вариантом, и это сработало как шарм, спасибо вам очень много! : D – RaphBlanchet

0

Используйте метод CCNode convertToWorldSpace:, чтобы преобразовать положение ограничительной рамки (происхождение) снаряда в мировые космические координаты. Это преобразует координаты так, как если бы снаряд был добавлен к сцене, то есть положение становится относительно координаты экрана 0,0.

+0

Не работает :(Мой лазер выглядит следующим образом: O O> - ==== ===== Где: O - центр экрана, o> игрок, - опорная точка лазера и ======= - это лазер. Преобразует ли convertToWorldSpace вращение спрайта в поле зрения? – RaphBlanchet

+0

@ LearnCocos2d, о том, если родитель вращается, но положение детского спрайта никогда не менялось. В этом случае, что мне нужно делать? –

Смежные вопросы