Cocos2d-x之物理世界(创建静态的物体)
2015-04-02 22:53
453 查看
Cocos2d-x之物理世界(创建静态的物体)
在HelloWorldScene.h中添加如下内容
//创建一个地板
void addGround();
HelloWorldScene。cpp
在HelloWorldScene.h中添加如下内容
//创建一个地板
void addGround();
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(); //调用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::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); }
相关文章推荐
- Cocos2d-x之物理世界(创建悬浮的物体)
- Cocos2d-x之物理世界(创建运动的物体)
- Cocos2d-x之物理世界(物体之间的碰撞)
- 关于Cocos2d-x中物理世界的物体乱跳的问题的解决
- cocos2d-x 3.0学习-使用Physicals创建物理世界
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(四)游戏场景:背景与我机的创建、敌机的创建、物理世界构建
- 愤怒的小鸟-物理世界Box2d(1)-静态刚体的创建
- 关于Cocos2D-X在pause时物理世界物体仍缓慢受重力影响的解决方案
- Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界
- Cocos2d-x-3.10 创建没有重力的物理世界
- Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界
- Jbox2D入门学习一物理世界及最简单的物体创建
- Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界
- cocos2d-x之物理世界(创建物理世界)
- cocos2d-x游戏开发 跑酷(四) 关联物理世界
- cocos2d-x快乐的做让人快乐的游戏3:cocos-2d 3.x中的物理世界
- Cocos2d-x v3.0物理系统 利用PhysicsEditor创建多边形
- 【熟悉引擎第一步】Cocos2d-x 3.x中使用物理引擎创建边界
- Cocos2dEditor-java模拟物理世界的相关知识
- cocos2d-x 3.2 物理世界PhysicsWorld