cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk。我目前使用的是最新版的cocos2dx 3.1.1。引擎中默认使用的是chipmunk,如果想要改使用box2d的话,需要修改对应的android工程或者是ios工程的配置文件。
在2.x版本的cocos中,使用物理引擎的步骤十分繁琐。但在3.x版本中变得非常方便了。我这次的学习目标是制作一个打砖块的小游戏。
首先,现在的Scene类提供了一个静态工厂方法,用以创造一个集成物理引擎的场景。
Scene::initWithPhysics()
这个方法能让你的场景具备创建物理世界的基本条件,接下来我们设置这个屋里世界的重力条件,因为打砖块游戏中不需要重力的影响,所以我们把该场景里的重力设置为0:
PhysicsWorld* world = getPhysicsWorld();
world->setGravity(Vec2(0,0));
然后我们要给这个物理世界创造一个边界,便于我们观察效果,我的做法是把物理世界的scene和游戏逻辑的实现分开,新建一个继承自layer的类来写游戏逻辑:
这是头文件:
1 #include "Util.h"
2
3 #ifndef __FristGame__GameLayer__
4 #define __FristGame__GameLayer__
5
6 class GameLayer:public Layer
7 {
8 public:
9 Sprite* ball;
10 Sprite* paddle;
11 Sprite* edgeSp;
12 Sprite* prop;
13 PhysicsBody* ballBody;
14 TMXTiledMap* map;
15
16 CREATE_FUNC(GameLayer);
17 bool init();
18
19 void loadPhysicsBody();//加载物理世界的边界
20 void loadTileMap();//加载使用tiledmap地图编辑器制作的地图
21 void loadProp();//加载碰撞特定砖块会掉落的道具
22 void update1(float dt);//打开一个定时器
23 void contact();//碰撞事件注册
24 };
25 #endif /* defined(__FristGame__GameLayer__) */
小提示:在3.2版本的物理世界中我们不能使用scheduleupdate()函数,似乎body(刚体)的运动是在update里处理的,一旦我们重写了这个函数,物理世界中的小球就不再运动了。所以我们另外设置一个定时器update1来使用。
这是cpp文件:
1 #include "GameLayer.h"
2 bool GameLayer::init()
3 {
4 loadTileMap();
5 loadPhysicsBody();
6 return true;
7 }
8 void GameLayer::loadPhysicsBody()
9 {
10 auto visibleSize = Director::getInstance()->getVisibleSize();//取得当前屏幕的尺寸size
11 auto origin = Director::getInstance()->getVisibleOrigin();
12
13 edgeSp = Sprite::create();//创建一个精灵
14 auto boundBody = PhysicsBody::createEdgeBox(visibleSize,PhysicsMaterial(0.0f,1.0f,0.0f),3);//edgebox是不受刚体碰撞影响的一种刚体,我们用它来设置物理世界的边界
15 ed