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,及时了解我的最新文章。

喜欢我的教程,就点击下面的星星给文章打分吧,让我更好的了解大家都喜欢哪一些教程,我会尽量多写一些!

联系作者

公众号:拉小登 | 微博:拉登Dony | B站:拉小登Excel

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注