11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 1941|回复: 0
上一主题 下一主题

[2D 物理引擎] 【9RIA—ladeng6666】—【Box2D系列教程 28】b2DebugDraw到底是什么

[复制链接] TA的其它主题
发表于 2018-2-6 11:26:00 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

转载:9RIA游戏开发者社区(天地会)
作者:ladeng6666(拉登大叔)
作者博客:http://www.ladeng6666.com/blog/


【Box2D系列教程-导航帖】—拉登大叔出品(总贴)



我们已经学了很多关于Box2D的知识了,但是没仔细研究过天天都在用的b2DebugDraw类。前些天有网友问到,今天我们就来学习一下它的用法。

众所周知,Box2D是一个2D物理引擎。所谓引擎,就像汽车的马达,我们也叫它引擎,是整个制动系统的核心。但是只有马达引擎,汽车是动不了的,还要有车轮(废话)。车轮也不是直接安装在马达上的,它们通过车桥连接到马达上。

我们知道,在创建Box2D应用时,必须有一个Sprite对象。这个sprite对象和b2DebugDraw、Box2D引擎之间的关系就像是车轮、车桥和汽车之间的关系。没有车桥,马达和车轮连不起来,汽车就动不了。同样的,没有b2DebugDraw类,Box2D和Sprite也连不起来,我们就看不到物理模拟过程。

请看下面的图示

b2DebugDraw_demonstrate.jpg
明白了吧?好吧,我们讲的再具体一点。

b2Body是Box2D的核心对象,打开b2Body.as源文件(如以下代码),可以看到它并不是DisplayObject的子类,也就意味着我们无法通过addChild()将它添加到舞台上。

[Actionscript3] 纯文本查看 复制代码
// 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中定义的下面几个常量:

[Actionscript3] 纯文本查看 复制代码
/** 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,如:
[Actionscript3] 纯文本查看 复制代码
debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);


在下面的示例中,我们用Box2D 关节——”马达关节” b2RevoluteJoint演示了各个选项的功能,点击右边的选项试试看他们的效果。


到这里,b2DebugDraw的用法就讲完了,明白了吗?如果你还有其他的问题,欢迎给我留言,我们一起讨论,或者关注我的新浪微博ladeng6666,及时了解我的最新文章。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表