shanon's note

プログラミングとアニメがすき

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;
}


参考記事の引っぱりゲーに画像追加して、衝突検知できた。


左右と上に壁作らなければ。
あと、反発係数とか摩擦とか、物理演算もろもろの調整。