`

[转] ape引擎系列教程-第一篇:模拟最简单的物理世界

阅读更多

http://bbs.9ria.com/viewthread.php?tid=86124&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000

 

 

 

从这一篇开始.我们将开始学习物理引擎ape的用法.就我知道的.比较常用的flash引擎有两种,第一种是box2d,第二种是ape.box2d引擎是从c++移植过来的.用了一段时间的box2d.给我的感觉就是很复杂.可是性能确实是很好的.box2d生成对象比ape要繁琐许多.生成对象和销毁对象都是用工厂方法,而ape引擎给我的感觉就是轻巧,简单.原生的版本只有19个类,而谷歌代码托管加强版本的ape也只有23个类,ape对象都是以一种称作"粒子"的方式来组织的.生成对象的方式也比box2d方便许多.这里不是讨论哪个引擎的好坏.项目中选择适合自己的才是正确的一种方法.好了.这里我们就进入入第一篇关于ape的教程吧.

第一篇:模拟最简单的物理世界.
先看例子:
例子
使用ape的第一件事就是:修改掉ape的Vector类.为什么要修改它呢.因为在flash的新版本中.官方加入了Vector类.这个类会和ape里面的Vector类冲突.所以我们第一件事就是把Vector类修改成apeVector.这里读者不必自己修改,在下面的附件中.我已经修改好了.这里只是给大家提个醒而已.好了修改之后.我们要做的第一件事情就是初始化我们的物理引擎了;

首先放出这篇教程的所有源码,后面我们会一行一行的解释(请读者自己导入相关的包)

  1. package  
  2. {
  3.         import flash.display.Sprite;
  4.         import flash.events.Event;
  5.         import org.cove.ape.APEngine;
  6.         import org.cove.ape.ApeVectorForce;
  7.         import org.cove.ape.CircleParticle;
  8.         import org.cove.ape.Group;
  9.         import org.cove.ape.RectangleParticle;
  10.         /**
  11.          * ...
  12.          * @author 陈伟群
  13.          */
  14.         public class Chapter_1 extends Sprite 
  15.         {
  16.                 private var groupFall:Group;
  17.                 private var ballFall:CircleParticle;
  18.                 private var rectFall:RectangleParticle;
  19.                 public function Chapter_1() 
  20.                 {
  21.                         //初始化物理引擎
  22.                         APEngine.init(0.25);
  23.                         APEngine.addForce(new ApeVectorForce(false, 0, 10));
  24.                         APEngine.container = this;
  25.                         /*---------------------关于制造墙-------------------------------*/
  26.                         //制造墙的容器
  27.                         var groupWall:Group = new Group(true);
  28.                         //制造四面墙
  29.                         var rightWall:RectangleParticle = new RectangleParticle(15, 200, 30, 400, 0, true);
  30.                         rightWall.setStyle(0, 0, 1, 0xffcc00);
  31.                         groupWall.addParticle(rightWall);
  32.                         
  33.                         var leftWall:RectangleParticle = new RectangleParticle(535, 200, 30, 400, 0, true);
  34.                         leftWall.setStyle(0, 0, 1, 0xffcc00);
  35.                         groupWall.addParticle(leftWall);
  36.                         
  37.                         var bottomWall:RectangleParticle = new RectangleParticle(275, 385, 550, 30,0, true);
  38.                         bottomWall.setStyle(0, 0, 1, 0xffcc00);
  39.                         groupWall.addParticle(bottomWall);
  40.                         
  41.                         //把墙组加到引擎里面进行渲染
  42.                         APEngine.addGroup(groupWall);
  43.                         /*----------------------制造掉落的东东----------------------------*/
  44.                         groupFall = new Group(true);
  45.                         APEngine.addGroup(groupFall);
  46.                         //两个组之间的碰撞
  47.                         groupWall.addCollidable(groupFall);
  48.                         addEventListener(Event.ENTER_FRAME, engineHandler);
  49.                 }
  50.                 
  51.                 private function engineHandler(e:Event):void 
  52.                 {
  53.                         //渲染
  54.                         
  55.                         if (int(Math.random()*20)==0) 
  56.                         {
  57.                                 ballFall = new CircleParticle(Math.random() * 550, Math.random() * 20, Math.random() * -10 + 20);
  58.                                 groupFall.addParticle(ballFall);
  59.                                 //rectFall = new RectangleParticle(Math.random() * 550, Math.random() * 20,Math.random() * -10 + 20,Math.random() * -10 + 20,Math.random()*3.14);
  60.                                 //groupFall.addParticle(rectFall);
  61.                         }
  62.                         APEngine.step();
  63.                         APEngine.paint();
  64.                 }
  65.                 
  66.                 
  67.         }

  68. }
复制代码

====================================================================================================

  1.         //初始化物理引擎
  2.         APEngine.init(1 / 4);
  3.         APEngine.addForce(new ApeVectorForce(false, 0, 10));
  4.         APEngine.container = this;
复制代码

上面的代码几乎是固定的
ApeEngine的init()方法必须的.一般的默认值是0.25,这个值越大.那么模拟的速度就越快.可是会变的很不精确.我试过把它的值调得很大.发现会出现穿透的现象(大家可以在我给的代码中试试.非常的诡异,呵呵);ApeEngine的addForce()方法是说个系统的粒子添加一个无质量的力,为什么要叫做无质量的力呢?其实找我的理解就是额...我想起了那个著名的斜塔实验.这个力传入的参数是一个实现了IFore接口的类(注意这个是使用增强版本的ape,原生版本的可能是我们Vector类,这里我们一律使用实现了IFore接口的类),
ApeEngine的的contain属性.我们就当成ape渲染的容器了吧.

接着就是创建物理世界的边界了,就是说是我们的墙体.首先我们先来看看创建这些的基本步骤

  1. //制造墙的容器
  2. var groupWall:Group = new Group(false);
复制代码

第一步是:给我们将要创建的矩形粒子(这里指的是墙体)一个容器.容器的作用是什么?这里我们先卖个关子.等你看完这篇教程
也许你会有更好的理解.这里的Group的构造函数是说在这个容器里面的粒子是不是能互相碰撞.这种情况就是说如果你有一罐糖果.你摇晃这这个
罐子的时候,里面的糖果会不会互相碰撞.如果你选择了否.那么你将看到你的糖果互相穿透了.神奇吧.因为我们这里是墙体,墙当然是静态的.所以
我们不需要他们互相碰撞.当然,在这里你设置能true.也是可以的.

  1. //制造墙体(矩形粒子)
  2. var rightWall:RectangleParticle = new RectangleParticle(15, 200, 30, 400, 0, true);
  3. rightWall.setStyle(0, 0, 1, 0xffcc00);
  4. groupWall.addParticle(rightWall);
  5. APEngine.addGroup(groupWall);
复制代码

第二步:这一步是创建一个墙体.这个矩形粒子类有四个必须参数.五个可选参数.这篇重点要讲前六个,后面的一般保持默认就好.后面我们会讲.第一二个参数是粒子的xy坐标.这里要说一下的就是这里的坐标是指从矩形的中心点开始算的.这个概念和我们的注册点是九宫格中间那点有点像所以这样就导致了一个现象.xy不是从左上角开始算的.是从中心点开始算的.这是要引起注意的地方.这里就知道可以解释为什么第一二个参数是15,200而不是0,0了.第三四个参数就是宽与高了.第五个参数是说粒子的角度.注意这里应该使用弧度制.第六个参数是说这个物体是是不是需要固定的(静止);
然后是setStyle方法.这个方法和我们的graohics.drawRect()差不多,具是设置粒子的样式.后面还会讲到给粒子一个皮肤(用自定义的剪辑);
groupWall.addParticle(rightWall);说的是我们把刚刚创建好的粒子加入到容器中.APEngine.addGroup(groupWall)就是把容器加入到APE引擎了..呵呵.看到上面的代码.也许有人会想了.那三个墙体创建方法是一样的.可以写成函数,ok,在下一篇我们将做得更彻底一点.把三面墙都写到一个叫做,世界边界类中.呵呵.

好了.现在我们的墙体已经差不多OK了.我们还要对引擎进行渲染;

  1. private function engineHandler(e:Event):void 
  2. {
  3.         //渲染
  4.                 
  5.         APEngine.step();
  6.         APEngine.paint();
  7. }
复制代码

这里需要注意的是应该放在帧处理事件中的.因为这是个不断渲染的过程.paint函数会使引擎不断的调用粒子的paint()方法.

这里我们的世界边界就完成了.注意.这里使用的世界边界只是指我们自己完成的墙体(和box2d 2.0版本的AABB世界边界不同,ape也不会帮我们
自动把超出世界边界的物体休眠);

好了.这里我们总结一下,创建粒子的基本步骤吧:
1.创个容器组(group)
2.创建粒子
3.把粒子加入容器组(group).
4.把容器组加入到引擎

根据这个原理.我们就可以知道了创建粒子的方法了.上面的创建圆形粒子(CircleParticle)的方法也是一样的.注意我们把他放到了全局变量中因为我们要操作它.关于圆形粒子的创建就不多说了,和矩形粒子不同的地方就是宽高变成了半截而已.剩下的.几乎是一模一样的.聪明的你一定能很快就领悟的.这里我想说的是这一句

  1. groupWall.addCollidable(groupFall);
复制代码

每个group都有这个方面.是接受另一个group的引用,这里的意思是说.着两个组需要互相碰撞.在这个例子的意思就是说圆形粒子要和墙体碰撞好了.说到这里.这一篇教程就大概算好了.关于组的作用.就我的理解就是.更方便的组织.特别是单我们下次把他整个放到一个类的时候.然后细心的你.一定看到了那个注释了.

  1. //rectFall = new RectangleParticle(Math.random() * 550, Math.random() * 20,Math.random() * -10 + 20,Math.random() * -10 + 20,Math.random()*3.14);
  2.                                 //groupFall.addParticle(rectFall);
复制代码

把那个注释打开.你会看到不可思议的事情发生...我试过调高他的模拟的精确值.还是解决不了.这里我不确定是我的方法错了.还是ape自身的不完善.希望有高手来指正一下.

下一篇我们将讨论更多类型的粒子.

 

分享到:
评论
1 楼 lmess 2011-08-11  
APE是什么版本的。。

弄到最新版本的APE还是得该Vector

相关推荐

    ape 开源 物理引擎

    ape,全称为“Advanced Physics Engine”,是一款高度可定制的开源物理引擎,旨在为开发者提供高效、精确的物理模拟功能。它的设计目标是让开发者能够轻松地将物理效果融入到自己的项目中,无论是简单的碰撞检测还是...

    java简单物理引擎

    APE是一款开源物理引擎,它主要用于模拟现实世界中的物体运动和碰撞。由于其遵循MIT许可协议,因此用户可以在个人项目和商业项目中自由使用。APE不仅易于上手,而且性能优越,尤其适用于需要物理效果的游戏开发。 #...

    APE物理引擎的中文说明文档

    APE(物理引擎)是一个基于ActionScript 3(AS3)的开源物理模拟库,专为Flash平台设计,用于创建动态的、具有真实感的物理效果。它允许开发者在2D环境中模拟物体的碰撞、重力和其他物理现象,为游戏、互动媒体和...

    APE物理引擎中文API

    【APE物理引擎中文API】是针对ActionScript 3(AS3)编程语言设计的一个物理引擎,主要用于模拟现实世界中的物体动态行为和碰撞效果。这款引擎是免费且开源的,遵循MIT协议,使得开发者可以在各种项目中灵活使用,...

    flash物理引擎APE小实例

    物理引擎是一种软件组件,它模拟现实世界中的物理现象,如重力、碰撞检测、摩擦力等,用于游戏开发、动画制作等领域。在Flash中,物理引擎如APE可以让开发者创建更加逼真和动态的交互体验。 APE(Actionscript ...

    APE as3 物理引擎

    0.5a版是该引擎的一个稳定版本,提供了一系列基础的物理特性,如碰撞检测、动态物体运动、力的计算等,为开发者提供了简单实用的工具来创建具有真实感的动态效果。 **一、基本概念** 1. **动态物体与静态物体**:...

    Ape物理引擎-白鹭(egret)库

    可用的超轻量的APE物理引擎库。min文件只有38k,APE中...实现了大部分物理模拟(弹性、摩擦力、牵引力等),对于初学物理引擎的同学可以从APE学起。但相比较另一个物理引擎Box2D来说,APE还缺乏例如多边形碰撞等等。

    APE物理引擎

    **APE物理引擎**是一种在Flash平台上使用的物理模拟库,它基于ActionScript 3.0(AS3.0)编程语言实现。这个引擎为开发者提供了一种在2D环境中创建复杂物理效果的能力,如碰撞检测、重力模拟以及物体动态行为等。在...

    CANape教程:从入门到精通

    ### CANape教程:从入门到精通 #### 一、CANape工具详解 **(1)CANape工具基本应用** CANape是一款由Vector公司开发的强大工具,主要用于车载网络系统的开发、测试与诊断。它支持多种总线协议,如CAN、LIN、...

    Java简单物理引擎.pdf

    Java简单物理引擎是一款基于Java语言开发的物理引擎,旨在提供简单易用的物理模拟解决方案。该引擎原本是基于FLASH版本的,后来被移植到Java和C++版本,但是Java版本和C++版本存在一定的差异。 APE(Actionscript ...

    [APE插件].APE-for-WMP

    【APE插件与APE音乐格式】 在数字音乐领域,APE是一种高保真音频压缩格式,全称为Monkey's Audio。它以其无损压缩技术而受到音乐爱好者的青睐,因为压缩后的APE文件可以在解压后完全恢复原始WAV音频数据,保持音质...

    APE AS3物理引擎学习

    通过学习和实践,你可以利用APE AS3物理引擎开发出令人印象深刻的Flash游戏,无论是简单的弹球游戏,还是复杂的平台跳跃类游戏,甚至是模拟物理实验,都能游刃有余。在深入学习的过程中,不断挑战自己,将物理理论与...

    flash as3 COVE.APE物理引擎(2D)

    COVE.APE物理引擎是为了解决2D游戏中的碰撞检测、重力模拟、物体运动等问题而诞生的。它提供了高级别的API,让开发者能够轻松地实现各种复杂的物理效果,比如物体之间的碰撞响应、弹性碰撞、摩擦力、浮力等。这个...

    APE物理引擎中文API.pdf

    APE物理引擎是一种基于ActionScript 3.0的物理引擎,用于模拟各种物理现象。该引擎提供了多种粒子类型,例如矩形粒子、圆形粒子、轮子粒子等,每种粒子都有其独特的属性和方法。 AbstractItem是APE物理引擎中的一个...

    java百度音乐播放器源码-HappyPlayer-PC:乐乐音乐播放器,支持ape,wav,flac,mp3等多种格式,支持动态ksc、hr

    swing音乐播放器,实现了mp3、flac、ape、wav等多种音频格式的播放和ksc歌词的解析、制作和显示 乐乐音乐6.0 乐乐6.0是网络版,添加了在线歌曲试听、下载、歌曲搜索、歌手头像、歌手写真及在线歌词功能,还有桌面...

    APE0.45物理引擎_中文版.rar

    《APE0.45物理引擎_中文版》是一款专为游戏开发者设计的物理模拟引擎,其主要功能是为游戏中的物体运动提供真实感的物理效果。这个版本是针对之前0.44或者其他早期版本的问题进行了修复,特别是解决了项目运行时出现...

    物理引擎APE中文帮助

    APE(Actionscript Physics Engine)是一款基于ActionScript 3开发的物理引擎,用于模拟现实世界中的物体运动和碰撞。它是免费、开源的,遵循MIT协议。APE非常适合游戏开发,已经有许多有趣的应用程序使用了这个引擎...

Global site tag (gtag.js) - Google Analytics