Lab

Cocos2d-x:Box2Dのスプライトのアクティブ/非アクティブを設定

 Tag :  Published : 2014-2-8

Pocket

SetActive、IsActiveを使用します。
スプライトのアクティブ/非アクティブを設定、もしくは調べます。

準備

Box2dのテンプレートを使用して、画面の1/3まで落下後したスプライトは非アクティブになるようなサンプルを作ってみます。
非アクティブになったスプライトは重力の影響を受けなくなり、その場で停止します。

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

cocos2d-x Box2dのスプライトがアクティブかどうか調べる

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; //ここ追加
}
    

アクティブ/非アクティブの設定(SetActive)

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()) );
            
            //追加したのはここ
            //スプライトが画面の1/3まで落ちたら、非アクティブにする
            CCSize s = CCDirector::sharedDirector()->getWinSize();
            if(myActor->getPositionY()<s.height/3){
                b->SetActive(false);
            }
        }
    }
}
    

アクティブかどうか調べる(IsActive)

アクティブかどうか調べる事もできます。

    if(b->IsActive()){
        CCLog("アクティブです");
    }else{
        CCLog("非アクティブです");
    }
    

pageTop