cocos2dx 3.0で物体の衝突検知 #cocos2dx
タッチイベントの取得ができたので、次は衝突検知に挑戦。
参考にさせて頂いた記事。
cocos2d-xで引っぱりゲーを作ってみる - ことばアルバム
Cocos2d-x 3.0 RC1とRC2の違いに悩まされた | FrogEgg | フロッグエッグ
画像を物体化して、衝突検知するイベントリスナー立てて、衝突検知したら起動する関数を設定する。
まずは「物理エンジンを使います。」という宣言。
auto scene = Scene::create()
下記のように書き換える。
Scene* HelloWorld::createScene()
{
auto scene = Scene::createWithPhysics();
猫画像を物体化する。
//猫画像 Sprite* cat = Sprite::create("cat70px.png"); cat->setPosition(Point(visibleSize.width / 5 , visibleSize.height / 2)); PhysicsBody* pCat = PhysicsBody::createCircle(40); pCat->setMass(1.0f); pCat->setContactTestBitmask(1); cat->setPhysicsBody(pCat); cat->setTag(1); layer->addChild(cat);
「setContactTestBitmask」ってのを設定しないと、衝突検知できないらしい。。(詳細な仕様調査中。)
衝突検知のイベントリスナー。
//衝突判定 auto contactListener = EventListenerPhysicsContact::create(); contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, layer); layer->getEventDispatcher()->addEventListenerWithFixedPriority(contactListener, 10);
「CC_CALLBACK_1」じゃないとだめっぽい。
衝突検知したら、onContactBeginを呼びます。
bool HelloWorld::onContactBegin(PhysicsContact& contact) { auto text = Label::createWithSystemFont("Collision Detected!", "HiraKakuProN-W6", 48); text->setPosition(Point(300, 200)); this->addChild(text); return true; }
参考記事の引っぱりゲーに画像追加して、衝突検知できた。
うりゃおい。#cocos2dx http://t.co/m91eQoIKdi
— しゃのん (@shanonim) September 9, 2014
左右と上に壁作らなければ。
あと、反発係数とか摩擦とか、物理演算もろもろの調整。