您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x之物理世界(创建悬浮的物体)

2015-04-02 23:34 381 查看
Cocos2d-x之物理世界(创建悬浮的物体)

在HelloWorldScene.h中添加如下内容

//创建一个运动的物体,运动的矩形

void addRect(float x, float y, b2BodyType type);

HelloWorldScene。cpp

#include "HelloWorldScene.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"

USING_NS_CC;

using namespace cocostudio::timeline;

//定义中间的比例为80(box2d和cocos2d的转换比例)
#define RATIO 80.0f

Scene* HelloWorld::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create();

// 'layer' is an autorelease object
auto layer = HelloWorld::create();

// add layer as a child to scene
scene->addChild(layer);

// return the scene
return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
//创建一个世界,b2world(二维矢量类型的,指定世界的加速度的方向
//b2Vec2(加速度的方向,向下的,所以x轴没有为0,y轴为-10))这样才能往下落
world = new b2World(b2Vec2(0, -10));

//添加一个矩形,然后调用scheduleUpdate方法,实现矩形的下落,随着重力加速向下运动
addRect();

//添加一个地板
addGround();

//复制矩形的代码后,他只是不受重力的影响
//让矩形在x轴平移
addRect(0, 5, b2_kinematicBody);

//调用update方法,实现每帧都改变物理世界中的物体
scheduleUpdate();

return true;
}

//实现模拟物理世界的方法(当前一帧与上一帧的时间差)
void HelloWorld::update(float dt){

//使用这个step方法来一步一步的模拟我们的物理世界
//(时间差(当前一步与最后一步的时间差,即当前一帧与上一帧的时间差),
//速度迭代,模拟物理世界的过程中难免会有误差,所以就用速度迭代的次数来避免误差,官方建议8次,
//位置的迭代,官方建议3次)
world->Step(dt, 8, 3);

//为了获取矩形,所以在这里定义一个Sprite
Sprite *s;

//获取移动的矩形
//在这里获取到所有的子集的对象
//遍历所有的子集对象,
for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) {
//        //判断,因为只有一个动态的物体,所以可以这么判断,否则,要用别的方法
//        if (b->GetType() == b2_dynamicBody) {
//让所有的类型都要刷新
//获取到移动的物体的y 位置
log("%f",b->GetPosition().y);

if (b->GetUserData()) {
s = (Sprite*)b->GetUserData();

//让Sprite与body同步
s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y * RATIO);
}
//        }
}
}

//创建矩形,并且让其随着重力开始运动,有加速度的向下移动
void HelloWorld::addRect(){

//config box2d
///*******************************************************************
//定义一个b2BodyDef物体
b2BodyDef def;

//    //指定def的初始化的position,x轴是0,y轴是10,代表着从10往下落
//    def.position = b2Vec2(0, 10);
//定义完比例后开始修改位置,因为最高为6米,所以y轴定义为5,x轴最大为10米
def.position = b2Vec2(3, 5);

//配置物体的属性
//b2_dynamicBody是枚举类型的,代表运动的物体,
//还有b2_staticBody  代表静态的物体
//还有b2_kinematicBody  代表悬浮的物体
def.type = b2_dynamicBody;//此时这是个运动的物体

//创建一个物体(物体的相关的定义)
b2Body *body = world->CreateBody(&def);

///*******************************************************************

//指定物体的fixture
///*******************************************************************

b2PolygonShape shape;
shape.SetAsBox(0.5, 0.5);//设置一个一米的箱子

b2FixtureDef fixtureDef;
//指定fixtuer的属性
fixtureDef.density = 1;//密度
fixtureDef.friction = 0.3;//摩擦系数
fixtureDef.shape = &shape;
body->CreateFixture(&fixtureDef);

///*******************************************************************

//config cocos shape
///*******************************************************************
//定义一个图形
auto s = Sprite::create();
//    //指定他的Texture图形区域
//    s->setTextureRect(Rect(0, 0, 80, 80));

//指定加入fixture的图形的区域
s->setTextureRect(Rect(0, 0, 0.5 * 2 * RATIO, 0.5 * 2 * RATIO));

//将其添加到层中
addChild(s);

//配置位置
//cocos2d的图形区域的位置是(800 x 600)
//box2d的范围单位是米,官方文档上的比较精确的范围是10米之内
//意味着800px的位置当成10米是比较合理的,所以中间的比例是80

//    //因为每一帧都同步了,所以此处可以不要了,
//    //因为update中的s->setPosition(b->GetPosition().x * RATIO,
//    //b->GetPosition().y * RATIO);所以就不要了
//    //配置s的位置
//    s->setPosition(Point(def.position.x * RATIO, def.position.y * RATIO));

//将图形和body相关起来
body->SetUserData(s);//这样就将图形和body绑定起来了

///*******************************************************************
}

//直接复制上面的代码
//创建矩形,并且让其随着重力开始运动,有加速度的向下移动
void HelloWorld::addRect(float positionx, float positiony, b2BodyType type){

//config box2d
///*******************************************************************
//定义一个b2BodyDef物体
b2BodyDef def;

//    //指定def的初始化的position,x轴是0,y轴是10,代表着从10往下落
//    def.position = b2Vec2(0, 10);
//定义完比例后开始修改位置,因为最高为6米,所以y轴定义为5,x轴最大为10米
def.position = b2Vec2(positionx, positiony);

//设置矩形的线性初速度
def.linearVelocity = b2Vec2(1, 0);

//配置物体的属性
//b2_dynamicBody是枚举类型的,代表运动的物体,
//还有b2_staticBody  代表静态的物体
//还有b2_kinematicBody  代表悬浮的物体
def.type = type;//此时这是个运动的物体

//创建一个物体(物体的相关的定义)
b2Body *body = world->CreateBody(&def);

///*******************************************************************

//指定物体的fixture
///*******************************************************************

b2PolygonShape shape;
shape.SetAsBox(0.5, 0.5);//设置一个一米的箱子

b2FixtureDef fixtureDef;
//指定fixtuer的属性
fixtureDef.density = 1;//密度
fixtureDef.friction = 0.3;//摩擦系数
fixtureDef.shape = &shape;
body->CreateFixture(&fixtureDef);

///*******************************************************************

//config cocos shape
///*******************************************************************
//定义一个图形
auto s = Sprite::create();
//    //指定他的Texture图形区域
//    s->setTextureRect(Rect(0, 0, 80, 80));

//指定加入fixture的图形的区域
s->setTextureRect(Rect(0, 0, 0.5 * 2 * RATIO, 0.5 * 2 * RATIO));

//将其添加到层中
addChild(s);

//配置位置
//cocos2d的图形区域的位置是(800 x 600)
//box2d的范围单位是米,官方文档上的比较精确的范围是10米之内
//意味着800px的位置当成10米是比较合理的,所以中间的比例是80

//    //因为每一帧都同步了,所以此处可以不要了,
//    //因为update中的s->setPosition(b->GetPosition().x * RATIO,
//    //b->GetPosition().y * RATIO);所以就不要了
//    //配置s的位置
//    s->setPosition(Point(def.position.x * RATIO, def.position.y * RATIO));

//将图形和body相关起来
body->SetUserData(s);//这样就将图形和body绑定起来了

///*******************************************************************

}

//添加一个地板
void HelloWorld::addGround(){

//创建一个静态的物体

b2BodyDef def;
//指定位置
//    def.position = b2Vec2(0, 0);
//为了让创建的地板铺满底部,
def.position = b2Vec2(400 / RATIO, 0);
//指定def的类型,静态的物体
def.type = b2_staticBody;

b2Body *body = world->CreateBody(&def);

b2PolygonShape groundShape;
//默认情况下指的是半宽和半高,单位为米
groundShape.SetAsBox(400 / RATIO, 0.5);

b2FixtureDef fixuredef;
//指定fixture的属性
fixuredef.density = 1;//密度
fixuredef.friction = 0.3;//摩擦系数
//为其指定一个图形区域,让其与其他图形有一个碰撞的作用
fixuredef.shape = &groundShape;

body->CreateFixture(&fixuredef);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: