《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;
}
| << 前へ |