cocos2dx Physics 物理世界

前端之家收集整理的这篇文章主要介绍了cocos2dx Physics 物理世界前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

创建物理场景:
重写createScene

Scene@H_502_7@* HelloWorld::createScene()
    {
        auto scene @H_502_7@= Scene::createWithPhysics();

        scene@H_502_7@->getPhysicsWorld()@H_502_7@->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);  //显示调试信息

        scene@H_502_7@->getPhysicsWorld()@H_502_7@->setGravity(Vec2(0.0,@H_502_7@-100.0)); //设置重力

        auto layer @H_502_7@= HelloWorld::create();

        scene@H_502_7@->addChild(layer);

        return scene;
}

添加 addEdges 函数
用于添加物体运动的边界

Node@H_502_7@* HelloWorld::addEdges()
{
    //创建 body ,visibleSize表示body的大小, PhysicsMaterial表示材质,3表示边框的厚度
    auto body @H_502_7@= PhysicsBody::createEdgeBox(visibleSize,PhysicsMaterial(1,1,0),3);
    body@H_502_7@->setCategoryBitmask(4);              //设置分类掩码
    body@H_502_7@->setContactTestBitmask(1 @H_502_7@| 2 @H_502_7@| 4);   //设置接触掩码
    body@H_502_7@->setCollisionBitmask(1 @H_502_7@| 2 @H_502_7@| 4);     //设置碰撞掩码

    auto edges @H_502_7@= Node::create();  //创建Node

    edges@H_502_7@->setPhysicsBody(body);    //设置节点的body

    edges@H_502_7@->setPosition(visibleSize @H_502_7@/ 2); //居中

    this@H_502_7@->addChild(edges);

    return edges;
}

添加 addBox 函数
用于添加物体

Sprite@H_502_7@* HelloWorld::addBox(Vec2 position)
{
    PhysicsBody@H_502_7@* body;
    auto Box @H_502_7@= Sprite::create();
    switch (random(0,1))
    {
    case 0:
        Box@H_502_7@->initWithFile("red.png"); //设置精灵图片

        body @H_502_7@= PhysicsBody::createCircle(Box@H_502_7@->getContentSize().width @H_502_7@/ 2); //创建圆形body
        body@H_502_7@->setCategoryBitmask(1);                //设置分类掩码
        body@H_502_7@->setContactTestBitmask(1 @H_502_7@| 2 @H_502_7@| 4);     //设置接触掩码
        body@H_502_7@->setCollisionBitmask(1 @H_502_7@| 2 @H_502_7@| 4);       //设置碰撞掩码

        Box@H_502_7@->setPhysicsBody(body);                  //设置精灵的body
        Box@H_502_7@->setPosition(position);                 //设置位置
        this@H_502_7@->addChild(Box);

        break;
    case 1:
        Box@H_502_7@->initWithFile("yellow.png");//设置精灵图片

        body @H_502_7@= PhysicsBody::createCircle(Box@H_502_7@->getContentSize().width @H_502_7@/ 2);
        body@H_502_7@->setCategoryBitmask(2);                //设置分类掩码
        body@H_502_7@->setContactTestBitmask(1 @H_502_7@| 2 @H_502_7@| 4);     //设置接触掩码
        body@H_502_7@->setCollisionBitmask(1 @H_502_7@| 2 @H_502_7@| 4);       //设置碰撞掩码

        Box@H_502_7@->setPhysicsBody(body);                  //设置精灵的body
        Box@H_502_7@->setPosition(position);                 //设置位置
        this@H_502_7@->addChild(Box);

        break;
    default:
        break;
    }
    return Box;
}

创建事件侦听器:

//刚开始碰撞触发一次
    contactListener->onContactBegin = [](PhysicsContact& contact){
        //.........
        return true;  //下面解释返回值
    };
    //接触就会一直触发
    contactListener->onContactPreSolve = [](PhysicsContact& contact,PhysicsContactPreSolve& solve){
        //.........
        return true;  //下面解释返回值
    };

首先解释CategoryBitmask, ContactTestBitmask, CollisionBitmask 三个代表含义,

CategoryBitmask: 分类掩码
ContactTestBitmask : 接触掩码
CollisionBitmask: 碰撞掩码

它们的作用如下:
当两个物体 A 和 B 碰撞后

猜你在找的Cocos2d-x相关文章