一般游戏本不需要并不需要物理引擎,但是如果要进行复杂的逻辑运算模拟真实世界的话,自己写物理引擎的话就太麻烦了,比如愤怒的小鸟。所以这时候我们就可以使用物理引擎来简化工作量。
Cocos2dx自带了2个物理引擎 Box2D 和Chipmunk。Box2d使用C++实现的,而Chipmunk使用C实现的。其中Box2d基本上能模拟所有的物理效果而chipmunk则是个更轻量的引擎。在Cocos2d-x3.2版本中默认采用Chipmunk。
Chipmunk常用概念
空间 和Box2D中世界差不多。
刚体 同Box2D。
形状 包括圆形,线段,多边形。
约束 同Box2D的关节
实例 使用Chipmunk
让我们用一个简单例子来实践一下
首先是创建场景createScene()改为
//使用物理世界创建场景 auto scene = Scene::createWithPhysics(); //显示物理世界调试状态, 显示红色的框, 方便调试 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); auto layer = HelloWorld::create(); scene->addChild(layer); return scene;
然后定义一个物理空间onEnter()
Size visibleSize = Director::getInstance()->getVisibleSize(); //创建一个物理世界,用来碰撞 Sprite* edgeSpace = Sprite::create(); // 大小和屏幕的尺寸相同,debug框的宽度为3个像素 PhysicsBody* body = PhysicsBody::createEdgeBox(visibleSize, PHYSICSBODY_MATERIAL_DEFAULT, 3); //摩擦系数 body->getShape(0)->setFriction(1.0f); //反弹系数 body->getShape(0)->setRestitution(1.0f); //绑定 edgeSpace->setPhysicsBody(body); //空间放的位置 edgeSpace->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2)); addChild(edgeSpace,1);
然后添加一个函数addSprite()
//使用物理世界创建场景 auto scene = Scene::createWithPhysics(); //显示物理世界调试状态, 显示红色的框, 方便调试 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); auto layer = HelloWorld::create(); scene->addChild(layer); return scene; 然后定义一个物理空间onEnter() Size visibleSize = Director::getInstance()->getVisibleSize(); //创建一个物理世界,用来碰撞 Sprite* edgeSpace = Sprite::create(); // 大小和屏幕的尺寸相同,debug框的宽度为3个像素 PhysicsBody* boundBody = PhysicsBody::createEdgeBox(visibleSize, PHYSICSBODY_MATERIAL_DEFAULT, 3); //摩擦系数 boundBody->getShape(0)->setFriction(1.0f); //反弹系数 //boundBody->getShape(0)->setRestitution(1.0f); //绑定 edgeSpace->setPhysicsBody(boundBody); //空间放的位置 edgeSpace->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2)); addChild(edgeSpace,1); 然后添加一个函数addSprite() Size visibleSize = Director::getInstance()->getVisibleSize(); ball = Sprite::create("CloseNormal.png"); ball->setPosition(visibleSize.width / 2, visibleSize.height / 2); //创建物体,并且物体的形状为圆形,第一参数为半径,第二个参数为物体材质,第三个参数为边的厚度 PhysicsBody* ballBody = PhysicsBody::createCircle(ball->getContentSize().width / 2, PHYSICSBODY_MATERIAL_DEFAULT); //是否设置物体为静态 //ballBody->setDynamic(false); //设置物体的恢复力 ballBody->getShape(0)->setRestitution(1.0f); //设置物体的摩擦力 ballBody->getShape(0)->setFriction(0.0f); //设置物体密度 ballBody->getShape(0)->setDensity(1.0f); //设置质量 ballBody->getShape(0)->setMass(5); //设置物体是否受重力影响 ballBody->setGravityEnable(true); //设置物体的冲力 Vect force = Vect(500.0f, 1000.0f); ballBody->applyImpulse(force); //把物体添加到精灵中 ball->setPhysicsBody(ballBody); this->addChild(ball,1);
别忘了声明哦
Sprite* ball; void onEnter(); void addBall();
以上。