野菜部落物理引擎实现

来源:互联网 发布:c语言计算圆面积 编辑:程序博客网 时间:2024/04/29 22:09

概述

这回我们主要讲一下物理引擎在我们的游戏中的使用,主要是实现游戏的主要逻辑

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

尾声

啊啊啊,不好,背单词的时间到了,不好意思了,明天会继续向大家展示物理引擎部分,主要是碰撞检测等问题




0 0
原创粉丝点击