《PhysicsBody》->setCategoryBitmask( 整数 );まず、イベントリスナー準備の前に、それぞれのSpriteに設定するPhysicsBodyに設定をしておきます。
《PhysicsBody》->setContactTestBitmask( 整数 );
auto 変数 = EventListenerPhysicsContact::create();
衝突イベント用のイベントリスナーを用意します。これは「EventListenerPhysicsContact」というものを使います。《EventListenerPhysicsContact》->onContactBeginEventListenerPhysicsContactに用意されているイベント用のプロパティに関数を設定します。EventListenerPhysicsContactには4種類のイベント用プロパティが用意されています。それぞれ必要なものに処理用の関数を設定しておきます。
= [this](PhysicsContact &contact)->bool {……}
《EventListenerPhysicsContact》->onContactPreSolve
= [this](PhysicsContact &contact)->bool {……}
《EventListenerPhysicsContact》->onContactPostSolve
= [this](PhysicsContact &contact)l {……}
《EventListenerPhysicsContact》->onContactSeparate
= [this](PhysicsContact &contact) {……}
this->getEventDispatcher()->EventDespatcherに、EventListenerPhysicsContactを組み込みます。これはタッチ時のイベント処理などと同じですね。addEventListenerWithSceneGraphPriorityで組み込むだけです。
addEventListenerWithSceneGraphPriority(《EventListenerPhysicsContact》, this);
auto nodeA = contact.getShapeA()->getBody()->getNode();イベントが発生したスプライトは、このようにして取得します。といっても、Spriteではなく、Nodeインスタンスとして取り出しています。Nodeは、Spriteなどのウィジェットのスーパークラスです。つまりここで行っているのは、
auto nodeB = contact.getShapeB()->getBody()->getNode();
nodeA->removeFromParent();
ここでは、そのうちの1つを消しています。removeFromParentは、そのNodeが組み込まれている親から、そのNodeを取り除くものです。これで、そのNodeがレイヤーから取り除かれ、画面から消える、というわけです。※リストが表示されない場合
AddBlockなどの広告ブロックツールがONになっているとリストなどが表示されない場合があります。これらのツールをOFFにしてみてください。
#pragma execution_character_set("utf-8") #include "HelloWorldScene.h" USING_NS_CC; Scene* HelloWorld::createScene() { auto scene = Scene::createWithPhysics(); PhysicsWorld* world = scene->getPhysicsWorld(); world->setGravity(Vec2(0, -500)); world->setSpeed(1.0f); world->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); auto layer = HelloWorld::create(); scene->addChild(layer); return scene; } bool HelloWorld::init() { if (!Layer::init()) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); Director::getInstance()->setDisplayStats(false); auto material = PHYSICSBODY_MATERIAL_DEFAULT; material.density = 1.0f; // 密度 material.restitution = 0.1f; // 反発係数 material.friction = 0.5f; // 摩擦係数 sprite1 = Sprite::create("base.png"); sprite1->setPosition(origin.x + visibleSize.width / 2, origin.y + 100); this->addChild(sprite1, 1); auto baseBody = PhysicsBody::createBox(sprite1->getContentSize(), material); baseBody->setDynamic(false); baseBody->setRotationEnable(false); baseBody->setCategoryBitmask(1); baseBody->setCollisionBitmask(1); baseBody->setContactTestBitmask(1); sprite1->setPhysicsBody(baseBody); sprite1->setScaleX(2.0); sprite1->setRotation(10.0f); sprite2 = Sprite::create("character.png"); sprite2->setPosition(origin.x + visibleSize.width / 2, origin.y + 300); this->addChild(sprite2, 1); auto charBody = PhysicsBody::createCircle(sprite2->boundingBox().size.width / 2, material); charBody->setMass(10.0f); charBody->setDynamic(true); charBody->setRotationEnable(true); charBody->setCategoryBitmask(1); charBody->setCollisionBitmask(1); charBody->setContactTestBitmask(1); sprite2->setPhysicsBody(charBody); auto listener = EventListenerPhysicsContact::create(); listener->onContactBegin = [this](PhysicsContact &contact)->bool { auto nodeA = contact.getShapeA()->getBody()->getNode(); auto nodeB = contact.getShapeB()->getBody()->getNode(); nodeA->removeFromParent(); return true; }; this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this); return true; }
<< 前へ |