加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx Physics 物理世界

发布时间:2020-12-14 16:58:22 所属栏目:百科 来源:网络整理
导读:创建物理场景: 重写createScene Scene * HelloWorld ::createScene () { auto scene = Scene ::createWithPhysics (); scene - getPhysicsWorld() - setDebugDrawMask(PhysicsWorld ::DEBUGDRAW_ALL ); //显示调试信息 scene - getPhysicsWorld() - setGrav

创建物理场景:
重写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 碰撞后

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读