Skip to content

cocos2d x 3.3 020 碰撞检测2 物理引擎初探

cheyiliu edited this page Feb 5, 2015 · 2 revisions

原理

  • 不懂了,没深入研究物理引擎。。。但用用还是可以的。

Demo及源码

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);

优缺点

  • 优点: 相比通过自己判断矩形区域是否有相交,省了相关的辅助数据结构和逻辑,代码看上去更精炼了。
  • 缺点: 首先肯定会有性能上的损失,但主观判断下应该不大。

效果图

  • 开了debug模式 CollisionDetection-way2-use-physics-engine.gif

扩展阅读

Clone this wiki locally