概述
这回我们主要讲一下物理引擎在我们的游戏中的使用,主要是实现游戏的主要逻辑
cocos物理引擎的自我见解
cocos游戏引擎结合了Box2d物理引擎,所以它本身也支持物理引擎,,我们没必要单独引入box2d,只用cocos自带的引擎就能实现这个游戏
物理引擎的创建的大致步骤是这样的,首先是物理世界的创建,然后在物理世界里面有一种东西叫做“刚体”所谓刚体就是我们在现实世界里面遇到的一般物体,我们在物理世界里面可以设置刚体在x、y轴方向的距离来当做重力加速度,当然也可以设置摩擦力和重量、是否具有弹性等因素,具体的方法在开发者文档里面讲述得很清楚,这里就不做赘述了
野菜部落里面的物理引擎
有了上面的知识我们第一步就是创建物理世界
Scene* OfflineModeScene::createScene(){
Scene * scene = Scene::createWithPhysics();
// scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//调试使用,请在产品发布前删去该行
OfflineModeScene * layer = OfflineModeScene::create();
layer->setPhyWorld(scene->getPhysicsWorld());
scene->addChild(layer);
scene->getPhysicsWorld()->setGravity(Vect(0.0f,0.0f));
scene->getPhysicsWorld()->setAutoStep(false); //解决刚体速度过快导致的穿透问题
return scene;
}
其中调试使用那行是起到可以看到我们的body的样式方便调试的,具体可以看开发者文档,很有用的一个方法,笔者也是从开发者文档里学来的
问题一:重力加速度问题
别人的重力加速度都设置的平行于屏幕,所以很简单,但是我们的要垂直于屏幕向里,怎么办?
我们会思考到:为什么一定要有加速度呢?是的,我们的棋子又不会调到屏幕里面去,但是问题来了,棋子在碰撞的时候要有一个模仿摩擦力的过程——他会慢慢停下来,这个没有重力就没法有摩擦力(物理知识大家都懂得)幸好cocos给我们安排了一个特殊的API :setLinearDamping(3.5f); //设置线性阻尼
是的!可以设置线性阻尼!
问题二:固定障碍物的问题
我们看到游戏的棋盘中央有俩个固定的障碍物,棋子碰到障碍物会反弹回来,那么问题又来了,障碍物应该也是个刚体,刚体碰撞后会有相应的速度,也就是说障碍物会被弹飞!飞!那么怎么办呢??有人会说把线性阻尼加到最大,重力算到最大!!我最开始也是这么做的,这么做也是正确的,障碍物是不会飞了,但是它会在原地转啊转...转...这里就要用到一个方法
setRotationEnable(false); //设置刚体不可转动
这样就好了,下面贴出障碍物的源代码
/*初始化障碍物*/
Sprite *bar1 = Sprite::create("Bar.png");
auto Bar1 = PhysicsBody::createBox(bar1->getContentSize());//设置物理世界中的实体
Bar1->setDynamic(true); //设置为静态的刚体,不受重力影响
Bar1->setMass(9999999999999999999); //设置刚体不可动
Bar1->setRotationEnable(false); //设置刚体不可转动
Bar1->getShape(0)->setRestitution(1.0f); //设置刚体完全反弹
Bar1->setCategoryBitmask(1);
Bar1->setCollisionBitmask(1);
Bar1->setContactTestBitmask(1);
bar1->setPhysicsBody(Bar1); //将刚体与精灵绑定
bar1->setPosition(220,319);
bar1->setTag(101);
addChild(bar1,1);
尾声
啊啊啊,不好,背单词的时间到了,不好意思了,明天会继续向大家展示物理引擎部分,主要是碰撞检测等问题