0

衝突検出に問題があります (box2D や Chipmunk ではなく、cocos2d を使用しています)。基本的に、私はCCSprite であるPlayerと、同じく CCSprite であるProjectilesを持っています。これまでのところ、CGRectIntersectRect を使用してすべてが正常に機能していますが、ゲームでは、プレイヤーは常にプレイヤーの前にあるスーパー レーザー オブ ドゥームを起動できます。私がそれを含めた方法は、それをplayerの子として追加することなので、回転や移動などについて行うコードはもうありません。しかし、私が抱えている問題は、レーザーの位置がシーンではなくプレーヤーに追加されるため、レーザーの位置が常に 0,0 であるため、発射物との衝突を正しく検出しないことです。

これが私のコードです:

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

}

私は何に焦点を当てるべきだと思いますか?衝突を検出する簡単な方法はありますか、それともシーンにレーザーを追加し、プレイヤーと一緒に動かすコードを追加する必要がありますか?

ご回答誠にありがとうございました!

4

2 に答える 2

0

あなたはいくつかのことを試すことができます:

  1. シーンとプレーヤーからのconvertToWorldSpaceとで遊ぶconvertToNodeSpace

  2. シーンにレーザーを配置し、プレーヤーを移動するとレーザーも移動します

    • レーザーの参照をプレーヤーに送信し、プレーヤーでメソッドをオーバーライドできsetPosition()ます

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

      ここでは、プレーヤーを移動するたびに (CCMoveTo、CCMoveBy など)、レーザーも移動します。

    • 他のオプションは、プレーヤーを動かしたときに同じアクションをレーザーに送信することです
于 2013-03-21T04:03:57.343 に答える
0

CCNode メソッドconvertToWorldSpace:を使用して、発射体のバウンディング ボックスの位置 (原点) をワールド空間座標に変換します。これにより、発射物がシーンに追加されたかのように座標が変換されます。つまり、位置はスクリーン座標 0,0 に対して相対的になります。

于 2013-03-20T17:59:27.580 に答える