zoukankan      html  css  js  c++  java
  • Cocos2d-x之物理世界(创建悬浮的物体)

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

    在HelloWorldScene.h中添加如下内容

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

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

    HelloWorldScene。cpp

      1 #include "HelloWorldScene.h"
      2 #include "cocostudio/CocoStudio.h"
      3 #include "ui/CocosGUI.h"
      4 
      5 USING_NS_CC;
      6 
      7 using namespace cocostudio::timeline;
      8 
      9 //定义中间的比例为80(box2d和cocos2d的转换比例)
     10 #define RATIO 80.0f
     11 
     12 Scene* HelloWorld::createScene()
     13 {
     14     // 'scene' is an autorelease object
     15     auto scene = Scene::create();
     16     
     17     // 'layer' is an autorelease object
     18     auto layer = HelloWorld::create();
     19 
     20     // add layer as a child to scene
     21     scene->addChild(layer);
     22 
     23     // return the scene
     24     return scene;
     25 }
     26 
     27 // on "init" you need to initialize your instance
     28 bool HelloWorld::init()
     29 {
     30     //////////////////////////////
     31     // 1. super init first
     32     if ( !Layer::init() )
     33     {
     34         return false;
     35     }
     36     //创建一个世界,b2world(二维矢量类型的,指定世界的加速度的方向
     37     //b2Vec2(加速度的方向,向下的,所以x轴没有为0,y轴为-10))这样才能往下落
     38     world = new b2World(b2Vec2(0, -10));
     39     
     40     
     41     
     42     //添加一个矩形,然后调用scheduleUpdate方法,实现矩形的下落,随着重力加速向下运动
     43     addRect();
     44     
     45     //添加一个地板
     46     addGround();
     47     
     48     //复制矩形的代码后,他只是不受重力的影响
     49     //让矩形在x轴平移
     50     addRect(0, 5, b2_kinematicBody);
     51     
     52     
     53     //调用update方法,实现每帧都改变物理世界中的物体
     54     scheduleUpdate();
     55 
     56     return true;
     57 }
     58 
     59 
     60 //实现模拟物理世界的方法(当前一帧与上一帧的时间差)
     61 void HelloWorld::update(float dt){
     62     
     63     //使用这个step方法来一步一步的模拟我们的物理世界
     64     //(时间差(当前一步与最后一步的时间差,即当前一帧与上一帧的时间差),
     65     //速度迭代,模拟物理世界的过程中难免会有误差,所以就用速度迭代的次数来避免误差,官方建议8次,
     66     //位置的迭代,官方建议3次)
     67     world->Step(dt, 8, 3);
     68     
     69     //为了获取矩形,所以在这里定义一个Sprite
     70     Sprite *s;
     71     
     72     //获取移动的矩形
     73     //在这里获取到所有的子集的对象
     74     //遍历所有的子集对象,
     75     for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) {
     76 //        //判断,因为只有一个动态的物体,所以可以这么判断,否则,要用别的方法
     77 //        if (b->GetType() == b2_dynamicBody) {
     78         //让所有的类型都要刷新
     79             //获取到移动的物体的y 位置
     80             log("%f",b->GetPosition().y);
     81             
     82             if (b->GetUserData()) {
     83                 s = (Sprite*)b->GetUserData();
     84                 
     85                 //让Sprite与body同步
     86                 s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y * RATIO);
     87             }
     88 //        }
     89     }
     90 }
     91 
     92 
     93 //创建矩形,并且让其随着重力开始运动,有加速度的向下移动
     94 void HelloWorld::addRect(){
     95     
     96     //config box2d
     97     ///*******************************************************************
     98     //定义一个b2BodyDef物体
     99     b2BodyDef def;
    100     
    101 //    //指定def的初始化的position,x轴是0,y轴是10,代表着从10往下落
    102 //    def.position = b2Vec2(0, 10);
    103     //定义完比例后开始修改位置,因为最高为6米,所以y轴定义为5,x轴最大为10米
    104     def.position = b2Vec2(3, 5);
    105     
    106     //配置物体的属性
    107     //b2_dynamicBody是枚举类型的,代表运动的物体,
    108     //还有b2_staticBody  代表静态的物体
    109     //还有b2_kinematicBody  代表悬浮的物体
    110     def.type = b2_dynamicBody;//此时这是个运动的物体
    111     
    112     //创建一个物体(物体的相关的定义)
    113     b2Body *body = world->CreateBody(&def);
    114     
    115     ///*******************************************************************
    116     
    117     
    118     
    119     
    120     //指定物体的fixture
    121     ///*******************************************************************
    122     
    123     b2PolygonShape shape;
    124     shape.SetAsBox(0.5, 0.5);//设置一个一米的箱子
    125     
    126     
    127     b2FixtureDef fixtureDef;
    128     //指定fixtuer的属性
    129     fixtureDef.density = 1;//密度
    130     fixtureDef.friction = 0.3;//摩擦系数
    131     fixtureDef.shape = &shape;
    132     body->CreateFixture(&fixtureDef);
    133     
    134     ///*******************************************************************
    135     
    136     
    137     
    138     
    139     
    140     //config cocos shape
    141     ///*******************************************************************
    142     //定义一个图形
    143     auto s = Sprite::create();
    144 //    //指定他的Texture图形区域
    145 //    s->setTextureRect(Rect(0, 0, 80, 80));
    146 
    147     //指定加入fixture的图形的区域
    148     s->setTextureRect(Rect(0, 0, 0.5 * 2 * RATIO, 0.5 * 2 * RATIO));
    149     
    150     //将其添加到层中
    151     addChild(s);
    152     
    153     //配置位置
    154     //cocos2d的图形区域的位置是(800 x 600)
    155     //box2d的范围单位是米,官方文档上的比较精确的范围是10米之内
    156     //意味着800px的位置当成10米是比较合理的,所以中间的比例是80
    157     
    158 //    //因为每一帧都同步了,所以此处可以不要了,
    159 //    //因为update中的s->setPosition(b->GetPosition().x * RATIO,
    160 //    //b->GetPosition().y * RATIO);所以就不要了
    161 //    //配置s的位置
    162 //    s->setPosition(Point(def.position.x * RATIO, def.position.y * RATIO));
    163     
    164     //将图形和body相关起来
    165     body->SetUserData(s);//这样就将图形和body绑定起来了
    166     
    167     ///*******************************************************************
    168 }
    169 
    170 
    171 
    172 
    173 //直接复制上面的代码
    174 //创建矩形,并且让其随着重力开始运动,有加速度的向下移动
    175 void HelloWorld::addRect(float positionx, float positiony, b2BodyType type){
    176     
    177     //config box2d
    178     ///*******************************************************************
    179     //定义一个b2BodyDef物体
    180     b2BodyDef def;
    181     
    182     //    //指定def的初始化的position,x轴是0,y轴是10,代表着从10往下落
    183     //    def.position = b2Vec2(0, 10);
    184     //定义完比例后开始修改位置,因为最高为6米,所以y轴定义为5,x轴最大为10米
    185     def.position = b2Vec2(positionx, positiony);
    186     
    187     //设置矩形的线性初速度
    188     def.linearVelocity = b2Vec2(1, 0);
    189     
    190     //配置物体的属性
    191     //b2_dynamicBody是枚举类型的,代表运动的物体,
    192     //还有b2_staticBody  代表静态的物体
    193     //还有b2_kinematicBody  代表悬浮的物体
    194     def.type = type;//此时这是个运动的物体
    195     
    196     //创建一个物体(物体的相关的定义)
    197     b2Body *body = world->CreateBody(&def);
    198     
    199     ///*******************************************************************
    200     
    201     
    202     
    203     
    204     //指定物体的fixture
    205     ///*******************************************************************
    206     
    207     b2PolygonShape shape;
    208     shape.SetAsBox(0.5, 0.5);//设置一个一米的箱子
    209     
    210     
    211     b2FixtureDef fixtureDef;
    212     //指定fixtuer的属性
    213     fixtureDef.density = 1;//密度
    214     fixtureDef.friction = 0.3;//摩擦系数
    215     fixtureDef.shape = &shape;
    216     body->CreateFixture(&fixtureDef);
    217     
    218     ///*******************************************************************
    219     
    220     
    221     
    222     
    223     
    224     //config cocos shape
    225     ///*******************************************************************
    226     //定义一个图形
    227     auto s = Sprite::create();
    228     //    //指定他的Texture图形区域
    229     //    s->setTextureRect(Rect(0, 0, 80, 80));
    230     
    231     //指定加入fixture的图形的区域
    232     s->setTextureRect(Rect(0, 0, 0.5 * 2 * RATIO, 0.5 * 2 * RATIO));
    233     
    234     //将其添加到层中
    235     addChild(s);
    236     
    237     //配置位置
    238     //cocos2d的图形区域的位置是(800 x 600)
    239     //box2d的范围单位是米,官方文档上的比较精确的范围是10米之内
    240     //意味着800px的位置当成10米是比较合理的,所以中间的比例是80
    241     
    242     //    //因为每一帧都同步了,所以此处可以不要了,
    243     //    //因为update中的s->setPosition(b->GetPosition().x * RATIO,
    244     //    //b->GetPosition().y * RATIO);所以就不要了
    245     //    //配置s的位置
    246     //    s->setPosition(Point(def.position.x * RATIO, def.position.y * RATIO));
    247     
    248     //将图形和body相关起来
    249     body->SetUserData(s);//这样就将图形和body绑定起来了
    250     
    251     ///*******************************************************************
    252     
    253     
    254     
    255     
    256 }
    257 
    258 
    259 //添加一个地板
    260 void HelloWorld::addGround(){
    261     
    262     //创建一个静态的物体
    263     
    264     b2BodyDef def;
    265     //指定位置
    266 //    def.position = b2Vec2(0, 0);
    267     //为了让创建的地板铺满底部,
    268     def.position = b2Vec2(400 / RATIO, 0);
    269     //指定def的类型,静态的物体
    270     def.type = b2_staticBody;
    271     
    272     b2Body *body = world->CreateBody(&def);
    273     
    274     
    275     b2PolygonShape groundShape;
    276     //默认情况下指的是半宽和半高,单位为米
    277     groundShape.SetAsBox(400 / RATIO, 0.5);
    278     
    279     b2FixtureDef fixuredef;
    280     //指定fixture的属性
    281     fixuredef.density = 1;//密度
    282     fixuredef.friction = 0.3;//摩擦系数
    283     //为其指定一个图形区域,让其与其他图形有一个碰撞的作用
    284     fixuredef.shape = &groundShape;
    285     
    286     body->CreateFixture(&fixuredef);
    287     
    288     
    289 }
  • 相关阅读:
    20169218 2016-2017-2 《网络攻防实践》第八周学习总结
    20169218 2016-2017-2 《网络攻防实践》第七周学习总结
    20169218 2016-2017-2 《网络攻防实践》第六周学习总结
    20169218 2016-2017-2 《网络攻防实践》第五周学习总结
    20169218 2016-2017-2 《网络攻防实践》第四周学习总结
    十三周作业—使用Metaspoit攻击MS08-067
    20169206 2016-2017-2 《网络攻防实践》课程总结
    《网络攻防》第十四周作业-免杀
    《网络攻防》 第十二周作业 SQL注入
    《网络攻防》 第十一周作业
  • 原文地址:https://www.cnblogs.com/dudu580231/p/4388830.html
Copyright © 2011-2022 走看看