cocos2d-x游戏开发 跑酷(四) 关联与物理世界
2015-12-13 20:58
387 查看
原创。转载注明出处/article/1495320.html
前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的帧动画而已。这一节我要实现精灵和物理世界关联。让这个人跟实际的Parkour一样,有实际体积,会碰撞。
一个精灵怎么样和一个物理的body关联起来。使他具有一个刚体的特性。在cocos2d-x box2d 入门这篇文章里面,我有简单讲了一下。
有人说将一个body的userData设为精灵就能够了,事实上这是不够的。body的userData是一个void型指针,用来存放用户自己定义数据。
假设只这样赋值一下,你会发现,精灵和刚体是分开运动的。这个userData是为了存放精灵,在兴许位置迭代的时候方便取出这个精灵,然后将它和刚体的位置同步。
看cocos2d-x
box2d 入门里面的update函数。就知道还须要做位置迭代的。
为了方便,我把引擎自带的物理精灵CCPhysicsSprite改了一下,去掉了chipmunk的代码,保留了box2d的接口。
这个就是一个box2d的物理精灵B2Sprite。
然后将Runner里面的成员变量mRunner类型改成B2Sprite,其创建函数也要改动为
[cpp] view
plaincopyprint?
mRunner = B2Sprite::createWithSpriteFrameName(runner0);
mRunnerSize = mRunner->getContentSize();
然后实现initBody()和initShape()函数
[cpp] view
plaincopyprint" style="color:rgb(160,160,160); text-decoration:none; background-color:inherit; border:none; padding:0px; margin:0px 10px 0px 0px; font-size:9px">?
void Runner::initBody()
{
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
// 初始速度1.5
bodyDef.linearVelocity = b2Vec2(1.5, 0);
bodyDef.position = b2Vec2(getOffsetPx() / RATIO, (GROUND_HEIGHT + mRunnerSize.height / 2 )/ RATIO);
mBody = mWorld->CreateBody(&bodyDef);
// 关联起来
mRunner->setB2Body(mBody);
mRunner->setPTMRatio(RATIO);
}
void Runner::initShape()
{
b2PolygonShape shape;
// 定义runner的形状,一个box,參数是半宽高
shape.SetAsBox(mRunnerSize.width / 2 / RATIO, mRunnerSize.height / 2 / RATIO);
b2FixtureDef fixDef;
fixDef.shape = &shape;
mBody->CreateFixture(&fixDef);
}
然后跑起来就看到一个带碰撞区域的精灵
前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的帧动画而已。这一节我要实现精灵和物理世界关联。让这个人跟实际的Parkour一样,有实际体积,会碰撞。
一个精灵怎么样和一个物理的body关联起来。使他具有一个刚体的特性。在cocos2d-x box2d 入门这篇文章里面,我有简单讲了一下。
有人说将一个body的userData设为精灵就能够了,事实上这是不够的。body的userData是一个void型指针,用来存放用户自己定义数据。
假设只这样赋值一下,你会发现,精灵和刚体是分开运动的。这个userData是为了存放精灵,在兴许位置迭代的时候方便取出这个精灵,然后将它和刚体的位置同步。
看cocos2d-x
box2d 入门里面的update函数。就知道还须要做位置迭代的。
为了方便,我把引擎自带的物理精灵CCPhysicsSprite改了一下,去掉了chipmunk的代码,保留了box2d的接口。
这个就是一个box2d的物理精灵B2Sprite。
然后将Runner里面的成员变量mRunner类型改成B2Sprite,其创建函数也要改动为
[cpp] view
plaincopyprint?
mRunner = B2Sprite::createWithSpriteFrameName(runner0);
mRunnerSize = mRunner->getContentSize();
然后实现initBody()和initShape()函数
[cpp] view
plaincopyprint" style="color:rgb(160,160,160); text-decoration:none; background-color:inherit; border:none; padding:0px; margin:0px 10px 0px 0px; font-size:9px">?
void Runner::initBody()
{
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
// 初始速度1.5
bodyDef.linearVelocity = b2Vec2(1.5, 0);
bodyDef.position = b2Vec2(getOffsetPx() / RATIO, (GROUND_HEIGHT + mRunnerSize.height / 2 )/ RATIO);
mBody = mWorld->CreateBody(&bodyDef);
// 关联起来
mRunner->setB2Body(mBody);
mRunner->setPTMRatio(RATIO);
}
void Runner::initShape()
{
b2PolygonShape shape;
// 定义runner的形状,一个box,參数是半宽高
shape.SetAsBox(mRunnerSize.width / 2 / RATIO, mRunnerSize.height / 2 / RATIO);
b2FixtureDef fixDef;
fixDef.shape = &shape;
mBody->CreateFixture(&fixDef);
}
然后跑起来就看到一个带碰撞区域的精灵
相关文章推荐
- 使用cocos2d 2.1制作一条河游戏(4): 主要的游戏逻辑BaseLayer设计
- Cocos2d-JS游戏导演
- cocos2d-x学习笔记(11)回调CallFunc,lambda
- Cocos2d-JS场景树
- cocos2d-x 面试题
- Cocos2d-JS的屏幕适配方案
- Cocos2d-JS坐标系统
- 学习cocos-js的准备工作
- Cocos2d-x 之 自己生成API文档
- cocos2dx 的android.mk编辑 添加Classes目录下的所有cpp文件
- Cocos2D-Android-1之源码详解:16.ParticleTest
- cocos2d-x增加控制台程序代码
- cocos2d-x学习笔记(10)重复动作RepeatForever和Repeat 以及动作组合Sequence和Spawn
- cocos2d-x学习笔记(9)BezierTo和BezierBy贝赛尔曲线运动
- cocos2dx lua学习笔记 <一> quick 3.5定义本身C++类是必然lua
- Cocos2D-X shader(三) Shader and Program编程基本概念
- cocos2d-x-2.2.6在eclipse中的环境搭建
- cocos2dx3.9 + android studio2.0 搭建项目
- cocos2d-x 3.9 多点触控之iOS监听无效(只能监听到单点触控)
- COCOS2D-3.9 Application分析