APE物理引擎初探+实例

先去 http://www.cove.org/ape/index.htm 下载作者的最新版APE
然后打开说明文档 docs/api/index.html
这里一共十二个类,看起来很少,所以初学者可以更有信心了。
***************************************************************************************************
先简单介绍一下:
AbstractCollection   所有群组的抽象类
AbstractConstraint   所有物理相互作用的的抽象类
AbstractItem   所有相互作用(碰撞)、粒子的基类
AbstractParticle   关于粒子的基类
APEngine 主引擎、力的类
CircleParticle   圆形粒子
RectangleParticle   矩形粒子
Composite   可以包含粒子和碰撞的复合物类
Group 一个组的类,可以包含粒子、碰撞、复合物
SpringConstraint 两个粒子之间类似弹性碰撞的类(弹簧)
Vector  
WheelParticle   一个粒子,模拟轮子行为
********************************************************************************************
这些类的继承关系:
AbstractCollection   所有群组的抽象类
              Composite   可以包含粒子和碰撞的复合物类
              Group 一个组的类,可以包含粒子、碰撞、复合物
AbstractItem   所有相互作用(碰撞)、粒子的基类
              AbstractConstraint   所有物理相互作用的的抽象类
                             SpringConstraint 两个粒子之间类似弹性碰撞的类(弹簧)
              AbstractParticle   关于粒子的基类
                             RectangleParticle   矩形粒子
                             CircleParticle   圆形粒子
                                           WheelParticle   一个粒子,模拟轮子行为
APEngine 主引擎、力的类
Vector

OK,对这个物理引擎,我们已经有了初步认识了,下面我们就利用它实现一个简单的小例子,同时了解它的用法:
先看下这个例子的效果
用WSAD可以给其中一个球的轴方向加力,这个球的质量有别于其他的球。
下面的几个按钮 可以给整个容器加力,先试一下效果吧~  ^&^
http://blog.5d.cn/user47/hzq1122/upload/2008-06/myP.swf
***************************************************************************************************************
下面开始制作:
我用的工具 是Flex,所以以Flex制作为例,如果还没安装,就搜一下,尽量安装eclipse的Flex插件版
****************************************************************************************************************
这里我建了1个类,作为边界框。代码 如下:
package
{
import org.cove.ape.*; //导入包
public class Floor extends Group
{
  public function Floor()
  {
//定义矩形粒子,括号内参数依次为:横坐标,纵坐标,宽度,高度,弧度,是否固定。
   var diban1:RectangleParticle=new RectangleParticle(250,0,400,10,0,true)
   var diban2:RectangleParticle=new RectangleParticle(250,400,400,10,0,true)
   var diban3:RectangleParticle=new RectangleParticle(50,200,400,10,Math.PI/2,true)
   var diban4:RectangleParticle=new RectangleParticle(450,200,400,10,Math.PI/2,true)
//矩形粒子的父类AbstractItem的setStyle方法。
   diban1.setStyle(1,0x006699,1,0x663366,1)
   diban2.setStyle(1,0x006699,1,0x663366,1)
   diban3.setStyle(1,0x006699,1,0x663366,1)
   diban4.setStyle(1,0x006699,1,0x663366,1)
//添加该粒子,(就当它是addChild理解吧)
   addParticle(diban1);
   addParticle(diban2);
   addParticle(diban3);
   addParticle(diban4);
  }
}
}
ok,边界框的类写完了。下面写mxml文件
****************************************************************************************************************
源码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicati>
<mx:Script>
  <![CDATA[
   import mx.core.UIComponent;
   import org.cove.ape.*;
//Flex需要UIComponent做容器,所以定义一个作为物理引擎的容器
   private var APEcontent:UIComponent;
   private var heros:Group
   private var floors:Floor
   private var others:Array
   
   private var hero:CircleParticle
   
   private function GameTest():void {
//帧频设高点会更流畅。
   stage.frameRate = 100
   heros=new Group();
   floors=new Floor();
   others=new Array();
   APEcontent = new UIComponent();
   addChild(APEcontent)
   APEngine.init(0.25);
   APEngine.container=APEcontent;

//定义10个球
   for (var i:int=0;i<10;i++){
    var other:Group=new Group()
    APEngine.addGroup(other)
    other.addParticle(new CircleParticle(Math.random()*100+50,Math.random()*100+20,10))
    others =other
//使这个球与组内的其他成员产生作用
    other.addCollidableList(others)
   }
   
   APEngine.addGroup(heros);
   hero=new CircleParticle(150,20,10,false,2);
   heros.addParticle(hero)
//使这个hero与others内的成员产生作用
   heros.addCollidableList(others)
   APEngine.addGroup(floors);
   floors.addCollidable(heros)
//同上类似
   floors.addCollidableList(others)
   
   stage.addEventListener(KeyboardEvent.KEY_DOWN,onD);
   stage.addEventListener(Event.ENTER_FRAME,onF);
  }
  public function onD(e:KeyboardEvent):void {
   switch (e.keyCode) {
    case "W".charCodeAt() :
     hero.addForce(new Vector(0,-3));
//addForce和addMasslessForce的区别,在于是否忽略质量
     //hero.addMasslessForce(new Vector(0,-3));
     break;
    case "S".charCodeAt() :
     hero.addForce(new Vector(0,3));
     break;
    case "A".charCodeAt() :
     hero.addForce(new Vector(-3,0));
     break;
    case "D".charCodeAt() :
     hero.addForce(new Vector(3,0));
     break;
   }
  }
  public function onF(e:Event):void {
   //重绘
   APEngine.step();
   APEngine.paint();
  }
//建立几个按钮,点击执行如下方法
  private function left():void{
   APEngine.addMasslessForce(new Vector(-3,0));
  }
  private function right():void{
   APEngine.addForce(new Vector(3,0));
  }
  private function up():void{
   APEngine.addForce(new Vector(0,-3));
  }
  private function down():void{
   APEngine.addForce(new Vector(0,3));
  }
  private function nothing():void{
   APEngine.addForce(new Vector(0,0));
  }
  ]]>
</mx:Script>
<mx:Button x="10" y="410" label="left" click="left()"/>
<mx:Button x="64" y="410" label="right" click="right()"/>
<mx:Button x="125" y="410" label="up" click="up()"/>
<mx:Button x="173" y="410" label="down" click="down()"/>
<mx:Button x="237" y="410" label="nothing" click="nothing()"/>
</mx:Application>

****************************************************************************************************
这个过程就完成了,再提一下AbstractParticle 这个类最常用的属性 和方法
center : Vector
[read-only] Returns A Vector of the current location of the particle
返回加在当前对象身上的力
collidable : Boolean
Determines if the particle can collide with other particles or constraints.
决定当前粒子是否与其他粒子或作用产生作用
elasticity : Number
The elasticity of the particle.
弹性
fixed : Boolean
The fixed state of the particle.
是否固定
friction : Number
The surface friction of the particle.
粒子表面摩擦力
mass : Number
The mass of the particle.
质量
px : Number
The x position of this particle
py : Number
The y position of this particle
*************************************************************************************************************
现在你可以延伸一下,尝试着做出一个类似台球的游戏 了!简单吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值