b2DebugDraw到底是什么
我们已经学了很多关于Box2D的知识了,但是没仔细研究过天天都在用的b2DebugDraw类。前些天有网友问到,今天我们就来学习一下它的用法。
众所周知,Box2D是一个2D物理引擎。所谓引擎,就像汽车的马达,我们也叫它引擎,是整个制动系统的核心。但是只有马达引擎,汽车是动不了的,还要有车轮(废话)。车轮也不是直接安装在马达上的,它们通过车桥连接到马达上。
我们知道,在创建Box2D应用时,必须有一个Sprite对象。这个sprite对象和b2DebugDraw、Box2D引擎之间的关系就像是车轮、车桥和汽车之间的关系。没有车桥,马达和车轮连不起来,汽车就动不了。同样的,没有b2DebugDraw类,Box2D和Sprite也连不起来,我们就看不到物理模拟过程。
请看下面的图示
明白了吧?好吧,我们讲的再具体一点。
b2Body是Box2D的核心对象,打开b2Body.as源文件(如以下代码),可以看到它并不是DisplayObject的子类,也就意味着我们无法通过addChild()将它添加到舞台上。
// Constructor /** * @private */ public function b2Body(bd:b2BodyDef, world:b2World){ m_flags = 0; if (bd.bullet ) { m_flags |= e_bulletFlag; //.............................
实际上,Box2D只是集成了各种算法,对b2Body对象进行物理模拟计算,并将计算结果存储到这个对象中。所以理论上,我们可以访问b2Body的这些属性(如x、y、顶点等),然后用AS3绘图API绘制模拟结果。但这是非常繁琐的,我们要遍历所有的刚体、关节,以及他们的坐标、角度、顶点等信息。反正我是不想去做这些动作。所以Box2D为我们准备了b2DebugDraw类,只要用b2DebugDrawSprite()方法绑定一个Sprite对象,Box2D就帮我们在这个Sprite中,用绘图API(如lineTo、beginFill等)绘制出模拟图形。
另外,b2DebugDraw还可以用setFlag()方法选择性的绘制Box2D对象的内容。这样可以节省CPU开支。setFlag()方法有一个16进制的参数,这参数的取值只能是b2DebugDraw中定义的下面几个常量:
/** Draw shapes */ static public var e_shapeBit:uint = 0x0001; /** Draw joint connections */ static public var e_jointBit:uint = 0x0002; /** Draw axis aligned bounding boxes */ static public var e_aabbBit:uint = 0x0004; /** Draw broad-phase pairs */ static public var e_pairBit:uint = 0x0008; /** Draw center of mass frame */ static public var e_centerOfMassBit:uint = 0x0010; /** Draw controllers */ static public var e_controllerBit:uint = 0x0020;
另外,我们还可以用”或”运算符,同时使用多个Flag,如:
debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);
在下面的示例中,我们用Box2D 关节——”马达关节” b2RevoluteJoint演示了各个选项的功能,点击右边的选项试试看他们的效果。
到这里,b2DebugDraw的用法就讲完了,明白了吗?如果你还有其他的问题,欢迎给我留言,我们一起讨论,或者关注我的新浪微博ladeng6666,及时了解我的最新文章。
喜欢我的教程,就点击下面的星星给文章打分吧,让我更好的了解大家都喜欢哪一些教程,我会尽量多写一些!
联系作者