flash物理引擎APE 快速上手教程

来源:互联网 发布:nexvap电子烟 知乎 编辑:程序博客网 时间:2024/05/21 12:08

flash物理引擎APE 快速上手教程

APE是Actionscript Physics Engine的缩写,即为Actionscript的物理引擎。还有其他的as的物理引擎,比如说Box2d,这个以后再学习,现在先从较为简单的APE开始学习。
此教程专为从未接触过APE的童鞋们设计,来帮助大家快速使用APE,至于一些比较深层的内容,待笔者深入了解后再讨论。
现在就开始吧。
1.粒子

在一个物理世界里,首先应该有一些物体吧。在APE的世界中,物体即为粒子。这些粒子可以理解为各种物体,如地上的桌子,椅子,弹来弹去的乒乓球,在APE里甚至地面也是粒子。
这些粒子分为四种:CircleParticle(圆形粒子),WheelParticle(轮形粒子),RectangleParticle(矩形粒子),SpringConstraint(约束粒子)。(其实约束和其他粒子并不是继承共同的父类,但是在运动中它们表现出来的性质大致相同,所以在这里一并作为粒子讲解)

创建圆形粒子
var circleParticle:CircleParticle=new CircleParticle(x坐标,y坐标,半径,是否固定:Boolean,质量(0-1),弹性(0-1),摩擦力(0-1))
前三个是必要的,后面的参数如果不填即为默认值。还有一点要注意,与flash中不同,APE中的注册点在中心。

创建轮形粒子
var whellparticle:WheelParticle=new WheelParticle(x坐标,y坐标,半径,是否固定,质量,弹性,摩擦力,表面的牵引力(0-1))
在构造函数中,看似和CircleParticle大致相同,不同的是WheelParticle粒子可以在运动时绕中心转动,像轮子一样,而且还可以添加牵引力。
还有angleVelocity,是轮形粒子的角速度,speed轮形粒子的速度,可以通过修改这俩个值来控制轮子的运动。

创建矩形粒子
var rectangleParticle:RectangleParticle=new RectangleParticle(x坐标,y坐标,粒子宽度,粒子高度,旋转弧度,是否固定,质量,弹性,摩擦力)
小技巧:固定的矩形粒子仍然可以改变它的旋转属性。
对于矩形来说比较简单,没什么特别的了。

创建约束粒子
var springConstraint:SpringConstraint=new SpringConstraint(粒子1,粒子2,约束强度(0-1),是否接收碰撞检测,碰撞区域高度,碰撞区域的缩放,是否接收碰撞区域随着粒子的距离而缩放)
对于约束,主要是用于连接俩个共同运动的粒子,可以用连续多个与约束做出链条的效果。

粒子父类

AbstractParticle是CircleParticle和RectangleParticle的父类

主要属性

center:Vector 粒子的当前位置
colliable是否碰撞检测,默认为true
elasticity弹性,(0-1),可以大于1,但是碰撞时能量会增加
fixed是否固定
firction摩擦力
mass质量
px粒子的x坐标
py粒子的y坐标
velocity:Vector粒子的速度

主要方法

addForce()给粒子一个考虑质量的力
addMassLessForce()给粒子一个忽略质量的力
setDisplay()在渲染粒子的时候分配一个显示对象(DisplayObject)来使用
AbstractConstraint是SpringConstraint的父类

stiffness使约束变硬,值越大越硬

这里没说到WheelParticle的父类,笔者在其他教程中也未见说明,通过看源文件可以发现,WheelParticle的父类是CircleParticle。
AbstractItem是AbstractConstraint和AbstractParticle的父类

主要属性
visible:Boolean决定粒子是否可见
2.组与复合体

在一个物理世界里只有粒子是远远不够的,在需要很多其他东西

关于组

组是Group,组可以包含粒子和复合体,组可以被设置为和其他组进行碰撞测试

创建一个组

var group:Group=new Group(是否组内的成员进行碰撞检测:Boolean)

方法

addParticle(),addConstraint()在组中加入粒子、约束,粒子和约束只有加入到组中才能接收碰撞检测
addCollidable()加入一个组的实例与该组进行碰撞检测
addCollodableList()加入一个数组,数组中的组与这个组进行碰撞检测
addComposite()在这个组中加入复合体
removeComposite(),removeCollidable(),removeParticle(),removeConstraint(),各种从组中移除

关于复合体

复合体可以包含粒子和约束,复合体中的成员彼此不能进行碰撞检测

属性
是否固定fixed,决定复合体的状态是否固定,当复合体任何一个粒子不固定时,fixed值返回false

方法
rotateByAngle()方法
public function rotateByAngle(角度, center:Vector):void
围绕给定的中心,使复合体旋转参数指定的角度。

rotateByRadian()方法
public function rotateByRadian(弧度, center:Vector):void
围绕给定的中心,使复合体旋转参数指定的弧度。

3.APEngine
现在有了粒子,并且知道如何把粒子加入组中,也知道了如何实现组与组之间的碰撞检测,但是仍未实现一个物理世界,这时候就需要APEngine
APEngine是一个静态类,所以里面的所有属性和方法都是静态的

container属性
container:DisplayObjectContainer(读写)
粒子和约束的painting方法默认的容器。如果你要用到内建的painting方法,你必须首先设置它。

方法
addMasslessForce()加一个忽略质量的力,可以用来模拟重力
addForce()加一个考虑质量的力,可以模拟风力
addGroup()把组加入到引擎中
init() 初始化引擎,默认值为1/4,值越低越精确。

paint()和step()方法要在主程序中循环使用,要建立一个ENTER_FRAME的侦听,来执行APEngine的paint()和step()方法。

下面给出一个简单的例子
先是文档类

package {import flash.display.*;import flash.events.*;import org.cove.ape.*; public class wendanglei extends Sprite { private var example:Example; public function wendanglei() {//对舞台进行一些设置stage.scaleMode=StageScaleMode.NO_SCALE;stage.frameRate=55; example=new Example(stage);//实例化之前定义的类 //加一个侦听器,调用paint()和step()函数addEventListener(Event.ENTER_FRAME,run); //对APEngine的初始化APEngine.init(1 / 4);APEngine.container=this;APEngine.addForce(new Vector(0,2));//把example组加入到引擎中APEngine.addGroup(example);}private function run(e:Event) {APEngine.step();APEngine.paint(); }}}

然后是一个定义了各种粒子的组

package {import flash.display.*;import flash.events.*;import org.cove.ape.*; public class Example extends Group { //声明变量private var mStage:Stage;private var group:Group;private var Ball1:CircleParticle;private var Ball2:CircleParticle;private var Ball3:CircleParticle;private var lian1:SpringConstraint;private var lian2:SpringConstraint;private var Wall1:RectangleParticle;private var Wall2:RectangleParticle;private var Wall3:RectangleParticle;private var wheel:WheelParticle; public function Example(mStage:Stage) { //变量的初始化Ball1=new CircleParticle(200,295,5,true);Ball2=new CircleParticle(5,150,5,true);Ball3=new CircleParticle(390,150,5,true);lian1=new SpringConstraint(Ball1,Ball2,1,true,10);lian2=new SpringConstraint(Ball1,Ball3,1,true,10);Wall1=new RectangleParticle(200,-5,400,10,0,true);Wall2=new RectangleParticle(-5,75,10,150,0,true);Wall3=new RectangleParticle(405,75,10,150,0,true);wheel=new WheelParticle(20,10,10); //把粒子和约束加入到组里addParticle(Ball1);addParticle(Ball2);addParticle(Ball3);addParticle(Wall1);addParticle(Wall2);addParticle(Wall3);addParticle(wheel);addConstraint(lian1);addConstraint(lian2); //组内的粒子之间可以碰撞检测this.collideInternal=true; //在舞台上添加侦听this.mStage = mStage;this.mStage.addEventListener(MouseEvent.MOUSE_DOWN,AddForce);}//在点击鼠标时,给wheel一个随机的力private function AddForce(e:MouseEvent) {wheel.addForce(new Vector(100*Math.random(),100*Math.random()));}}}