关于flash as3的物理引擎真是不少,比较之后发现,在开源引擎当中Box2D算是比较不错的了,http://www.box2dflash.org/docs/2.0.2/manual#Prerequisites全文详细,现在从HelloWorld程序进行讲解,把个人心得分享给大家!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. body.CreateShape(box);

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

  1. body.SetMassFromShapes();

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

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

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

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

  

转载于:https://www.cnblogs.com/tankaixiong/archive/2012/11/19/2777419.html

box2dflash flash物理引擎相关推荐

  1. 主流Flash物理引擎分析

    最近研究物理引擎,对网上能找到的开源物理引擎做了一下比较,完整的分析报告没有放出来,只放一些分析资料. (一) 2D物理引擎 1. Box2D A. 地址:http://box2dflash.sour ...

  2. flash物理引擎应用:你的第一个Fisix应用程序

    今天看了一下这个flash的引擎,官方的说明文档. http://wiki.fisixengine.com/index.php?title=YourFirstFisixApplication#The_ ...

  3. Box2DFlash物理引擎的使用方法

    修改一下  extents属性是前面的版本 新版本用的是setBox()属性. 众所周知的Box2DFlash是一款不错的物理引擎,如果我们了解了他的使用的技巧,我们也可以做出不错效果. 接下来,我会 ...

  4. papervision3d和物理引擎Box2DFlash的一个超酷且好玩的DEMO

    原文:http://pv3d.org/2008/12/20/papervision3d-with-box2dflash-part-3-adding-mouse-interaction/ 运行效果: 这 ...

  5. Flash飞行游戏物理引擎

    飞行游戏的物理引擎, 只用了Math.sin和Math.cos就做出来了,简单吧!

  6. Box2D物理引擎的使用方法

    转:http://www.toswf.com/blog/blogview.asp?logID=103 众所周知的Box2DFlash是一款不错的物理引擎,如果我们了解了他的使用的技巧,我们也可以做出不 ...

  7. 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用

    首先我们要了解的是AwayPhysics这个物理引擎并不是重头开始写的新物理引擎,而是使用Flascc技术把一个已经很成熟的Bullet物理引擎引入到了Flash中,同时为了让as3可以使用这个C++ ...

  8. 开源Flash游戏引擎PushButton Engine

    介绍开源Flash游戏引擎PushButton Engine  最近,一个开源 的Flash游戏引擎PushButton引擎发布了,与以往的游戏引擎不同的是,这是一个模块化的游戏引擎,也就是说它提供了 ...

  9. AS3多线程快速入门(三):NAPE物理引擎+Starling

    原文:http://blog.domlib.com/articles/345 [更新]Adobe在11.4正式发布的最后一刻移除了ByteArray.shareable功能的支持,推迟到11.5版本再 ...

最新文章

  1. 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现
  2. MySQL具体解释(21)------------缓存參数优化
  3. 解决NSData转NSString返回nil的问题
  4. 爬虫学习--豆瓣top250
  5. 学习进度(2016.3.13)
  6. 尝试Office 2003 VSTO的开发、部署
  7. leecode62 不同路径
  8. QuillBot:又一个值得拥有的论文润色工具
  9. 普通人,如何实现年收入百万?
  10. 旅行 jzoj 1281
  11. 德国是2018世界杯夺冠最大热门? Python数据分析来揭开神秘面纱…
  12. 基于Python+djangoWeb的校园信息化统计平台
  13. 三星支付存在漏洞可导致黑客进行交易劫持
  14. CEPH J版本新特性RGW Multi-tenancy详解
  15. python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在19351936年应邀来中国清华大学讲学。。。
  16. python 视频加字幕_【小技巧】用Python给你的视频添加字幕
  17. SpringBoot实现OA办公管理系统
  18. 唐宇迪学习笔记3:Python数据可视化库——Matplotlib
  19. Linux qt教程 qt入门(一)
  20. 51nod lyk与gcd

热门文章

  1. Pr案例之:制作片头
  2. Python : Json Ascii <-> Hex互相转换
  3. 流体分离技术:乌兰察布市卷式MBR超滤膜设备特点
  4. 中兴服务器启动u盘,国产中兴新支点操作系统 U 盘启动安装教程,敬请转发收藏分享...
  5. Coursera耶鲁公开课幸福课下载
  6. android-settings添加字体更换-前篇-setting简单一览
  7. sed命令对文件内的指定字符串进行替换
  8. rt-thread应用篇(01)---智能家居DIY项目之使用nrf24l01实现多点通信
  9. Android歌词秀设计思路(6)运用Proxy设计模式简化歌词播放服务的使用
  10. 找资源什么的,这样搜索才高效