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と衝突するということ。
このような設定をすると物理設定をオンにし、衝突イベントを取得できるようになりましたとさ。