• 16--Box2D使用(二、显示物理世界)


             在上一篇文章中我们创建了的一个物理世界,当物理世界中的刚体一个也没有显示出来。为显示物理世界中的物体,我们需要引入GLES-Render(调试Box2D使用)。这两个文件可以再

             %Cocos_Home%samplesCppTestCppClassesBox2DTestBed中找到,将这两个文件拷贝到项目中并引入工程中。

    image

            再声明一个变量

        b2World* world;
        b2Body* wallBody ;
    
        float32 wallLineOffset ;
    
        GLESDebugDraw* m_debugDraw;  //调试物理世界绘制对象

           声明两个函数

        void printDebugDraw(bool isPrint);
        virtual void draw();

           printDebugDraw实现

    void HelloWorld::printDebugDraw(bool isPrint){
        if(!isPrint)
            return;
        //根据像素与米的转换系数创建调试绘制对象
        m_debugDraw = new GLESDebugDraw( PIXEL_TO_METER );
        world->SetDebugDraw(m_debugDraw);   
    
        uint32 flags = 0;    
        flags += b2Draw::e_shapeBit;    //显示刚体上的形状 
        //        flags += b2Draw::e_jointBit;    //显示关节
        //        flags += b2Draw::e_aabbBit;
        //        flags += b2Draw::e_pairBit;
        //        flags += b2Draw::e_centerOfMassBit;
        m_debugDraw->SetFlags(flags);
        
    }

            draw实现

    void HelloWorld::draw()  
    {  
        CCLayer::draw();
    
        ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
    
        kmGLPushMatrix();
    
        world->DrawDebugData();
    
        kmGLPopMatrix();
    
    }

            修改createWorld

    void HelloWorld::createWorld()
    {
        b2Vec2 gravity;
        gravity.Set(0.0f,-9.0f);   //物理世界重力向量,这里创建一个向下的重力向量
        b2BodyDef* bodydef = new b2BodyDef();
        world = new b2World(gravity);    //根据重力向量创建物理世界对象
    
        world->SetAllowSleeping(true);   //允许休眠    
        world->SetWarmStarting(true);    //初始状态将受到重力影响
    
        printDebugDraw(true);
    }
           现在运行看看效果吧

    若水GIF截图_2014年8月1日13点48分46秒

         物理世界的物体就显示出来了,但那几个球怎么没有动呢?不用急,是因为我们还没有让物理世界运行起来。

          让物理世界运行起来

          添加函数

    void HelloWorld::update(float dt)
    {
        //速度迭代次数
        int velocityIterations = 8;
        //位置迭代次数
        int positionIterations = 1;
    
        world->Step(dt, velocityIterations, positionIterations);  //dt为时间步长
    
    }

           在init方法中添加代码

    bool HelloWorld::init()
    {
        //////////////////////////////
        // 1. super init first
        if ( !CCLayer::init() )
        {
            return false;
        }
    
        wallLineOffset = 0.5;
    
        this->createWorld();
        this->createWall();
        this->createBall();
    
        this->scheduleUpdate(); //不断调用update函数 
    
    
         ……
       
    
        return true;
    }

           再运行看看效果

    若水GIF截图_2014年8月1日14点2分56秒

  • 相关阅读:
    Python接入支付宝进行PC端支付
    python3.6安装pycrypto,pycrytodome和crypto
    Redis
    python时区设置——pytz模块
    redis介绍以及安装
    转译符,re模块,random模块
    正则表达式
    走进模块
    面向对象进阶
    pycharm快捷键
  • 原文地址:https://www.cnblogs.com/BlueBeauty/p/3884862.html
Copyright © 2020-2023  润新知