Cocos2d-x中Physics物理引擎碰撞检测,setCategoryBitmask,setCo
发布时间:2020-12-14 21:44:12 所属栏目:百科 来源:网络整理
导读:看了一篇文章,然后自己测试了一下,应用起来应该是对的。之前阅读过的详细讲解 物理世界的创建 Scene* TestPhysics::createScene(){ auto scene=Scene::createWithPhysics();//需要创建为物理场景 scene-getPhysicsWorld()-setDebugDrawMask(PhysicsWorld::
看了一篇文章,然后自己测试了一下,应用起来应该是对的。之前阅读过的详细讲解 物理世界的创建 Scene* TestPhysics::createScene(){ auto scene=Scene::createWithPhysics();//需要创建为物理场景 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//显示所有参数 scene->getPhysicsWorld()->setGravity(Vec2(0,-800));//设置重力参数 auto layer=TestPhysics::create(); scene->addChild(layer); return scene; } 创建物理边界,首先Scene应该是包含物理效果的,如上方式创建的 auto size=Director::getInstance()->getVisibleSize();//获取窗口大小 auto body=PhysicsBody::createEdgeBox(size,PHYSICSBODY_MATERIAL_DEFAULT,3);//创建物理边界,宏表示边框的默认材质,3表示线的粗细 auto node=Node::create();//创建一个节点,用于绑定这个物理边界,东西都创建在边界里,不然会飞到无限远吧???我的猜想 node->setPhysicsBody(body);//添加物理边界到节点 node->setPosition(Vec2(480,320)); this->addChild(node);//节点添加到层 创建物理碰撞体 auto box=Sprite::create(); box->setTextureRect(Rect(0,50,50));//可以直接创建一个图片精灵 box->setPhysicsBody(PhysicsBody::createBox(box->getContentSize()));//设置碰撞体的形状和大小,这里是矩形盒子 box->setPosition(position); box->setColor(Color3B(255,0)); this->addChild(box); 这样精灵就能受物理世界影响了。 下面再说碰撞 首先是碰撞事件监听 //添加一个碰撞监听器 auto contactListener=EventListenerPhysicsContact::create();//创建监听器 //<strong><span style="color:#ff0000;">检测到</span></strong>碰撞发生时的事件,还有可能是检测不到的 contactListener->onContactBegin=[](PhysicsContact &contact){ log("pengzhuang!"); return true; }; Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener,this); //添加监听器 关于碰撞的三个参数的设置 参数为4字节掩码 通常写成 0x00000000 0xFFFFFFFF等,掩码用来执行 “逻辑与” 即 “按位与” 运算。 还可以写成其他格式,如下: #define RED_BIT_MASK 0b0100 #define GREEN_BIT_MASK 0b0010 #define BLUE_BIT_MASK 0b0001 下面来说作用和区别 box->getPhysicsBody()->setContactTestBitmask(int bitmask);//设置是否触发碰撞事件,默认掩码0x00000000 如果两个碰撞的物体,掩码逻辑与运算值为0,则不触发碰撞事件,不会执行碰撞回调函数。结果不为0则会触发 </pre><pre name="code" class="cpp"> box->getPhysicsBody()->setCollisionBitmask(int bitmask);//设置碰撞对象的掩码,如果对象类型掩码与此处设置相同则可以碰撞,默认与所有都能碰撞 </pre><pre name="code" class="cpp"> box->getPhysicsBody()->setCategoryBitmask(int bitmask);//设置物体本身的类型,默认不为0,设置为0时物体不能碰撞,也不能与墙壁碰撞
算了,实例有点复杂,自己一个一个去试就好了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |