[cocos2d-x学习笔记][入门基础]Box-2d物理引擎的使用01

1.部分概念:
•形状(shape)
•2D几何对象,比如圆形(circle)或多边形(polygon)。
•刚体(rigidbody)
•十分坚硬的物质,坚硬得像钻石,它上面任意两点之间的距离都保持不变。在后面的讨论中,我们用物体(body)来代替刚体。(这就使得物体本身不会产生形变,那软软弹弹的效果应该都是动画)
•夹具(fixture)
•fixture将形状绑定到物体之上,并有一定的材质属性,比如密度(density),摩擦(friction)和恢复(restitution)。
•(译注:一个物体和另一物体碰撞,碰撞后速度和碰撞前速度的比值会保持不变,这比值就叫恢复系数。)
•约束(constraint)
•约束是个物理连接,用于消除物体的自由度。在2D中,物体有3个自由度(水平,垂直,旋转)。如果我们把一个物体钉在墙上(像钟摆那样),那就把它约束到了墙上。这个时候,此物体就只能绕着钉子旋转,所以这个约束消除了它2个自由度。
•(译注:简单的说,需要用几个参数来确定物体的空间状态,这个物体就有几个自由度。在二维中,完全没有约束的条件下,我们要确定物体的状态,要有x坐标,y坐标,旋转角这三个参数,所以自由度为3。如果物体被钉在墙上,只要有旋转角,就可以完全确定物体的状态,有了钉子这个约束,物体自由度就变成了1。)
•接触约束(contactconstraint)
•一种特殊的约束,设计的目的是为了防止刚体被穿透,也用于模拟摩擦和恢复。接触约束不用你来创建,它们会自动被Box2D生成。
•关节(joint)
•关节就是种约束,用于将两个或多个body固定到一起。Box2D支持不同的关节类型:转动(revolute),棱柱(prismatic),距离(distance)等。一些关节可以有限制(limits)和马达(motors)。
•关节限制(jointlimit)
•关节限制限定了一个关节的运动范围。例如人类的胳膊肘只能在某一角度范围内运动。
•关节马达(jointmotor)
•根据关节的自由度,关节马达可以驱动关节所连接的物体。例如, 你可以使用一个马达来驱动一个肘的旋转。
•世界(world)
•一个物理世界就是各种,刚体(bodies),夹具(fixtures),约束(constraints)相互作用的集合。Box2D支持创建多个世界,但这通常没有必要。
•box2d的内存是自己管理的,他建立了一个内存池,以减少对内存的频繁的申请和释放。所以所有对象都要box2d帮你创建,也就是libgdx中的world。
2.Box-2d与cocos2d的层的区别与联系;
cocos2d创建图层为见层,Box-2d创建的为不可见的引擎层;
以一个480x320大小的场景来说他对应的物理引擎场景大小是15米x10米;就是说场景层的没32像素对应着物理层的1米。

3.创建一个物理世界并初始化
b2World* world;

b2Vec2 gravite;
gravit.set(0.0f,-9.8f);
this->world=new b2World(gravite);

4刚体介绍
刚体物理引擎中不变的对象, 自身属性b2BodyDef,包含若干b2Fixture属性,
b2BodyDef;
b2BodyDef bodyDef;
    bodyDef.type=b2_dynamicBody;
    bodyDef.position.Set(p.x/32, p.y/32);
    b2Body*body=world->CreateBody(&bodyDef);
b2Fixtrue依附刚体上的物理特质属性;
b2Fixtrue有各种形状;
b2Shape形状:b2PolygonShape多变刑;b2CircleShape圆形
b2density 密度
b2friction摩擦,
b2restitution 恢复系统
 b2PolygonShape dynamixbox;
    dynamixbox.SetAsBox(70/32.0/2.0f, 80/32.0/2.0f);
b2FixtureDef fixtureDef;
    fixtureDef.shape=&dynamixbox;
    fixtureDef.density=1.0f;
    fixtureDef.friction=0.3f;
    body->CreateFixture(&fixtureDef);

在cocos2d层创建的图层绑定刚体  “body->SetUserDate(sprite);”
 auto sprite=Sprite::create("030.png");
    this->addChild(sprite);
    body->SetUserData(sprite);
    sprite->setPosition(Vec2(p.x,p.y));
刚体坐标
同样32像素代表1米
如果cocos2d坐标为(96,96)在物理引擎就是(3米,3米)


5.模拟世界b2world;
 world->Step(t,8,1);
    for (b2Body * b=world->GetBodyList(); b ; b=b->GetNext()) {
        if (b->GetUserData()) {
            Sprite *sp=(Sprite *)b->GetUserData();
            sp->setPosition(b->GetPosition().x*32,
                            b->GetPosition().y*32);
            sp->setRotation(-CC_RADIANS_TO_DEGREES(b->GetAngle()));
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值