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

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

[2D 物理引擎] 【9RIA—ladeng6666】—【Box2D系列教程 13】从Box2D 2.0.1到Box2D 2.1a

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

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

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

x

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


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



之前@依然低调白和@ヤ牵、迩右手(张小勇)同学都跟我说过,我的教程用的是Box2D2.0.1版本的,不是最新的版本,建议我更新成最新的Box2D 2.1a版。很感谢两位同学建议。今天我们就开始学习Box2D 2.1a,而且后续的Box2D都会用Box2D 2.1a版本。

和学习Box2D 2.0.1一样,我还是创建b2Body刚体开始,我继续使用掉落的苹果——b2Body里的实例,同时对实现相同效果的不同版本的代码做个比较,这样会更方面大家理解。

开始之前,请确保你已经看过掉落的苹果——b2Body,因为我不打算在每个步骤的讲解,具体我会详细的写在注释里。

下面,我们来看看Box2D 2.1a和2.0.1的主要几个不同点:


世界的创建过程
Box2D 2.0.1
在认识Box2D世界一文中,我知道了创建Box2D世界的三个必备元素:
    b2AABB创建并设置b2AABB环境
    gravity:声明重力gravity:b2Vec2
    doSleep:说明对sleeping对象是否进行模拟
然后在EnterFrame事件处理函数中,试试的调用world.Step()方法更新Box2D世界。

Box2D 2.1a
在2.1a中Box2D世界的创建,只需要两个条件:
    gravity:声明重力gravity:b2Vec2
    doSleep:说明对sleeping对象是否进行模拟
这一点相对来说,更简洁了,去掉了b2AABB环境变量。本来嘛,现实生活中,谁能摸清每个地方(环境)的大小啊。

不过在更新Box2D世界上,多了两个步骤:
    world.ClearForces():清除所有刚体上的作用力,防止该里一直作用于刚体(比如按下鼠标表示推刚体一下,那么如果不调用world.ClearForces的话,刚体会一直被推下去)。
    world.DrawDebugData():在2.0.1中,这个方法是在world.Step函数中调用的(如下代码),而2.1a的world.Step中删掉了这句代码,所以我需要自行调用。

[Actionscript3] 纯文本查看 复制代码
	public function Step(dt:Number, iterations:int) : void{
 
		m_lock = true;
 
		var step:b2TimeStep = new b2TimeStep();
		step.dt = dt;
		step.maxIterations	= iterations;
		if (dt > 0.0)
		{
			step.inv_dt = 1.0 / dt;
		}
		else
		{
			step.inv_dt = 0.0;
		}
 
		step.dtRatio = m_inv_dt0 * dt;
 
		step.positionCorrection = m_positionCorrection;
		step.warmStarting = m_warmStarting;
 
		// Update contacts.
		m_contactManager.Collide();
 
		// Integrate velocities, solve velocity constraints, and integrate positions.
		if (step.dt > 0.0)
		{
			Solve(step);
		}
 
		// Handle TOI events.
		if (m_continuousPhysics && step.dt > 0.0)
		{
			SolveTOI(step);
		}
 
		// Draw debug information.
		DrawDebugData();
 
		m_inv_dt0 = step.inv_dt;
		m_lock = false;
	}


另外world.Step()的第二个iteration参数也被分成了两个velocityIterations和positionIterations分别限制在物理模拟是迭代的次数。
[Actionscript3] 纯文本查看 复制代码
public function Step(dt:Number, velocityIterations:int, positionIterations:int) : void


创建刚体
Box2D 2.0.1
在掉落的苹果——b2Body中,我们学习了刚体的创建过程,大致有下面四步:
    1. 创建刚体需求b2BodyDef
    2. Box2D世界工厂根据需求用createBody方法创建刚体
    3. 创建刚体形状需求b2ShapeDef的子类对象
    4. B2Body工厂根据需求用createShape方法创建形状
想必大家应该已经很熟悉了。


Box2D 2.1a
在2.1a版本中,刚体的创建过程跟2.0.1比较起来多了几步:
    创建刚体需求b2BodyDef
    b2BodyDef新增了一个type属性,它可以是b2Body.b2_dynamicBody、b2_kinematicBody和b2_staticBody,默认值为b2_staticBody,也就是静止的刚体。因为我们需要的是运动刚体需求,所以记得一定要把这个属性设置为b2_dynamicBody。
    另外在b2_dynamicBody时,如果fixture需求(马上讲到)的density值为0,则会该density将自定被改为1。但是,但是啊,box2D将会出现一些错误,比如刚体不碰撞后不会旋转等。切记,切记啊。

    Box2D世界工厂根据需求用createBody方法创建刚体
    创建刚体形状需求b2ShapeDef的子类对象
    在掉落的苹果——b2Body中,我知道了,b2ShapeDef包含density、friction、restitution、setAsBox等属性和方法。在2.1a中这些属性被分成了两类,一类是是物体属性,如density、friction、restitution,同时这些属性被划分到了一个新的类b2FixtureDef类中;一类是几何属性,如radius、setAsBox等,这些属性被划分到b2Shape类中。2.1a中没有了b2ShapeDef的概念,或者说原来的b2ShapeDef被分成了b2FixtureDef和b2Shape,后面两个新类则通过b2FixtureDef的shape属性联系在一起。

[Actionscript3] 纯文本查看 复制代码
var fixtrueRequest:b2FixtureDef = new b2FixtureDef();
fixtrueRequest.shape = shapeRequest;//b2Fixture的必要条件

    B2Body工厂根据需求用createShape方法创建形状

在2.1a中被替换成了CreateFixture方法。

调试b2DebugDraw
Box2D 2.0.1
B2DebugDraw是设置都是通过修改属性完成

[Actionscript3] 纯文本查看 复制代码
			debugDraw.m_sprite = debugSprite;
			debugDraw.m_drawScale = 30.0;
			debugDraw.m_fillAlpha = 0.5;
			debugDraw.m_lineThickness = 1.0;
			debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit;


Box2D 2.0.1
2.1a中b2DebugDraw的设置全部有函数完成,函数名基本与2.0.1中的属性名一致
[Actionscript3] 纯文本查看 复制代码
			debugDraw.SetSprite(debugSprite);
			debugDraw.SetDrawScale(30);
			debugDraw.SetFillAlpha(0.5);
			debugDraw.SetLineThickness(1.0);
			debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);



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

本版积分规则

关闭

站长推荐 上一条 /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)



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