cocos2d-x-3.3-020-碰撞检测2-物理引擎初探,cocos2d碰撞检测
原文同步发布于我的wiki,查看原文或更新请移步:
点击打开链接
原理
不懂了,没深入研究物理引擎。。。但用用还是可以的。
Demo及源码
基于cocos 3.4final
https://github.com/cheyiliu/CollisionDetection
Demo解读
每隔5s生成: 两架飞机,并从右往左飞行; 两颗子弹,从左向右飞。
注册碰撞事件监听,剩下的事情就是等待碰撞事件的回调了。
若发生碰撞,则播放相关动画
主要代码
构建物理世界
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);
其他和上一篇cocos2d-x-3.3-019-碰撞检测1-矩形区域是否相交一样,略
优缺点
优点: 相比通过自己判断矩形区域是否有相交,省了相关的辅助数据结构和逻辑,代码看上去更精炼了。
缺点: 首先肯定会有性能上的损失,但主观判断下应该不大。
效果图
开了debug模式 https://github.com/cheyiliu/All-in-One/raw/master/res/cocos2d/CollisionDetection-way2-use-physics-engine.gif
扩展阅读
http://blog.csdn.net/tonny_guan/article/details/39584055
http://www.bkjia.com/Androidjc/954422.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/954422.htmlTechArticlecocos2d-x-3.3-020-碰撞检测2-物理引擎初探,cocos2d碰撞检测 原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接 原理 不懂了,没...