cocos2d-x游戏开发 跑酷(二) 物理世界
2014-05-22 14:58
609 查看
原创,转载请注明出处:http://blog.csdn.net/dawn_moon/article/details/21240343
泰然的跑酷用的chipmunk物理引擎,我没有仔细学过这个东西。不过我看了一下他们的用法,感觉跟box2d差不多。box2d用纯真的面向对象C++开发,用在这里应该没有问题,试一下。
泰然的工程没有加入box2d模块,所以需要添加。将external/Box2D加入工程,将无用的引用删掉,加入后结构如下
![](http://img.blog.csdn.net/20140314130117484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3bl9tb29u/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
然后新建一个PlayScene类,开始创建物理世界。
为了方便调试box2d物理世界,需要接入debug渲染器,将TestCpp/Classes/Box2DTestBed/下的GLES-Render.h和GLES-Render.cpp加入到工程,这个可以绘制出物理模型的形状。
因为box2d针对0-10米的仿真做过优化,所以我这里将像素大小映射到10左右
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
#define RATIO 32
看下PlayScene.h
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
//
// PlayScene.h
// Parkour
//
// Created by lerry on 14-3-14.
// Copyright (c) 2014年 Goonear Co.,Ltd. All rights reserved.
//
#ifndef __Parkour__PlayScene__
#define __Parkour__PlayScene__
#include "cocos2d.h"
#include "Box2D.h"
#include "GLES-Render.h"
#define RATIO 32
#define GROUND_HEIGHT 57
#define RUUNER_STARTX 80
class PlayScene : public cocos2d::CCLayer
{
b2World* mWorld;
GLESDebugDraw* mDebugDraw;
private:
// 初始化物理世界
void initPhysics();
// 绘制物理世界debug区域
void draw();
// 开启物理世界debug
void setDebug(bool isDebug);
public:
virtual bool init();
virtual void update(float dt);
CREATE_FUNC(PlayScene);
static cocos2d::CCScene* scene();
};
#endif /* defined(__Parkour__PlayScene__) */
现在主要有一个初始化物理世界的函数initPhysics()函数,在这里创建了一个地板。
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
void PlayScene::initPhysics()
{
mWorld = new b2World(b2Vec2(0, -10));
mWorld->SetAllowSleeping(true);
mWorld->SetContinuousPhysics(true);
// mWorld->SetContactListener(this);
// 地板body
b2Body* ground = NULL;
b2BodyDef bd;
ground = mWorld->CreateBody(&bd);
// 地板
b2EdgeShape shape;
shape.Set(b2Vec2(0, GROUND_HEIGHT / RATIO), b2Vec2(INT_MAX, GROUND_HEIGHT / RATIO));
ground->CreateFixture(&shape, 0.0f);
setDebug(true);
}
这里创建了一个边缘形状,边缘形状类似静态物体,但是它没有体积。box2d里面的碰撞算法要求碰撞的两个物体至少一个要有体积,所以边缘形状不能和边缘形状碰撞,可以和其他形状类物体碰撞。
box2d的物理世界有自己的世界循环函数,跟cocos2d-x的update函数类似,所以在update函数里面调用box2d的迭代函数
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
void PlayScene::update(float dt)
{
// 物理世界的迭代函数
mWorld->Step(dt, 10, 8);
}
Step函数的参数解释一下,第一个时间参数,单步迭代步长,第二个参数单步时间内速度迭代次数,第三个参数但不是件内位置迭代次数。这几个参数有建议值,我这里就取这几个值。
然后在MainScene.cpp的onPlay函数里面填上回调的实现:
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
// start按钮回调
void MainScene::onPay()
{
CCLog("onPlay click");
// 创建带过渡的场景
CCScene* s = CCTransitionFade::create(1, PlayScene::scene());
CCDirector::sharedDirector()->replaceScene(s);
}
这里加了一个过渡场景,跑起来看到一条线,初步完成。
泰然的跑酷用的chipmunk物理引擎,我没有仔细学过这个东西。不过我看了一下他们的用法,感觉跟box2d差不多。box2d用纯真的面向对象C++开发,用在这里应该没有问题,试一下。
泰然的工程没有加入box2d模块,所以需要添加。将external/Box2D加入工程,将无用的引用删掉,加入后结构如下
然后新建一个PlayScene类,开始创建物理世界。
为了方便调试box2d物理世界,需要接入debug渲染器,将TestCpp/Classes/Box2DTestBed/下的GLES-Render.h和GLES-Render.cpp加入到工程,这个可以绘制出物理模型的形状。
因为box2d针对0-10米的仿真做过优化,所以我这里将像素大小映射到10左右
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
#define RATIO 32
看下PlayScene.h
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
//
// PlayScene.h
// Parkour
//
// Created by lerry on 14-3-14.
// Copyright (c) 2014年 Goonear Co.,Ltd. All rights reserved.
//
#ifndef __Parkour__PlayScene__
#define __Parkour__PlayScene__
#include "cocos2d.h"
#include "Box2D.h"
#include "GLES-Render.h"
#define RATIO 32
#define GROUND_HEIGHT 57
#define RUUNER_STARTX 80
class PlayScene : public cocos2d::CCLayer
{
b2World* mWorld;
GLESDebugDraw* mDebugDraw;
private:
// 初始化物理世界
void initPhysics();
// 绘制物理世界debug区域
void draw();
// 开启物理世界debug
void setDebug(bool isDebug);
public:
virtual bool init();
virtual void update(float dt);
CREATE_FUNC(PlayScene);
static cocos2d::CCScene* scene();
};
#endif /* defined(__Parkour__PlayScene__) */
现在主要有一个初始化物理世界的函数initPhysics()函数,在这里创建了一个地板。
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
void PlayScene::initPhysics()
{
mWorld = new b2World(b2Vec2(0, -10));
mWorld->SetAllowSleeping(true);
mWorld->SetContinuousPhysics(true);
// mWorld->SetContactListener(this);
// 地板body
b2Body* ground = NULL;
b2BodyDef bd;
ground = mWorld->CreateBody(&bd);
// 地板
b2EdgeShape shape;
shape.Set(b2Vec2(0, GROUND_HEIGHT / RATIO), b2Vec2(INT_MAX, GROUND_HEIGHT / RATIO));
ground->CreateFixture(&shape, 0.0f);
setDebug(true);
}
这里创建了一个边缘形状,边缘形状类似静态物体,但是它没有体积。box2d里面的碰撞算法要求碰撞的两个物体至少一个要有体积,所以边缘形状不能和边缘形状碰撞,可以和其他形状类物体碰撞。
box2d的物理世界有自己的世界循环函数,跟cocos2d-x的update函数类似,所以在update函数里面调用box2d的迭代函数
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
void PlayScene::update(float dt)
{
// 物理世界的迭代函数
mWorld->Step(dt, 10, 8);
}
Step函数的参数解释一下,第一个时间参数,单步迭代步长,第二个参数单步时间内速度迭代次数,第三个参数但不是件内位置迭代次数。这几个参数有建议值,我这里就取这几个值。
然后在MainScene.cpp的onPlay函数里面填上回调的实现:
[cpp] view
plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
// start按钮回调
void MainScene::onPay()
{
CCLog("onPlay click");
// 创建带过渡的场景
CCScene* s = CCTransitionFade::create(1, PlayScene::scene());
CCDirector::sharedDirector()->replaceScene(s);
}
这里加了一个过渡场景,跑起来看到一条线,初步完成。
相关文章推荐
- cocos2d-x游戏开发 跑酷(四) 关联物理世界
- cocos2d-x游戏开发 跑酷(四) 关联物理世界
- cocos2d-x游戏开发 跑酷(四) 关联与物理世界
- cocos2d-x游戏开发 跑酷(两) 物理世界
- cocos2d-x游戏开发 跑酷(二) 物理世界
- Cocos2d-X游戏【泰然网《跑酷》】JS到C++移植5:初始化物理世界【Chipmunk】
- 【cocos2d-x IOS游戏开发-城市跑酷9】没有各种坑还叫游戏吗
- 【cocos2d-x IOS游戏开发-城市跑酷17】Game Over,主角死亡?+死亡特效:帽子飞起来!
- 【cocos2d-x IOS游戏开发-城市跑酷2】python create_project
- 【cocos2d-x IOS游戏开发-城市跑酷12】男一号上场,大家鼓掌!
- 【cocos2d-x IOS游戏开发-城市跑酷16】碰撞检测:撞墙 or 从房子上掉下来
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法 推荐
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【cocos2d-x IOS游戏开发-城市跑酷19】游戏效果图及资源引用页
- cocos2d-x游戏开发 跑酷(三) 人物跑动
- 【cocos2d-x IOS游戏开发-城市跑酷15】完善积分板【CCLabelBMFont】
- [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面
- 【Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- Cocos2d-X游戏开发之物理引擎Box2D基础篇(十五)
- 【cocos2d-x IOS游戏开发-城市跑酷4】设置“道具”:云、路灯、竞技团队