原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接
原理
- 不懂了,没深入研究物理引擎。。。但用用还是可以的。
Demo及源码
- 基于cocos 3.4final
- https://github.com/cheyiliu/CollisionDetection
Demo解读
主要代码
- 构建物理世界
auto scene = Scene::createWithPhysics(); scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//debug模式 Vect gravity = Vect(0.0f,0.0f);//0重力 scene->getPhysicsWorld()->setGravity(gravity);
- 设置物理世界的大小
//定义世界的边界 auto body = PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT,5.0f); auto edgeNode = Node::create(); edgeNode->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2)); edgeNode->setPhysicsBody(body); this->addChild(edgeNode);
- 注册碰撞事件的监听
// 注册物理碰撞事件监听 auto listener = EventListenerPhysicsContact::create(); listener->onContactBegin = [this](PhysicsContact& contact) { return true; }; listener->onContactPreSolve = [] (PhysicsContact& contact,PhysicsContactPreSolve& solve) { // log("onContactPreSolve"); return true; }; listener->onContactPostSolve = [] (PhysicsContact& contact,const PhysicsContactPostSolve& solve) { // log("onContactPostSolve"); }; listener->onContactSeperate = [](PhysicsContact& contact) { log("onContactSeperate"); }; Director::getInstance()->getEventdispatcher()->addEventListenerWithFixedPriority( listener,1);
- 给精灵设置物理body
//设置物理body auto body = PhysicsBody::createBox(sp->getContentSize()); body->setContactTestBitmask(0xFFFFFFFF); sp->setPhysicsBody(body);
优缺点
效果图
- 开了debug模式https://github.com/cheyiliu/All-in-One/raw/master/res/cocos2d/CollisionDetection-way2-use-physics-engine.gif
扩展阅读
原文地址:https://www.jb51.cc/cocos2dx/344480.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。