`
wgcode
  • 浏览: 577609 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

APE 2D物理引擎使用

阅读更多

先去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
*************************************************************************************************************
现在你可以延伸一下,尝试着做出一个类似台球的游戏了!简单吧!

拙漏之处,请指正。。 ^ ^
********************************************************************************************

 


原文地址:http://blog.5d.cn/user47/hzq1122/200806/488354.html

 

 

AS3物理引擎APE试用

以前就听说过APE啦,只不过没去研究过它,而且中文资料N少。下午去N神的BLOG偶尔又看到这个东东,决定研究一下。
APE相对来说比较简单,总共就12个类。以下代码显示了物体做自由落体运动,与另一物体发生碰撞的过程,基本没什么难度~只是APE的试用而已,开发工具为FLEX3。详细的说明见注释。

运行演示http://www.d5power.com/?p=140

    1. import org.cove.ape.*;// 包含ape包
    2.   
    3.   public var mytester:RectangleParticle;//声明一个矩形物体
    4.   public var mygroup:Group;//声明一个物件组
    5.   public var mytester2:RectangleParticle;
    6.   public var mygroup2:Group
    7.   public function init():void
    8.   {
    9.    // 初始化矩形,设置坐标为200:300,尺寸为200:50,旋转角度0,固定
    10.    mytester=new RectangleParticle(200,300,200,50,0,true);
    11.    // 声明组
    12.    mygroup=new Group();
    13.    // 初始化一个不固定的矩形(受重力影响)
    14.    mytester2=new RectangleParticle(200,0,100,100,0);
    15.    mygroup2=new Group();
    16.    
    17.    // 向物件组中添加物件
    18.    mygroup.addParticle(mytester);
    19.    mygroup2.addParticle(mytester2);
    20.    
    21.    
    22.    stage.frameRate = 55;
    23.    
    24.    // 初始化引擎
    25.    APEngine.init(0.25);
    26.    // 指定容器
    27.    APEngine.container = stage;
    28.    // 增加物件组
    29.    APEngine.addGroup(mygroup);
    30.    APEngine.addGroup(mygroup2);
    31.    APEngine.addForce(new Vector(0, 9.8));
    32.    // 规定碰撞检测,为mygorup指定检测对象为mygroup2
    33.    mygroup.addCollidable(mygroup2);
    34.    
    35.    stage.addEventListener(MouseEvent.CLICK, mouseup);
    36.    // 刷新场景
    37.    stage.addEventListener(Event.ENTER_FRAME,run)
    38.   }
    39.   
    40.   public function run(e:Event):void
    41.   {
    42.    APEngine.step();
    43.    APEngine.paint();
    44.   }
    45.   
    46.   public function mouseup(e:MouseEvent):void
    47.   {
    48.    mytester.radian=10;
    49.   }
    复制代码

运行演示:http://www.d5power.com/?p=140

 

FLASH的物理引擎.应用好像并不多.不过拿来玩玩也挺不错的..如果能够应用得好的话.放到游戏中效果应该不错..
我本人是从前两个月才开始正式使用as3的.所以算是菜鸟级了..现在来献献丑咯..毕竟在这论坛里也呆了几年了..学了不少东西..现在有机会也来教教新人啦..忽忽...

目前我知道的FLASH 2d物理引擎,应用比较多的大概就是Box2D和APE了..而Box2D虽然强大.但是太过于复杂了..所以本人也就选择了轻量级的APE了..简单好学.效果也并不差...
那么首先.大家可以到http://www.cove.org/ape/这里下载APE的最新版..其实很早以前就是这个版本了.好像一直没更新..右上角Downloads下第一个alpha 0.45 is the current release.

题外话.在GoogleCode上面有修改版.所以网上的教程有的出错的原因就是在于你的版本可能和教程作者的版本不同..我目前使用的是GoogleCode上面的修改版.其实就是先下载上面网站的alpha 0.45版.然后下载http://ape.googlecode.com/svn/trunk/source/org/cove/ape/这里的文件覆盖一下你下载的alpha 0.45版就行了..

在本文的结尾我会将已经下载并覆盖的版本用附件上传..当然如果能够上传的话..呵呵..

接下来.因为也是今天才刚接触了下APE.如果有不对的地方请高手多指点.大家一起进步..目前这还只是个初级教程..

APE的使用步骤.我归纳为5步.具体有哪5步呢?我列出一段代码并添加注释..

复制内容到剪贴板
代码:
//1.导入类包
import org.cove.ape.*;
import flash.events.Event;
//2.初始化引擎:
APEngine.init();//初始化引擎
APEngine.container = this;//指定容器;
APEngine.addForce(new VectorForce(false,0,5));//添加力;
//3.添加物体(粒子,约束,复合体,组...)
var defaultGroup:Group = new Group();//建一个默认组;
defaultGroup.collideInternal = true;//组内的对象互相之间有作用力;
var a:CircleParticle = new CircleParticle(350,30,5,false);//创建一个圆形粒子;
var b:CircleParticle = new CircleParticle(100,150,4,false);//创建一个圆形子;
var c:RectangleParticle = new RectangleParticle(stage.stageWidth/2,stage.stageHeight-10,stage.stageWidth,10,0,true);//创建一个矩形粒子;
var d:RectangleParticle = new RectangleParticle(0,stage.stageHeight/2,10,stage.stageHeight,0,true);
var e:RectangleParticle = new RectangleParticle(stage.stageWidth,stage.stageHeight/2,10,stage.stageHeight,0,true);
var wa: WheelParticle = new WheelParticle(150,10,15,false,2);//创建一个轮子粒子;
var wb: WheelParticle = new WheelParticle(200,10,15,false,2);//创建一个轮子粒子;
var wc:SpringConstraint = new SpringConstraint(wa, wb, 1, false);//创建一个约束,将两个轮子粒子连接起来;
defaultGroup.addParticle(a);//在组中添加a粒子;
defaultGroup.addParticle(b);//在组中添加b粒子;
defaultGroup.addParticle(c);//在组中添加c粒子;
defaultGroup.addParticle(d);//在组中添加d粒子;
defaultGroup.addParticle(e);//在组中添加e粒子;
defaultGroup.addParticle(wa);//在组中添加wa轮子粒子;
defaultGroup.addParticle(wb);//在组中添加wb轮子粒子;
defaultGroup.addConstraint(wc);//在组中添加约束;
//<!--这里应该调用Object.setStyle()或Object.setDisplay()来显示自己想要的外观-->
//4.将组添加到引擎;
APEngine.addGroup(defaultGroup);//将组添加到引擎,因为组的collideInternal属性为true,所以组内部的粒子会互相产生物理作用;
//5.添加侦听器.刷新粒子引擎;
stage.addEventListener(Event.ENTER_FRAME, run);
function run(evt:Event):void {
    APEngine.step();
    APEngine.paint();
}
//<!--额外添加代码-->
import flash.events.KeyboardEvent;
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyHandler);
stage.addEventListener(KeyboardEvent.KEY_UP,keyHandler);
function keyHandler(event:KeyboardEvent) {
    if (event.type==KeyboardEvent.KEY_DOWN) {
        if (event.keyCode==Keyboard.LEFT) {
            wa.angularVelocity = -0.1;
            wb.angularVelocity = -0.1;
            //轮子粒子向左滚动;
        } else if (event.keyCode==Keyboard.RIGHT) {
            wa.angularVelocity = 0.1;
            wb.angularVelocity = 0.1;
        }//轮子粒子向右滚动;
    } else {
        wa.angularVelocity = 0;
        wb.angularVelocity = 0;
        //轮子粒子停止滚动;
    }
}

 

代码看起来很多..实际上大家看一下我归纳的5步..并不复杂..这样就构建了一个简单的物理世界...快复制代码到flash的第一帧上去导出看效果吧.记得语言版本是AS3.0 哦!~
中间不明白的可以在楼下提问...构造函数中的参数大家可以自行查找API文档..
本篇文档中的例子部分修改自http://www.emanueleferonato.com/2007/10/23/ape-actionscript-physics-engine-tutorial-part-2/

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics