Lab

Cocos2d-x:Box2Dのスプライト位置が安定したかどうか調べる

 Tag :  Published : 2014-2-8

Pocket

IsAwake、SetAwakeを使用します。
スプライトの位置が安定したかどうか調べる、もしくは設定します。

準備

Box2dのテンプレートを使用して、スプライトが落下後、着地して位置が落ち着いたら赤色になるようなサンプルを作ってみます。

テンプレートの利用に関してはこちらのページをどうぞ。

cocos2d-x Box2dのスプライトが着地したかどうか調べる

SetAllowSleepingをtrueにする必要があります。テンプレートではinitPhysics関数に、trueの状態で最初から入っています。

void HelloWorld::initPhysics()
{
    // 前後の内容は省略

    // Do we want to let bodies sleep?
    world->SetAllowSleeping(true);
}
    

addNewSpriteAtPosition関数内にも一行追加します。

void HelloWorld::addNewSpriteAtPosition(CCPoint p)
{
    // 前後の内容は省略

    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
    bodyDef.userData = sprite; //ここ追加
}
    

位置が安定したか調べる(IsAwake)

重力の影響を受けて、スプライトが移動している状態がAwake(起きてる)、位置が落ち着いた状態がSleep(寝てる)です。
その状態をIsAwakeで調べる事ができます。

update関数に以下のコードを追加してみます。

void HelloWorld::update(float dt)
{   
    int velocityIterations = 8;
    int positionIterations = 1;
   
    world->Step(dt, velocityIterations, positionIterations);
    
    //Iterate over the bodies in the physics world
    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
    {
        if (b->GetUserData() != NULL) {
            CCSprite* myActor = (CCSprite*)b->GetUserData();
            myActor->setPosition( CCPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO) );
            myActor->setRotation( -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()) );
            
            //追加したのはここ
            //IsAwakeがfalse(awakeしてない->sleepしてる->位置がおちついてる)だったら赤くなる
            if(!b->IsAwake())myActor->setColor(ccRED);
        }
    }
}
    

起こしたり寝かしたりする(SetAwake)

Sleep/Awakeを設定する事もできます。

    //起こす
    b->SetAwake(true);

    //寝かす
    b->SetAwake(false);
    

pageTop