2017-07-11 7 views
0

私はいくつかのチュートリアルの後にFlappy Birdゲームをやっています。スコアをカウントするために、私はスコアの範囲の中でPhysicsBodyを設定しましたが、これはUnityのRigibodyのようなものです。他のオブジェクトはそれを通過できません。Cocos2dでトリガーエリアを作る方法

参考になるのはhttps://www.youtube.com/watch?v=3zGTCGgwt_U&list=PLRtjMdoYXLf7GSD9crXIjMQiRuIZ7mUVp&index=12です。私が望む結果です。私はそれに従ったが、なぜここに違いがあるのか​​分からない。

私の状況では、スコアラインが私の飛ぶ鳥をブロックします。スコアラインとパイプが後ろに移動するにつれて、私の華やかな鳥は、スクリーンの端に達するまでスコアラインによって押され、ゲームオーバーに変わります。

私はUnityでトリガーコライダーのようなものが欲しいです。 cocos2dに類似のものはありますか? ryemossの参照に

void Pipe::Spawn(Layer* pipeLayer) { 
    auto upperPipe = Sprite::create("pipe_upper.png"); 
    upperPipe->setAnchorPoint(Vec2(0.5,0)); 
    upperPipe->setScale(spriteScale); 
    auto upperPipeBody = PhysicsBody::createBox(upperPipe->getContentSize()); 

    upperPipeBody->setDynamic(false); 
    upperPipeBody->setCollisionBitmask(OBSTACLE_COLLISION_BITMASK); 
    upperPipeBody->setContactTestBitmask(true); 
    upperPipe->setPhysicsBody(upperPipeBody); 

    auto bottomPipe = Sprite::create("pipe_bottom.png"); 
    bottomPipe->setAnchorPoint(Vec2(0.5,1)); 
    bottomPipe->setScale(spriteScale); 

    auto bottomPipeBody = PhysicsBody::createBox(bottomPipe->getContentSize()); 
    bottomPipeBody->setDynamic(false); 
    bottomPipeBody->setCollisionBitmask(OBSTACLE_COLLISION_BITMASK); 
    bottomPipeBody->setContactTestBitmask(true); 
    bottomPipe->setPhysicsBody(bottomPipeBody); 

    float randomPosIndex = CCRANDOM_0_1(); 
    if (randomPosIndex < PIPE_BOTTOM_THRESHOLD) { 
     randomPosIndex = PIPE_BOTTOM_THRESHOLD; 
    } 
    else if (randomPosIndex > PIPE_UPPER_THRESHOLD) { 
     randomPosIndex = PIPE_UPPER_THRESHOLD; 
    } 

    float gapHeight = Sprite::create("flappybird1_01.png")->getContentSize().height * spriteScale * PIPE_GAP_INDEX; 

    Size visibleSize = Director::getInstance()->getVisibleSize(); 
    //setup bottom pipe 
    bottomPipe->setPosition(Point(visibleSize.width, visibleSize.height * randomPosIndex)); 
    //setup upper pipe 
    upperPipe->setPosition(Point(visibleSize.width, bottomPipe->getPositionY() + gapHeight)); 
    //setup score area 
    auto scoreNode = Node::create(); 
    auto scoreNodeBody = PhysicsBody::createBox(Size(1, gapHeight)); 
    scoreNodeBody->setDynamic(false); 
    scoreNodeBody->setCollisionBitmask(SCORE_COLLISION_BITMASK); 
    scoreNodeBody->setContactTestBitmask(true); 
    scoreNode->setPhysicsBody(scoreNodeBody); 

    scoreNode->setPosition(Point(bottomPipe->getPositionX(), bottomPipe->getPositionY() + gapHeight/2)); 

    auto bottomPipeAction = RepeatForever::create(MoveBy::create(1, Vec2(-PIPE_MOVE_SPEED, 0))); 
    auto upperPipeAction = RepeatForever::create(MoveBy::create(1, Vec2(-PIPE_MOVE_SPEED, 0))); 
    auto scoreNodeAction = RepeatForever::create(MoveBy::create(1, Vec2(-PIPE_MOVE_SPEED, 0))); 
    bottomPipe->runAction(bottomPipeAction); 
    upperPipe->runAction(upperPipeAction); 
    scoreNode->runAction(scoreNodeAction); 

    pipeLayer->addChild(bottomPipe); 
    pipeLayer->addChild(upperPipe); 
    pipeLayer->addChild(scoreNode); 

    CCLOG("Spawn Pipe"); 
} 
+0

ココス!=団結...私はcocos2dを使ったことがないが、あなたは、衝突に [リンク](http://www.cocos2d-x.org/wiki/Physics) –

+0

@ryemossあなたは私の人です!私はそれを撮影するつもりです。ありがとう! – ryeMoss

+0

をフィルタリングすることができますように見えます –

答えて

0

クレジット:

はまた、パイプだけでなく、スコアラインを生成します、ここに私のコードを添付します。コリジョンコールバック関数でfalseを返すだけですべてが解決されます!

bool GameScene::onContactBegin(PhysicsContact &contact) 
{ 
    PhysicsBody* a = contact.getShapeA()->getBody(); 
    PhysicsBody* b = contact.getShapeB()->getBody(); 

    if ((a->getCollisionBitmask() == FLAPPYBIRD_COLLISION_BITMASK && b->getCollisionBitmask() == OBSTACLE_COLLISION_BITMASK) || 
     (b->getCollisionBitmask() == FLAPPYBIRD_COLLISION_BITMASK && a->getCollisionBitmask() == OBSTACLE_COLLISION_BITMASK) 
     ) 
    { 
     auto gameoverScene = GameOverScene::createScene(); 
     Director::getInstance()->replaceScene(TransitionFade::create(SCENE_TRANSITION_DURATION, gameoverScene)); 
    } 
    else if ((a->getCollisionBitmask() == FLAPPYBIRD_COLLISION_BITMASK && b->getCollisionBitmask() == SCORE_COLLISION_BITMASK) || 
     (b->getCollisionBitmask() == FLAPPYBIRD_COLLISION_BITMASK && a->getCollisionBitmask() == SCORE_COLLISION_BITMASK)) 
    { 
     score++; 
     CCLOG("Score Count: %i", score); 
     return false; 
    } 

    return true; 
} 
関連する問題