APE学习整理
1. APE调用的基本结构
{import
flash.display.Sprite;import
flash.events.Event;import
org.cove.ape.APEngine;import
org.cove.ape.CircleParticle;import
org.cove.ape.Group;import
org.cove.ape.RectangleParticle;import
org.cove.ape.VectorForce;public class
Sample0922extends
Sprite {public function
Sample0922() { APEngine.init(); APEngine.addForce(new
VectorForce(false,0,5)); APEngine.container = stage;var
group:Group =new
Group(); group.collideInternal =true
;var
ball:CircleParticle =new
CircleParticle(60,10,10,false,1,0.3,0);var
rect:RectangleParticle =new
RectangleParticle(110,300,250,20,0,true,1,0.3,0); group.addParticle(ball); group.addParticle(rect); APEngine.addGroup(group); stage.addEventListener(Event.ENTER_FRAME,onEnterFrame); }private function
onEnterFrame(event:Event):void
{ APEngine.step(); APEngine.paint(); } } }
2. CircleParticle(圆形粒子)
构造函数是:
CircleParticle( x:Number, y:Number, radius:Number, fixed:Boolean = false, mass:Number = 1, elasticity:Number = 0.3, friction:Number = 0 )
参数说明:
x -- 坐标x
y -- 坐标y
radius -- 圆半径
fixed -- 粒子是否为固定,默认为false(不固定)。如果粒子是固定的话,在受到力的作用或在碰撞过程中将保持不动;固定的粒子非常适合用来模拟表面
mass -- 粒子的质量,默认为1,大于0的值均为有效值。默认情况下所有的例子的质量均为1,质量与粒子形状的大小没有关系
elasticity -- 粒子的弹性,默认为0.3,标准的值在0到1之间。值越大,弹性越大。注意:在碰撞的过程中,弹性的值是累加的。如果一个粒子的弹性值为0.3,另一个粒子的弹性值为0,4,那么在碰撞的时候弹性值就是0.8了;这和一个粒子的弹性值是0,另一个弹性值是0.7产生的效果是一样的
friction -- 粒子表面的摩擦系数,默认为0,值必须在0到1之间。0代表没有摩擦(理想光滑),1代表完全的摩擦(像胶水一样);在碰撞中,摩擦系数也是累加的,但是被限制在1到0之间。例如:如果两个粒子表面的摩擦系数都是0.7的话,这两个粒子之间最终的摩擦力将会是1(完全的粘在一起)。注意:当前的版本有一个bug,那就是当和摩擦系数大于0且不固定的粒子碰撞时会得到错误的行为。一个解决方法就是,只给固定的粒子设置摩擦参数
3. RectangleParticle(矩形粒子)
构造函数是:
RectangleParticle( x:Number, y:Number, width:Number, height:Number, rotation:Number = 0, fixed:Boolean = false, mass:Number = 1, elasticity:Number = 0.3, friction:Number = 0 )
参数说明:
x -- 坐标x
y -- 坐标y
width -- 矩形宽度
height -- 矩形高度
rotation -- 矩形(顺时针)旋转弧度,可以用 (角度 * Math.PI / 180) 来得到弧度
fixed -- 粒子是否为固定,默认为false(不固定)。如果粒子是固定的话,在受到力的作用或在碰撞过程中将保持不动;固定的粒子非常适合用来模拟表面
mass -- 粒子的质量,默认为1,大于0的值均为有效值。默认情况下所有的例子的质量均为1,质量与粒子形状的大小没有关系
elasticity -- 粒子的弹性,默认为0.3,标准的值在0到1之间。值越大,弹性越大。注意:在碰撞的过程中,弹性的值是累加的。如果一个粒子的弹性值为0.3,另一个粒子的弹性值为0,4,那么在碰撞的时候弹性值就是0.8了;这和一个粒子的弹性值是0,另一个弹性值是0.7产生的效果是一样的
friction -- 粒子表面的摩擦系数,默认为0,值必须在0到1之间。0代表没有摩擦(理想光滑),1代表完全的摩擦(像胶水一样);在碰撞中,摩擦系数也是累加的,但是被限制在1到0之间。例如:如果两个粒子表面的摩擦系数都是0.7的话,这两个粒子之间最终的摩擦力将会是1(完全的粘在一起)。注意:当前的版本有一个bug,那就是当和摩擦系数大于0且不固定的粒子碰撞时会得到错误的行为。一个解决方法就是,只给固定的粒子设置摩擦参数
4. WheelParticle(轮子粒子)
构造函数是:
WheelParticle( x:Number, y:Number, radius:Number, fixed:Boolean = false, mass:Number = 1, elasticity:Number = 0.3, friction:Number = 0, traction:Number = 1 )
参数说明:
x -- 坐标x
y -- 坐标y
radius -- 轮子的半径
fixed -- 粒子是否为固定,默认为false(不固定)。如果粒子是固定的话,在受到力的作用或在碰撞过程中将保持不动;固定的粒子非常适合用来模拟表面
mass -- 粒子的质量,默认为1,大于0的值均为有效值。默认情况下所有的例子的质量均为1,质量与粒子形状的大小没有关系
elasticity -- 粒子的弹性,默认为0.3,标准的值在0到1之间。值越大,弹性越大。注意:在碰撞的过程中,弹性的值是累加的。如果一个粒子的弹性值为0.3,另一个粒子的弹性值为0,4,那么在碰撞的时候弹性值就是0.8了;这和一个粒子的弹性值是0,另一个弹性值是0.7产生的效果是一样的
friction -- 粒子表面的摩擦系数,默认为0,值必须在0到1之间。0代表没有摩擦(理想光滑),1代表完全的摩擦(像胶水一样);在碰撞中,摩擦系数也是累加的,但是被限制在1到0之间。例如:如果两个粒子表面的摩擦系数都是0.7的话,这两个粒子之间最终的摩擦力将会是1(完全的粘在一起)。注意:当前的版本有一个bug,那就是当和摩擦系数大于0且不固定的粒子碰撞时会得到错误的行为。一个解决方法就是,只给固定的粒子设置摩擦参数
traction -- 粒子受到的牵引力,默认为1。值必须在0到1之间,如果设置为0,即使在一个安全光滑的表面,轮子也会像陷入泥潭一样原地打转;也可以通过设置表面的摩擦系数(friction)为1,但即使表面像胶水一样,轮子还是可以缓慢的移动的;使用时结合轮子本身的牵引力(traction)和表面的friction(摩擦系数)来模拟各种效果
{import
flash.display.Sprite;import
flash.events.Event;import
flash.events.KeyboardEvent;import
flash.ui.Keyboard;import
org.cove.ape.APEngine;import
org.cove.ape.Group;import
org.cove.ape.RectangleParticle;import
org.cove.ape.VectorForce;import
org.cove.ape.WheelParticle;public class
Sample0923extends
Sprite {private var
wheel:WheelParticle;public function
Sample0923() { APEngine.init(0.25); APEngine.addForce(new
VectorForce(false,0,5)); APEngine.container = this;var
group:Group =new
Group(); group.collideInternal =true
;var
rect:RectangleParticle =new
RectangleParticle(100,80,200,5,0,true,1,0.3,0); wheel =new
WheelParticle(50,50,15,false,1,0.3,0,1); group.addParticle(rect); group.addParticle(wheel); APEngine.addGroup(group); stage.addEventListener(Event.ENTER_FRAME,onEnterFrame); stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyHandler); stage.addEventListener(KeyboardEvent.KEY_UP,onKeyHandler); }private function
onEnterFrame(event:Event):void
{ APEngine.step(); APEngine.paint(); }private function
onKeyHandler(event:KeyboardEvent):void
{if
(event.type == KeyboardEvent.KEY_DOWN) {if
(event.keyCode == Keyboard.LEFT) { wheel.angularVelocity = -0.1; } elseif
(event.keyCode == Keyboard.RIGHT) { wheel.angularVelocity = 0.1; } } else { wheel.angularVelocity = 0; } } } }
5. CollisionEvent(碰撞事件)
有两种碰撞事件,分别是CollisionEvent.COLLIDE和CollisionEvent.FIRST_COLLIDE,前者会在碰撞时不停触发,后者只在第一次碰撞时触发
每个粒子都有个sprite属性,可以设置该sprite的name以供事件调用
CollisionEvent.target -- 产生碰撞的对象(自身)
CollisionEvent.collidingItem -- 被碰撞的对象
{import
flash.display.Sprite;import
flash.events.Event;import
org.cove.ape.APEngine;import
org.cove.ape.CircleParticle;import
org.cove.ape.CollisionEvent;import
org.cove.ape.Group;import
org.cove.ape.RectangleParticle;import
org.cove.ape.VectorForce;import
org.cove.ape.WheelParticle;public class
Sample0923extends
Sprite {private var
wheel:WheelParticle;public function
Sample0923() { APEngine.init(0.25); APEngine.addForce(new
VectorForce(false,0,5)); APEngine.container = this;var
group:Group =new
Group(); group.collideInternal =true
;var
rect:RectangleParticle =new
RectangleParticle(220,280,400,5,0,true,1,0.3,0); rect.sprite.name ="方块"
;var
ball:CircleParticle =new
CircleParticle(95,10,10,false
);//ball.addEventListener(CollisionEvent.COLLIDE,onCollide);
ball.addEventListener(CollisionEvent.FIRST_COLLIDE,onCollide); ball.sprite.name ="一个球"
; group.addParticle(rect); group.addParticle(ball); APEngine.addGroup(group); stage.addEventListener(Event.ENTER_FRAME,onEnterFrame); }private function
onCollide(event:CollisionEvent):void
{trace
(event.collidingItem.sprite.name);var
temp:CircleParticle = event.targetas
CircleParticle;trace
(temp.sprite.name); }private function
onEnterFrame(event:Event):void
{ APEngine.step(); APEngine.paint(); } } }
6. setStyle(为粒子设置基本样式)
setStyle( lineThickness:Number = 0, lineColor:uint = 0x000000, lineAlpha:Number = 1, fillColor:uint = 0xffffff, fillAlpha:Number = 1 ):void
参数说明:
lineThickness -- 边框粗细,默认为0
lineColor -- 边框颜色,默认为0x000000(黑色)
lineAlpha -- 边框颜色透明度,默认为1(不透明)
fillColor -- 填充颜色,默认为0xffffff(白色)
fillAlpha -- 填充颜色透明度,默认为1(不透明)
7. setDisplay(为粒子设置显示对象)
渲染粒子时,可以分配一个显示对象(DisplayObject)来呈现该粒子
setDisplay( d:DisplayObject, offsetX:Number = 0, offsetY:Number = 0, rotation:Number = 0 ):void
参数说明:
d -- 显示对象
offsetX -- x方向的偏移,默认为0
offsetY -- y方向的偏移,默认为0
rotation -- 偏移角度,默认为0
8. APEngine.damping(全局的阻力)
值在0到1之间,默认值为1(没有阻力),值越大阻力越小
当值为0时,所有的粒子都不能运动了,因为阻力太大了;当值为1表示没有任何阻力
dumping会减慢你的模拟速度使你的模拟更稳定,如果你发现你的模拟出现跑飞现象,试着更正damping的值