APE AS3物理引擎类学习资料

本文介绍如何使用APE物理引擎实现一个简单的游戏,包括边界框类编写、MXML文件实现,以及如何利用物理引擎进行球体碰撞、施力等操作。通过实例展示物理引擎在游戏开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

APE as3物理引擎,一共才十二个类,很适合初学者初次接触AS3物理的一个类。

官方博客: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可以给其中一个球的轴方向加力,这个球的质量有别于其他的球。

下面的几个按钮
可以给整个容器加力,先试一下效果吧~  ^&^

***************************************************************************************************************

下面开始制作:

我用的工具
是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,0×006699,1,0×663366,1)

   diban2.setStyle(1,0×006699,1,0×663366,1)

   diban3.setStyle(1,0×006699,1,0×663366,1)

   diban4.setStyle(1,0×006699,1,0×663366,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、付费专栏及课程。

余额充值