现在网上关于as3的物理引擎真是不少,比较之后发现,在开源引擎当中Box2D算是比较不错的了,只可惜他的结构比较复杂,而且国内网站关于Box2D方面的教程真是少的可怜。因为我知道这个最早是c++上面的2D引擎,所以我找到了http://www.box2d.org/manual.html网址,经过几天的研究,总算是入门了,下面我会系统的针对官网给出的HelloWorld程序进行讲解,把个人心得分享给大家(鼓掌)!

  这个引擎是先从创建一个世界对象开始的,他负责管理内部一切对象的内存和模拟过程。要创建一个世界中的对象,首先我们需要为世界定义边界区域,Box2D针对区域内的所有对象进行模拟碰撞,区域的大小并不重要,但更适合的区域将提高程序性能,一般来讲这个区域设置的要比演示区域更大一些,因为一旦对象在运动时到达了边界,它就会被“冻结”并停止一切模拟活动。

var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100,-100);//左边界、上边界
worldAABB.upperBound.Set(100,100);//右边界、下边界

  下面我们要为这个世界设置重力了,就是下面这段代码,其实这里面的重力是用向量b2Vec2(x,y);来表示的,x代表水平运动,正数向右,负数向左,y代表垂直运动,正数向下,负数向上。同时我们需要再定义一个布尔型参数(我命名为doSleep),来表示是否允许睡眠,睡眠所代表的含义网上也没有一个明确的介绍,这里我简要讲解一下。因为你在这个世界中生成的一切对象,他们的模拟效果都是实时计算出来的,当doSleep=false的时候,即使物体停止了运动,计算机还是在不停的进行着运算,其实这是完全不必要的,所以一般都设为true,这样当物体停止之后就不会进行无谓的cpu消耗了。

var gravity:b2Vec2 = new b2Vec2(0,10);
var doSleep:Boolean = true;

  以上参数都准备好了,我们可以将它们传入b2World对象中并将其实例化,这样一个物理引擎的模拟区域就做好了。

var world:b2World = new b2World(worldAABB,gravity,doSleep);

  让我们开始在其中加入你想要模拟的对象吧。本来在那个英文网站中给出的是5个步骤,但是我感觉还少点什么,所以我又加了一条:
第一步、创建并定义刚体位置。这里我做一下名词解释,在任何力的作用下,体积和形状都不发生改变的物体叫做“刚体”;

var ground:b2BodyDef = new b2BodyDef();
ground.position.Set(10, 12);//这里的位置也是用向量定义的

2、给刚体定义皮肤(注意这里的皮肤并不具备物理引擎的属性,因此才有了第四步);

bodyDef.userData = _mc;//我们自己绘制的图形
addChild(bodyDef.userData);

3、用世界对象添加刚体实例,需要注意的是世界对象里并没有保存body定义的引用;

var body:b2Body = world.CreateBody(bodyDef);

4、根据皮肤形状创建模拟图形类:摩擦力、密度、弹力等等;当密度为0的时候,物体是不会动的,相当于障碍物。摩擦力和弹力取值范围是0~1,形状的区域是由SetAsBox定义的,因为模拟图形和刚体都要求以中心点为注册点,因此这里的宽和高的值都是一半,同时需要注意,这里数值单位并不是像素,而是米,1米=30像素,大家在传值的时候可别忘记换算哦。

var box:b2PolygonDef = new b2PolygonDef();//创建多边形
box.density = _density;
box.friction = _friction;
box.restitution = _restitution;
box.SetAsBox(_halfWidth , _halfHeight);

5、在刚体上添加模拟图形实例;

body.CreateShape(box);

6、根据刚体的密度和面积计算出质量,密度*面积=质量。

body.SetMassFromShapes();

  这里有两个重要的参数需要我们自己定义一下。一个是迭代次数,这里我定义为m_iterations,建议迭代次数为10,这时一个比较合理的值,使用较少的迭代可以提高性能,但模拟质量受到影响。同样,使用更多的迭代性能有所下降,但提高了你的模拟质量。另外一个参数是游戏的刷新频率,我定义为m_timeStep,根据英文教程上记载,它采用的是1/60秒刷新一次,但因为它的平台是c++,性能比AVM2虚拟机高出数倍,完全可以这么做,而在flash中我们一般设置成1/30就可以了。

var m_iterations:Number = 10;
var m_timeStep:Number = 1 / 30;

  现在一切都准备好了,我们要让所有对象模拟运动。其实他也是通过侦听帧频率而不断刷新实现的,把上面那两个参数传入世界对象的Step方法中即可,同时我们需要遍历世界中的一切对象,并对每个对象的坐标和角度进行更新。

addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
function Update(e:Event):void
{world.Step(m_timeStep, m_iterations);
for (var bb:b2Body=world.m_bodyList; bb; bb=bb.m_next)
{if (bb.m_userData is Sprite)
{bb.m_userData.x=bb.GetPosition().x * 30;//这里获取的变量单位是米,乘以30转换成像素单位
bb.m_userData.y=bb.GetPosition().y * 30;
bb.m_userData.rotation=bb.GetAngle() * (180 / Math.PI);
}
}
}

  好了,现在相信大家已经对Box2D有了一定了解,赶快尝试制作一些效果吧。

  本文出自动力男孩博客:http://www.p-boy.cn/?p=473

Box2D——入门教程相关推荐

  1. 认识AndEngine选自Android 2D游戏引擎AndEngine快速入门教程

    认识AndEngine什么是AndEngine 随着Android手机.平板的盛行,Android下的游戏也不断的变得火热.而对于游戏开发有兴趣的同学们,应该也想要学习开发游戏.虽说游戏开发的引擎较多 ...

  2. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  3. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  4. python tornado教程_Tornado 简单入门教程(零)——准备工作

    前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...

  5. python向量计算库教程_NumPy库入门教程:基础知识总结

    原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...

  6. mysql query browswer_MySQL数据库新特性之存储过程入门教程

    MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...

  7. python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...

  8. air调用java,AIR2.0入门教程:与Java应用交互

    在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...

  9. 【Arduino】开发入门教程【一】什么是Arduino

    Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...

最新文章

  1. 2016各大公司校招薪水曝光:年薪28万,这只是零花钱
  2. 写代码有什么该注意的
  3. es like模糊匹配_es 基于match_phrase/fuzzy的模糊匹配原理及使用
  4. 关于Spring的IOC和DI
  5. 视力检查-2019年2月2日
  6. gvim 命令行粘贴_vi/vim复制粘贴命令
  7. matlab中生成瑞利信道的两种方法
  8. arcgis怎么压缩tif文件_PDF文件怎么压缩才能变小?这样压缩,真的很简单!
  9. OPPO R9KM手机刷机救砖线刷包附驱动教程
  10. 苹果开发者账号实名认证相关问题
  11. 网络信息安全课程笔记整理(一)
  12. ppt怎么把图片做成翻书效果_怎么把在PPT中插入的图片效果弄成翻书的样子啊?...
  13. Good Ticket(深搜)
  14. polyfit多项式拟合函数的用法
  15. linux cadence教程 pdf,cadence入门教程-修改版.pdf
  16. css 按空格键对按钮暂停,当按下回车键后,怎么清空回车键的空格,或者模拟发送按键让光标向上?...
  17. 摊上事儿的网易邮箱和安全圈的那些“防御机制”
  18. 2021年中式烹调师(中级)报名考试及中式烹调师(中级)实操考试视频
  19. VRay 2.0 for SketchUp高级室内渲染教程荟
  20. 解决AutoDesk Eagle双击无法启动及语言修改添加元件库的问题

热门文章

  1. java 注释标记_如何标记,像老板一样注释内容
  2. SQL Server报表生成器中的R脚本词云
  3. ssrs 存储过程参数配置_如何为纯模式配置报告服务(SSRS)
  4. 如何使用sp_send_dbmail存储过程将SQL查询结果通过电子邮件发送到智能手机
  5. Vue教程:简介(一)
  6. python3基本数据类型02——列表、元组
  7. 利用SpringAOP 实现 日志输出
  8. 1.6.jquerymobile--列表
  9. Hyper-V应用指南之3-理解并配置Hyper-V虚拟网络[转]
  10. 修改Google toolbar for firefox的默认语言