APE学习整理

1. APE调用的基本结构

package
 {
 
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
 Sample0922
extends
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(圆形粒子)

构造函数是:

public function
 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(矩形粒子)

构造函数是:

public function
 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(轮子粒子)

构造函数是:

public function
 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(摩擦系数)来模拟各种效果

package
 {
 
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
 Sample0923
extends
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;
    }
    else 
if
(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 -- 被碰撞的对象

package
 {
 
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
 Sample0923
extends
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.target  
as
  CircleParticle;
   
trace
(temp.sprite.name);
  }
  
  
private function
 onEnterFrame(event:Event):
void
  {
   APEngine.step();
   APEngine.paint();
  }
 }
}

6. setStyle(为粒子设置基本样式)

public function
 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)来呈现该粒子

public function
 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的值

posted @ 2010-07-15 14:51  CoderWayne  阅读(584)  评论(0编辑  收藏  举报