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

一般游戏本不需要并不需要物理引擎,但是如果要进行复杂的逻辑运算模拟真实世界的话,自己写物理引擎的话就太麻烦了,比如愤怒的小鸟。所以这时候我们就可以使用物理引擎来简化工作量。

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

以上。


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