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

    Cocos2d-x之物理世界(创建静态的物体)

    在HelloWorldScene.h中添加如下内容

    //创建一个地板

        void addGround();

    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     //调用update方法,实现每帧都改变物理世界中的物体
     50     scheduleUpdate();
     51 
     52     return true;
     53 }
     54 
     55 
     56 //实现模拟物理世界的方法(当前一帧与上一帧的时间差)
     57 void HelloWorld::update(float dt){
     58     
     59     //使用这个step方法来一步一步的模拟我们的物理世界
     60     //(时间差(当前一步与最后一步的时间差,即当前一帧与上一帧的时间差),
     61     //速度迭代,模拟物理世界的过程中难免会有误差,所以就用速度迭代的次数来避免误差,官方建议8次,
     62     //位置的迭代,官方建议3次)
     63     world->Step(dt, 8, 3);
     64     
     65     //为了获取矩形,所以在这里定义一个Sprite
     66     Sprite *s;
     67     
     68     //获取移动的矩形
     69     //在这里获取到所有的子集的对象
     70     //遍历所有的子集对象,
     71     for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) {
     72         //判断,因为只有一个动态的物体,所以可以这么判断,否则,要用别的方法
     73         if (b->GetType() == b2_dynamicBody) {
     74             //获取到移动的物体的y 位置
     75             log("%f",b->GetPosition().y);
     76             
     77             if (b->GetUserData()) {
     78                 s = (Sprite*)b->GetUserData();
     79                 
     80                 //让Sprite与body同步
     81                 s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y * RATIO);
     82             }
     83         }
     84     }
     85 }
     86 
     87 
     88 //创建矩形,并且让其随着重力开始运动,有加速度的向下移动
     89 void HelloWorld::addRect(){
     90     
     91     //config box2d
     92     ///*******************************************************************
     93     //定义一个b2BodyDef物体
     94     b2BodyDef def;
     95     
     96 //    //指定def的初始化的position,x轴是0,y轴是10,代表着从10往下落
     97 //    def.position = b2Vec2(0, 10);
     98     //定义完比例后开始修改位置,因为最高为6米,所以y轴定义为5,x轴最大为10米
     99     def.position = b2Vec2(3, 5);
    100     
    101     //配置物体的属性
    102     //b2_dynamicBody是枚举类型的,代表运动的物体,
    103     //还有b2_staticBody  代表静态的物体
    104     //还有b2_kinematicBody  代表悬浮的物体
    105     def.type = b2_dynamicBody;//此时这是个运动的物体
    106     
    107     //创建一个物体(物体的相关的定义)
    108     b2Body *body = world->CreateBody(&def);
    109     
    110     ///*******************************************************************
    111     
    112     
    113     
    114     
    115     //指定物体的fixture
    116     ///*******************************************************************
    117     
    118     b2PolygonShape shape;
    119     shape.SetAsBox(0.5, 0.5);//设置一个一米的箱子
    120     
    121     
    122     b2FixtureDef fixtureDef;
    123     //指定fixtuer的属性
    124     fixtureDef.density = 1;//密度
    125     fixtureDef.friction = 0.3;//摩擦系数
    126     fixtureDef.shape = &shape;
    127     body->CreateFixture(&fixtureDef);
    128     
    129     ///*******************************************************************
    130     
    131     
    132     
    133     
    134     
    135     //config cocos shape
    136     ///*******************************************************************
    137     //定义一个图形
    138     auto s = Sprite::create();
    139 //    //指定他的Texture图形区域
    140 //    s->setTextureRect(Rect(0, 0, 80, 80));
    141 
    142     //指定加入fixture的图形的区域
    143     s->setTextureRect(Rect(0, 0, 0.5 * 2 * RATIO, 0.5 * 2 * RATIO));
    144     
    145     //将其添加到层中
    146     addChild(s);
    147     
    148     //配置位置
    149     //cocos2d的图形区域的位置是(800 x 600)
    150     //box2d的范围单位是米,官方文档上的比较精确的范围是10米之内
    151     //意味着800px的位置当成10米是比较合理的,所以中间的比例是80
    152     
    153 //    //因为每一帧都同步了,所以此处可以不要了,
    154 //    //因为update中的s->setPosition(b->GetPosition().x * RATIO,
    155 //    //b->GetPosition().y * RATIO);所以就不要了
    156 //    //配置s的位置
    157 //    s->setPosition(Point(def.position.x * RATIO, def.position.y * RATIO));
    158     
    159     //将图形和body相关起来
    160     body->SetUserData(s);//这样就将图形和body绑定起来了
    161     
    162     ///*******************************************************************
    163     
    164     
    165     
    166     
    167 }
    168 
    169 //添加一个地板
    170 void HelloWorld::addGround(){
    171     
    172     //创建一个静态的物体
    173     
    174     b2BodyDef def;
    175     //指定位置
    176 //    def.position = b2Vec2(0, 0);
    177     //为了让创建的地板铺满底部,
    178     def.position = b2Vec2(400 / RATIO, 0);
    179     //指定def的类型,静态的物体
    180     def.type = b2_staticBody;
    181     
    182     b2Body *body = world->CreateBody(&def);
    183     
    184     
    185     b2PolygonShape groundShape;
    186     //默认情况下指的是半宽和半高,单位为米
    187     groundShape.SetAsBox(400 / RATIO, 0.5);
    188     
    189     b2FixtureDef fixuredef;
    190     //指定fixture的属性
    191     fixuredef.density = 1;//密度
    192     fixuredef.friction = 0.3;//摩擦系数
    193     //为其指定一个图形区域,让其与其他图形有一个碰撞的作用
    194     fixuredef.shape = &groundShape;
    195     
    196     body->CreateFixture(&fixuredef);
    197     
    198     
    199 }
  • 相关阅读:
    数据库
    Xpath表达式
    错误:向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们
    xmlhttp status各类Http请求状态(status)及其含义
    配置ckeditor3.0 和ckfinder
    程序默认用管理员身份打开(vs2010)
    (转)CKFinder破解的方法,去掉提示
    无法嵌入互操作类型“SHDocVw.ShellWindowsClass”。请改用适用的接口
    ASP.NET页面执行顺序
    回调函数
  • 原文地址:https://www.cnblogs.com/dudu580231/p/4388746.html
Copyright © 2011-2022 走看看