cocos2dx-Box2D入门(六)

前端之家收集整理的这篇文章主要介绍了cocos2dx-Box2D入门(六)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

首先贴一段文字说明,从网上看来的 地址http://blog.comingx.com/?p=1579


Box2D是一个比较优秀的二维物理引擎,由C++编写,后由Alchemy转换成AS3。这个教程主要介绍如何创建物理世界、刚体、及其基本形状,即Box2D的Hello world。
Box2D的物理世界通常包括这样几个对象:
world:一个物理世界,所有的刚体都将存在在这个世界里面,这个世界以米为距离单位。尽量贴近真实世界的度量。
body:刚体,存在在物理世界的理想物体,比任何物体都硬,不会发生形变。body对应着一个bodyDef(刚体定义),刚体定义指定了刚体的类型(动态、静态、轨迹运动的)和刚体的位置,world通过刚体定义创建刚体。
fixture:刚体修饰物,描述刚体的一些特征。fixture对应着fixtureDef(修饰物定义),它将形状绑定到刚体上,使刚体具有一些表现特征,如密度、摩擦系数、弹性等等。body通过fixtureDef创建fixture。
shape:一个几何形状,比如圆和多边形。形状是修饰物fixture的一个属性,描述了刚体的碰撞边界。

解释一下b2World,b2Body,b2BodyDef,b2Fixture,b2FixtureDef,shpae之间的关系
1.b2World通过b2BodyDef创建b2Body,没有b2BodyDef,b2Body不知道是什么类型,放在世界什么位置。
2.b2Body通过b2FixtureDef创建b2Fixture,没有b2Fixture,b2Body不知道是什么形状,摩擦、弹性、密度都不知道。shpae提供了碰撞检测的外边框。


以下代码分析

1.创建世界

HelloWorldScene.h中添加

//声明一个世界
private:
    b2World *world;
HelloWorldScene.cpp init()方法中定义
//创建世界,参数是重力加速度,0表示横向的,-10表示纵向的
world = new b2World(b2Vec2(0,-10));

2.创建矩形

//添加矩形
void HelloWorld::addRect(){
    //config Box2d
    //物体相关定义,这个定义是相对于世界来说的,比如说位于世界的什么位置,
    //是动态的还是静态的等等;
    b2BodyDef def;
    //物体位置
    def.position=b2Vec2(3,5);
    //物体类型 三种静态,动态,漂浮物体
    def.type=b2_dynamicBody;
    //创建物体
    b2Body*body= world->CreateBody(&def);
    
    b2PolygonShape shape;
    shape.SetAsBox(0.1,0.1);
    //创建fixture之后就能与其他物体产生相互作用了,这个是物体本身的属性,
    //比如物体的密度,摩擦系数,还有形状等等,shape提供了碰撞检测的外边框
    b2FixtureDef fixtureDef;
    fixtureDef.density=1;
    fixtureDef.friction=0.3;
    fixtureDef.shape = &shape;
    body->CreateFixture(&fixtureDef);
    
    //config cocos shape
    auto s = Sprite::create();
    s->setTextureRect(Rect(0,0.1*2*RATIO,0.1*2*RATIO));
    addChild(s);
    //设置shape位置
    s->setPosition(Point(def.position.x*RATIO,def.position.y*RATIO));
    //把body和图形绑定起来
    body->SetUserData(s);
} 

创建静态背景

void HelloWorld::addGround(){
    //创建静态物体
    b2BodyDef def;
    def.type=b2_staticBody;
    def.position=b2Vec2(400/RATIO,0);
    b2Body *body=  world->CreateBody(&def);
    
    //创建图形
    b2PolygonShape groundShape ;
    //Box默认情况半宽半高为中心往上左下右都为一半米为单位
    groundShape.SetAsBox(400/RATIO,0.5);
    
    //创建fixture之后就能与其他物体产生相互作用
    b2FixtureDef fixureDef;
    fixureDef.density=1;
    fixureDef.friction=0.3;
    fixureDef.shape=&groundShape;
    //创建一个fixureDef
    body->CreateFixture(&fixureDef);
}
原文链接:https://www.f2er.com/cocos2dx/344575.html

猜你在找的Cocos2d-x相关文章