《Box2D for Flash Games》翻译 (一)hello box2d world
发布时间:2020-12-15 17:40:18 所属栏目:百科 来源:网络整理
导读:http://blog.sina.com.cn/s/blog_441c62380101hkh5.html (一) Hello Box2D World ? 如果你想编写一个 2d物理引擎的游戏或者应用,Box2d 是目前为止最好的选择,它已经被成功的应用在多个游戏中,比如 iphone 中的 angry bird 和 Tiny Wings,或者是 flash
http://blog.sina.com.cn/s/blog_441c62380101hkh5.html
(一) Hello Box2D World
?
如果你想编写一个 2d物理引擎的游戏或者应用,Box2d 是目前为止最好的选择,它已经被成功的应用在多个游戏中,比如 iphone 中的 angry bird 和 Tiny Wings,或者是 flash 版本的 Totem Destroyer 和 Red Remover,随便Google一下,你会知道这些游戏是有多么火了。
在开始研究 box2d World 之前,先来搞清楚一下刚体(rigid body)这个概念吧,刚体是一种十分坚硬的物体,在任何情况下都不会弯曲,无论你用多么坚硬的东西撞击它,它都不会改变形状,你可以把它想象成现实世界里的钻石或者更坚硬的物体,比如说来自于外太空的永远不被摧毁的陨石。
Box2d ,你依然可以模拟那些并不坚硬的东西,比如说弹力球。
?
?
?
?
?
?
在本章结束的时候,你将学会建立一个空的,但是可以运行的box2d程序,以后呢,你就会在此基础上写出特别厉害的游戏了。
?
?
你可以从官网(?
下载完压缩包时,解压 Box2D 压缩文件(你可以在 source 文件夹中找到)到你自己项目的同目录下,如下图所示:
?
![]()
?
如你所见 Box2D 文件夹,我建议你使用 640 x 480 大小的 flash文件,每秒30(fps),文档类命名为 Main,很多例子证明最好使用深颜色作为舞台背景,比如说#333333,反正在这本书里我都会这么设置。
?
?
Hello Box2d World?
box2d是免费的开源项目,你不需要处理组件或者处理 SWC文件,你只需要把用到的类导入你的项目里就可以了。
打开Main.as 写入下面的代码片段
package ?
?
?
?
?
?
?
?
?
?
?
}
测试影片你会看到输出窗口中输出“my awesome game starts here”,说明包已经成功导入。
以上代码不必多说。
虽然用 Hello Box2D World 标题但并不是教大家写 “Hello World” 程序,而是想介绍下所有 box2D 仿真和事件发生环境: 世界(world).
世界(world)就是模拟器发生的舞台,所有拥有Box2d物理性质的物体都要被塞到这个世界(world)里去,而且这个世界(world)足够大足够大不用担心边界问题,所有的物体都可以放进去,但是所有在计算机里的东西都是有所控制的,你世界里的物体越多,计算机的负担越重。
定义 Box2D World
跟现实世界一样,Box2D世界也有重力,那么我么先从定义重力说起。
在 main 方法中写入下面代码
var gravity:b2Vec2=new b2Vec2(0,9.81);
下面来介绍下第一个 box2d 数据类型:b2Vec2
b2Vec2是一个二维向量,是一种数据类型,他把(x,y)作为一组以向量的形式进行存储,构造函数中传有两个参数,都是 number 类型,分别代表了 x,y 方向上的值,
变量 gravity 用一个向量来表示,x= 0(水平方向无重力),y = 9.81(接近地球重力),物理上说物体在自由落体的时候速度每秒增加9.81米,如果不考虑空气阻力,
我们要模拟的是一个真实环境,如果想要了解更多物理方面的知识,请 google 或者?
2,你可以用下面的代码从新规范你游戏。
你也可以把参数设置为(0,0)模拟无重力的环境
3,这个世界里的物体没事干的时候就可以休眠了。一个休眠的物体不受力的作用,也不需要模拟,他只是呆在原地不动,不会影响到其他的物体,box2d将忽略它,这样会提高程序的处理速度,提高性能,所以我要好好提醒你们,尽可能的让物体进入休眠状态。
![]()
4,下面行是boolean 变量的定义
var sleep:Boolean=true;
5,终于,我们要写第一个 world 啦
var world:b2World = new b2World(gravity,sleep);
6,现在我们已经有了这个容器,可以用它管理所有物体,进行仿真模拟了。
7,整理时间到,你的代码应该是这个样子的:
package {
?
?
?
?
现在你已经学会如何创建和配置一个 Box2d World了。下面看看如何在它里面进行模拟物理
运行模拟
因为每一帧都在进行模拟,所以第一件事就是给每一帧都加上监听。
1,简单修改一下已写好的代码
?
?
?
?
?
?
?
?
我们刚刚加上了 ENTER_FRAME 事件,这需要在 updateWorld 方法里添加模拟部分的功能,如果你对AS3中的事件处理机制有疑问,可以参考Adobe的官网或者查看《flash game development by example》,这本书会手把手教你写 flash 游戏。
?
updateWorld 方法里的第一行为:
var timeStep:Number=1/30;
光定义时间步是不够地,在每一步中,每一个物理实体的更新都是根据施加在它上面的力来决定的(除非他在休眠),处理这个的算法叫做约束求解器(?
?
想象两个正在运动的球,在真实世界里,他们的位置时时刻刻都在发生变化,使用计算机模拟,就要用 for 循环(假设哈)在每一次迭代更新所有的球的位置,只要这些球没有相互作用就一切正常,但是如果第二个球碰到第一个球怎么办,这个球的位置已经被更新了吗?他们会有重叠,这在仿真环境是不可能发生的,要合理的解决这个问题,我们要不止一遍的循环所有的约束(constraint),问题是:需要循环多少遍。
这里有两个约束解算器(constraint?
因此,迭代次数越多,仿真越准确,但是性能越差,超过100个物体使用速度解算器的迭代次数为10,?
3,随你的喜好来设置这些值,好吧,这里我使用 10 来设置两个解算器的迭代次数。
看下面两行代码:
var velIterations:int=10;
var posIterations:int=10;
?
?
在?
?
?
?
?
?
?
?
?
?
?
5,最后一件事,在每个时间步后你都需要将力清零,让模拟器在下一个时间步重新开始,加上 world.ClearForces() 这句话就可以了,最终的代码如下:
?
?
?
?
?
?
![]()
总结:
我们刚刚完成了安装了 flash 版的 Box2D,把它导入到你的项目里,创建一个实时运行的受重力控制的模拟器,以及管理时间步和约束解算器,现在你已经为你的游戏准备了一个完整的世界了。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |