cocos2dx Physics 物理世界

来源:互联网 发布:诊所管理系统源码 编辑:程序博客网 时间:2024/05/17 22:27

创建物理场景:
重写createScene

    Scene* HelloWorld::createScene()    {        auto scene = Scene::createWithPhysics();        scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);  //显示调试信息        scene->getPhysicsWorld()->setGravity(Vec2(0.0, -100.0)); //设置重力        auto layer = HelloWorld::create();        scene->addChild(layer);        return scene;}

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

Node* HelloWorld::addEdges(){    //创建 body ,visibleSize表示body的大小, PhysicsMaterial表示材质,3表示边框的厚度    auto body = PhysicsBody::createEdgeBox(visibleSize, PhysicsMaterial(1, 1, 0), 3);    body->setCategoryBitmask(4);              //设置分类掩码    body->setContactTestBitmask(1 | 2 | 4);   //设置接触掩码    body->setCollisionBitmask(1 | 2 | 4);     //设置碰撞掩码    auto edges = Node::create();  //创建Node    edges->setPhysicsBody(body);    //设置节点的body    edges->setPosition(visibleSize / 2); //居中    this->addChild(edges);    return edges;}

添加 addBox 函数:
用于添加物体

Sprite* HelloWorld::addBox(Vec2 position){    PhysicsBody* body;    auto box = Sprite::create();    switch (random(0, 1))    {    case 0:        box->initWithFile("red.png"); //设置精灵图片        body = PhysicsBody::createCircle(box->getContentSize().width / 2); //创建圆形body        body->setCategoryBitmask(1);                //设置分类掩码        body->setContactTestBitmask(1 | 2 | 4);     //设置接触掩码        body->setCollisionBitmask(1 | 2 | 4);       //设置碰撞掩码        box->setPhysicsBody(body);                  //设置精灵的body        box->setPosition(position);                 //设置位置        this->addChild(box);        break;    case 1:        box->initWithFile("yellow.png");//设置精灵图片        body = PhysicsBody::createCircle(box->getContentSize().width / 2);        body->setCategoryBitmask(2);                //设置分类掩码        body->setContactTestBitmask(1 | 2 | 4);     //设置接触掩码        body->setCollisionBitmask(1 | 2 | 4);       //设置碰撞掩码        box->setPhysicsBody(body);                  //设置精灵的body        box->setPosition(position);                 //设置位置        this->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 碰撞后
这里写图片描述

0 0
原创粉丝点击