一般游戏本不需要并不需要物理引擎,但是如果要进行复杂的逻辑运算模拟真实世界的话,自己写物理引擎的话就太麻烦了,比如愤怒的小鸟。所以这时候我们就可以使用物理引擎来简化工作量。
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();
以上。
转载于:https://blog.51cto.com/10057720/1626133