一般遊戲本不需要並不需要物理引擎,但是如果要進行復雜的邏輯運算模擬真實世界的話,自己寫物理引擎的話就太麻煩了,比如憤怒的小鳥。所以這時候我們就可以使用物理引擎來簡化工作量。
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();
以上。