物理引擎初探(未完待續。。)

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

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

以上。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章