zoukankan      html  css  js  c++  java
  • 15--Box2D使用(一、创建物理世界)

              创建工程Box2DTest,去掉背景和精灵对象等。首先在HelloWorldScene.h头文件定义一个屏幕像素与物理世界长度转换宏,并引入box2D头文件

        #define PIXEL_TO_METER 30 
        #include "Box2D/Box2D.h"

              再声明几个函数与变量

        void createWorld();  //创建物理世界
        void createWall();   //创建四周墙体
        void createBall();   //创建刚体
     

         b2World* world;
        b2Body* wallBody ;

        float32 wallLineOffset ;

            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);    //初始状态将受到重力影响
    
    }

             createWall实现

    void HelloWorld::createWall(){
        CCSize s = CCDirector::sharedDirector()->getVisibleSize();
    
        b2BodyDef wallDef ;   //刚体定义
        wallDef.position.Set(0,0);  //位置
    
        wallBody = world->CreateBody(&wallDef);   //创建一个刚体(四周墙体)
    
        b2EdgeShape wallShape;   //形状
        //下   wallLineOffset 方便调整显示位置
        wallShape.Set(b2Vec2(0,0+wallLineOffset), b2Vec2(s.width/PIXEL_TO_METER,0+wallLineOffset));  //设置形状大小
    
        wallBody->CreateFixture(&wallShape,0);   //将形状连接到框架上
        //
        wallShape.Set(b2Vec2(0,s.height/PIXEL_TO_METER-wallLineOffset),b2Vec2(s.width/PIXEL_TO_METER,s.height/PIXEL_TO_METER-wallLineOffset));
        wallBody->CreateFixture(&wallShape,0);
        //
        wallShape.Set(b2Vec2(0+wallLineOffset,s.height/PIXEL_TO_METER),b2Vec2(0+wallLineOffset,0));
        wallBody->CreateFixture(&wallShape,0);
        //
        wallShape.Set(b2Vec2(s.width/PIXEL_TO_METER-wallLineOffset,s.height/PIXEL_TO_METER),b2Vec2(s.width/PIXEL_TO_METER-wallLineOffset,0));
        wallBody->CreateFixture(&wallShape,0);
    }

           createBall实现

    void HelloWorld::createBall(){
        CCSize s = CCDirector::sharedDirector()->getVisibleSize();
        for(int i= 0; i < 5; i++)
        {
            b2BodyDef ballDef ;
            ballDef.type = b2_dynamicBody;  //设置刚体为动态物体
    
            b2CircleShape circleShape ;    //刚体碰撞使用的形状
            b2FixtureDef ballFixtureDef ;
    
            circleShape.m_p.Set(1.0+i,5.0);
            circleShape.m_radius= 0.5f;
    
            //刚体连接的框架设置
            ballFixtureDef.shape = &circleShape; 
            ballFixtureDef.density = 1.0;
            ballFixtureDef.restitution = 0.8;    //设置重力恢复系数
            ballFixtureDef.friction = 0.3f;
    
            ballDef.position.Set(s.width/2/PIXEL_TO_METER,20/PIXEL_TO_METER);
            b2Body* ball = world->CreateBody(&ballDef); //根据刚体定义创建刚体
            ball->CreateFixture(&ballFixtureDef);       //关联框架到刚体上
        }
    }

            最后再init方法中添加如下代码

    wallLineOffset = 0.5;
    
        this->createWorld();
        this->createWall();
        this->createBall();

           最后我们运行看看什么情况

    image

            呵呵,我们创建的物体世界没有显示出来,下一篇中我们把物理世界显示出来。

  • 相关阅读:
    Swift-自定义类的构造函数
    Swift-存储属性,计算属性,类属性
    iOS-UICollectionViewController协议及回调
    Swift-数组
    Swift-switch使用注意点
    Swift-setValuesForKeysWithDictionary
    解决IDEA Struts2 web.xml问题
    枚举类
    增强for循环 -- foreach循环
    静态导入
  • 原文地址:https://www.cnblogs.com/BlueBeauty/p/3884776.html
Copyright © 2011-2022 走看看