Cocos2dx中Box2D的简单使用

1. 所需头文件

#include "Box2D/Box2D.h"

2. Box2D的一些概念

世界(Worlds),就是Box2D对物理世界的抽象。在抽象出来的结构体中可以设置加速度,调用物理模拟等功能。Box2D世界中的一切物体都由World创建(工厂方法)和销毁。这个"世界"被抽象为b2World结构体。


物体(Bodies),物体是对现实世界中的物品的抽象。它有线速度,角速度,位置等属性。注意这些属性都是些不可“感觉“的属性,可以把它想象成一个质心,没有大小,没有质量,没有密度。要将物体转成现实生活中的样子,我们需要使用定制器来定制它。物体被抽象为b2BodyDef结构体


定制器(Fixtures),定制器定制物体的大小,形状,材质,密度属性等,一个物体可以有多个定制器,我们可以用各种定制器来把物体弄成长得很像现实生活的物体,用来模拟它们的行为。定制器被抽象为b2FixtureDef结构体。


3. 代码

首先初始化我们需要的世界:

    b2Vec2 gravity; 
    gravity.Set(0.0f, -10.0f); //一个向下10单位的向量,作为重力减速度,Box2D中默认的单位是秒和米
    mWorld = new b2World(gravity); // 创建一个有重力加速度的世界

    b2BodyDef bodyDef;   //一个物体的定义
    bodyDef.type = b2_staticBody; //物体的类型,不动的,坚硬的~ 可以把这样的物体当成地面
    b2PolygonShape borderShape; // 一个方形的形状
    b2FixtureDef borderFixture; // 一个定制器

    //定义地板
    bodyDef.position.Set(0, 0); // 地板在0,0位置
    borderShape.SetAsBox(VisibleRect::right().x * PTM_RATIO, 0); //设置长度和高度,这里描述的地板就像是X轴,是一条线
    borderFixture.shape = &borderShape;
    b2Body * bottomBorder = mWorld->CreateBody(&bodyDef); //在世界中创建一个物体(地面)
    bottomBorder->CreateFixture(&borderFixture);          //定制地面的形状

在这个世界中,只有一个小球,不断的落下,弹起,永远不会停止~~~

    CCSprite * ball = CCSprite::create("CloseNormal.png"); //小球对应的精灵
    ball->setAnchorPoint(ccp(0.5, 0.5));
    ball->setPosition(VisibleRect::center());
    this->addChild(ball);

    bodyDef.type = b2_dynamicBody; //小球是可以动的
    bodyDef.userData = ball;    //这只是为了保存数据,可以通过物体找到对应的精灵
    bodyDef.linearDamping = 0.0f; //初速度为0
    bodyDef.position.Set(ball->getPositionX() * PTM_RATIO, ball->getPositionY()* PTM_RATIO); //初始位置
    mBallBody = mWorld->CreateBody(&bodyDef); // 在Box2D世界中创建一个物体

    b2PolygonShape bodyShape;
    bodyShape.SetAsBox(20* PTM_RATIO, 20* PTM_RATIO); //小球的大小和形状~ 方形的???圆形的应该是b2CircleShape

    b2FixtureDef bodyFixture; //小球的定制器
    bodyFixture.density = 1;  // 密度
    bodyFixture.shape = &bodyShape; //形状
    bodyFixture.friction = 0.1f; //摩擦力,因为掉落过程中没有物体间的摩擦,所以没用
    bodyFixture.restitution = 1.0f; //弹力,100%反弹~~~
    mBallBody->CreateFixture(&bodyFixture);

4. 注意事项

cocos2dx中的物理引擎默认将一个像素认为是1m,极限速度是120m/s, 所以默认情况下的自由落体很容易变成匀速运动。这里我定义了一个常量PTM_RATIO,代表着像素与米的换算比例,每当有距离时,便做个换算,可以比较好的模拟一些运动情况。


5. 代码

https://github.com/shazi129/MyCocoDemo.git 中的/Classes/Box2DTest文件夹





<pre>
 

你可能感兴趣的:(C++,cocos2dx,box2D)