认识Box2d刚体 b2Body

1 什么是刚体?

通俗的讲,刚体就是一个“东西”,在Box2D中的刚体b2Body类,是Box2d的核心类之一。

2 创建刚体

创建一个刚体,不单单只是b2Body的事情,还要创建多个对象,包括 b2BodyDef 和 b2FixtureDef对象,然后这些对象的协同合作下,完成刚体的创建。

  • b2BodyDef: 要创建的刚体信息定义。
  • b2Body: 要创建的刚体。
  • b2FixtureDef: 要创建的刚体信息定义

为什么会有这样的差异呢?通常一个类的所有属性,都包含在这个类当中,而对于刚体b2Body类来说,它是所有运动物体的原型,包含的数据和信息相当多,如物体的坐标、线性速度、角速度、角度等;又如物质本身的一些特性,形状、密度、摩擦系数等;物体由多个不同材质组成,那么还涉及每个材质的形状、密度等、总之是相当庞大的数据。

     所以,Box2D分担给了 b2BodyDef 和 b2FixtureDef 类。所以创建刚体之前先要创建一个  b2BodyDef 和 b2FixtureDef 对象,并分别定义相关属性,然后在把这两个对象赋值给 b2Body对象

b2BodyDef 属性

b2FixtureDef  属性

 

代码实现 创建一个矩形刚体

import b2World = Box2D.Dynamics.b2World;
import b2BodyDef = Box2D.Dynamics.b2BodyDef;
import b2Body = Box2D.Dynamics.b2Body;
import b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape;
import b2FixtureDef = Box2D.Dynamics.b2FixtureDef;

class LaserView extends ui.LaserViewUI{
    constructor(){
        super();
        this.init();
        Laya.timer.frameLoop(1,this,this.update);
    }

    private _world:b2World;

    private init():void
    {
        this.create2bWorld();
        this.createb2Body_rectangle(360,400,100,100,b2Body.b2_dynamicBody);
    }

    // 创建物理世界
    private create2bWorld():void
    {
        let gravity:Box2D.Common.Math.b2Vec2 = new Box2D.Common.Math.b2Vec2(0,10);    // 重力 
        let doSleep:boolean = true;                                                   // 为 true 时 将静止的刚体标记为随眠状态,在遍历的时候直接跳过去,不进行运动模拟计算,提高了Box2D的计算效率,节省CPU 
        this._world = new b2World(gravity,doSleep);
    }

    // 创建一个 矩形刚体
    private createb2Body_rectangle(x:number,y:number,width:number,height:number,type:number):void
    {
        let bd:b2BodyDef = new b2BodyDef();           // b2BodyDef 是b2Body所有属性的一个集合,作用:在刚体创建前,收集所有运动合状态相关属性,然后传入b2Body。
        // bd.type = b2Body.b2_dynamicBody;           // 设置为 动态
        // bd.type = b2Body.b2_staticBody;               // 设置为 静态
        bd.type = type;
        bd.position = new Box2D.Common.Math.b2Vec2(x/30,y/30);       //设置位置

        let b2_rect:b2PolygonShape = new b2PolygonShape();       // 多边形对象
        b2_rect.SetAsBox(width/2/30,height/2/30);

        let fd:b2FixtureDef = new b2FixtureDef();         // b2FixtureDef 主要保存了刚体物质特性方面的属性,如形状shape,密度density,表面摩擦力friction,弹性系数restitution等等
        fd.shape = b2_rect;
        fd.filter.groupIndex = 1;

        let body:b2Body = this._world.CreateBody(bd);            // 刚体对象
        body.CreateFixture(fd);
    }
}

上面用到了刚体的形状 矩形 ,现在我们来了解下Box2D中的形状:

b2FixtureDef对象的shape属性,它是b2Shape类型对象,实现了刚体的具体形状,Box2D基于形状进行精确的物理碰撞模拟。实际上b2Shape只是一个抽象的父类,在实际开发过程中,b2FixtureDef.shape的属性都是 b2CircleShape、b2PolygonShape等b2Shape的子类对象。

  • 圆形 b2CircleShape

b2CirleShape 只有一个radius参数,用来涉资圆形的半径,默认值为0,这里的radius的单位是米(m),在赋值时要乘以30将单位转换为像素(px)

        // 创建一个 圆形刚体
    private createb2Body_circle(x:number,y:number,radius:number,type:number):void
    {
        let bd:b2BodyDef = new b2BodyDef();           // b2BodyDef 是b2Body所有属性的一个集合,作用:在刚体创建前,收集所有运动合状态相关属性,然后传入b2Body。
        // bd.type = b2Body.b2_dynamicBody;           // 设置为 动态
        // bd.type = b2Body.b2_staticBody;               // 设置为 静态
        bd.type = type;
        bd.position = new Box2D.Common.Math.b2Vec2(x/30,y/30);       //设置位置

        let circle:b2CircleShape = new b2CircleShape(radius/30);       // 多边形对象
        let fd:b2FixtureDef = new b2FixtureDef();         // b2FixtureDef 主要保存了刚体物质特性方面的属性,如形状shape,密度density,表面摩擦力friction,弹性系数restitution等等
        fd.shape = circle;
        fd.filter.groupIndex = 1;

        let body:b2Body = this._world.CreateBody(bd);            // 刚体对象
        body.CreateFixture(fd);
    }

矩形 b2PolygonShape

2bDebugDraw 调试视图

    Box2D引擎本身没有渲染的功能,所以虽然我们已经创建好了一个包含世界和刚体的应用,但是界面上还是看不到,

在Box2d中提供了 b2DebugDraw的类来完成这个复杂的过程,我们通常打他叫做“调试视图”

这边我以laya引擎为例 来进行绘制试图

    // 2bDebugDraw 调试视图绘制
    private b2DebugDraw():void
    {
        // ----- Laya 绘制 --------
        var canvas = Laya.Browser.createElement('canvas');
        canvas.width = Laya.stage.width;
        canvas.height = Laya.stage.height;
        var ctx = canvas.getContext('2d');
        
        Laya.stage.graphics.clear(false);
        var textture = new Laya.Texture(canvas);
        textture.bitmap.alwaysChange = true;                //小游戏使用,非常费,每帧刷新
        Laya.stage.graphics.drawTexture(textture);

        // box2d 
        let debugDraw:Box2D.Dynamics.b2DebugDraw = new  Box2D.Dynamics.b2DebugDraw();
        debugDraw.SetSprite(ctx);
        debugDraw.SetDrawScale(30);
        debugDraw.SetFlags(Box2D.Dynamics.b2DebugDraw.e_shapeBit|Box2D.Dynamics.b2DebugDraw.e_jointBit);
        debugDraw.SetFillAlpha(1);
        debugDraw.SetLineThickness(1);
        this._world.SetDebugDraw(debugDraw);
    }

 

提供下以上绘制试图整体代码 https://blog.csdn.net/weixin_41316824/article/details/90524136

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值