Edited at

Cocos2dxで物理エンジンをオンにするまで

More than 3 years have passed since last update.

cocos2d-xで物理エンジンをオンにする設定

手順は次の通り

1.Sceneの物理設定をオンにする

2.イベントリスナーを追加する

3.オブジェクトにPhysicsBodyを設定する

1.Sceneの物理設定をオンにする


GameScene.h


class GameScene : public Layer
{
// クラスメソッド
public:
static Scene* createPhysicsScene();
static Scene* createScene();

CREATE_FUNC(GameScene)
// インスタンスメソッド
public:
GameScene(){};
~GameScene(){};
bool init();

}


とりあえず、createPhysicsScene()メソッドを追加しました。

そして、そのメソッドでは次のようなことをやっております


GameScene.cpp


Scene* createPhysicsScene()
{
// 重力設定をオンにしてcreate
Scene* scene = Scene::createWithPhysics();

// 物理空間を取得して重力を設定
PhysicsWorld* world = scene->getPhysicsWorld();
world->setGravity(Vec2(0,-980));

GameScene* layer = GameScene::create();
scene->addChild(layer);
return scene;
}


2.イベントリスナーを追加する

加えて、衝突判定を行うためにはイベントリスナーを追加する必要があります


GameScene.cpp


bool GameScene::init()
{
////略/////

// 物理衝突リスナー
auto phlistener = EventListenerPhysicsContact::create();
phlistener->onContactBegin = CC_CALLBACK_1(GameScene::onContactBegin, this);
getEventDispatcher()->addEventListenerWithSceneGraphPriority(phlistener, this);
}


てなわけで衝突イベントメソッドを追加


GameScene.h


class GameScene : public Layer
{
// クラスメソッド
public:
static Scene* createPhysicsScene();
static Scene* createScene();

CREATE_FUNC(GameScene)
// インスタンスメソッド
public:
GameScene(){};
~GameScene(){};
bool init();

bool onContactBegin(PhysicsContact& constact); // !!new!!

}



GameScene.cpp

bool onContactBegin(PhysicsContact& constact)

{
log("当たっております。");

return true;
}


3.オブジェクトにPhysicsBodyを設定する

つづいて、このLayerにつけるオブジェクトにはPhysicsBodyや

衝突判定を行うための設定を行ってやらねばなりません


GameScene.cpp


const Size& winSize = this->getContentSize();

Sprite* ball = Sprite::create("ball.png");

// 剛体
PhysicsBody* body = PhysicsBody::createCircle(ball->getContentSize().width/2);
body->setContactTestBitmask(1);
body->setCategoryBitmask(1);

ball->setPhysicsBody(body);
ball->setOpacity(128);
ball->setPosition(Vec2(rand()%winSize.width,rand()%winSize.height));
this->addChild(ball);


ここでContactTestBitmaskとCategoryBitmaskを説明します。

ContactTestBitmaskは誰とぶつかるか、のbitmask情報です

CategoryBitmaskは自分のbitmask情報です


GameScene.cpp

body->setContactTestBitmask(3); // 3 == 0011

body->setCategoryBitmask(1); // 0001
// なので自分と同じbodyを持っているものは
// 0010や0001,0011と衝突するということ。

このような設定をすると物理設定をオンにし、衝突イベントを取得できるようになりましたとさ。