加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash物理引擎APE 快速上手教程

发布时间:2020-12-15 06:27:52 所属栏目:百科 来源:网络整理
导读:flash物理引擎APE 快速上手教程 APE是Actionscript Physics Engine的缩写,即为Actionscript的物理引擎。还有其他的as的物理引擎,比如说Box2d,这个以后再学习,现在先从较为简单的APE开始学习。 此教程专为从未接触过APE的童鞋们设计,来帮助大家快速使用A

flash物理引擎APE 快速上手教程

APE是Actionscript Physics Engine的缩写,即为Actionscript的物理引擎。还有其他的as的物理引擎,比如说Box2d,这个以后再学习,现在先从较为简单的APE开始学习。
此教程专为从未接触过APE的童鞋们设计,来帮助大家快速使用APE,至于一些比较深层的内容,待笔者深入了解后再讨论。
现在就开始吧。
1.粒子

在一个物理世界里,首先应该有一些物体吧。在APE的世界中,物体即为粒子。这些粒子可以理解为各种物体,如地上的桌子,椅子,弹来弹去的乒乓球,在APE里甚至地面也是粒子。
这些粒子分为四种:CircleParticle(圆形粒子),WheelParticle(轮形粒子),RectangleParticle(矩形粒子),SpringConstraint(约束粒子)。(其实约束和其他粒子并不是继承共同的父类,但是在运动中它们表现出来的性质大致相同,所以在这里一并作为粒子讲解)

创建圆形粒子
var circleParticle:CircleParticle=new CircleParticle(x坐标,y坐标,半径,是否固定:Boolean,质量(0-1),弹性(0-1),摩擦力(0-1))
前三个是必要的,后面的参数如果不填即为默认值。还有一点要注意,与flash中不同,APE中的注册点在中心。

创建轮形粒子
var whellparticle:WheelParticle=new WheelParticle(x坐标,y坐标,半径,是否固定,质量,弹性,摩擦力,表面的牵引力(0-1))
在构造函数中,看似和CircleParticle大致相同,不同的是WheelParticle粒子可以在运动时绕中心转动,像轮子一样,而且还可以添加牵引力。
还有angleVelocity,是轮形粒子的角速度,speed轮形粒子的速度,可以通过修改这俩个值来控制轮子的运动。

创建矩形粒子
var rectangleParticle:RectangleParticle=new RectangleParticle(x坐标,y坐标,粒子宽度,粒子高度,旋转弧度,是否固定,质量,弹性,摩擦力)
小技巧:固定的矩形粒子仍然可以改变它的旋转属性。
对于矩形来说比较简单,没什么特别的了。

创建约束粒子
var springConstraint:SpringConstraint=new SpringConstraint(粒子1,粒子2,约束强度(0-1),是否接收碰撞检测,碰撞区域高度,碰撞区域的缩放,是否接收碰撞区域随着粒子的距离而缩放)
对于约束,主要是用于连接俩个共同运动的粒子,可以用连续多个与约束做出链条的效果。

粒子父类

AbstractParticle是CircleParticle和RectangleParticle的父类

主要属性

center:Vector 粒子的当前位置
colliable是否碰撞检测,默认为true
elasticity弹性,(0-1),可以大于1,但是碰撞时能量会增加
fixed是否固定
firction摩擦力
mass质量
px粒子的x坐标
py粒子的y坐标
velocity:Vector粒子的速度

主要方法

addForce()给粒子一个考虑质量的力
addMassLessForce()给粒子一个忽略质量的力
setDisplay()在渲染粒子的时候分配一个显示对象(DisplayObject)来使用
AbstractConstraint是SpringConstraint的父类

stiffness使约束变硬,值越大越硬

这里没说到WheelParticle的父类,笔者在其他教程中也未见说明,通过看源文件可以发现,WheelParticle的父类是CircleParticle。
AbstractItem是AbstractConstraint和AbstractParticle的父类

主要属性
visible:Boolean决定粒子是否可见
2.组与复合体

在一个物理世界里只有粒子是远远不够的,在需要很多其他东西

关于组

组是Group,组可以包含粒子和复合体,组可以被设置为和其他组进行碰撞测试

创建一个组

var group:Group=new Group(是否组内的成员进行碰撞检测:Boolean)

方法

addParticle(),addConstraint()在组中加入粒子、约束,粒子和约束只有加入到组中才能接收碰撞检测
addCollidable()加入一个组的实例与该组进行碰撞检测
addCollodableList()加入一个数组,数组中的组与这个组进行碰撞检测
addComposite()在这个组中加入复合体
removeComposite(),removeCollidable(),removeParticle(),removeConstraint(),各种从组中移除

关于复合体

复合体可以包含粒子和约束,复合体中的成员彼此不能进行碰撞检测

属性
是否固定fixed,决定复合体的状态是否固定,当复合体任何一个粒子不固定时,fixed值返回false

方法
rotateByAngle()方法
public function rotateByAngle(角度,center:Vector):void
围绕给定的中心,使复合体旋转参数指定的角度。

rotateByRadian()方法
public function rotateByRadian(弧度,center:Vector):void
围绕给定的中心,使复合体旋转参数指定的弧度。

3.APEngine
现在有了粒子,并且知道如何把粒子加入组中,也知道了如何实现组与组之间的碰撞检测,但是仍未实现一个物理世界,这时候就需要APEngine
APEngine是一个静态类,所以里面的所有属性和方法都是静态的

container属性
container:DisplayObjectContainer(读写)
粒子和约束的painting方法默认的容器。如果你要用到内建的painting方法,你必须首先设置它。

方法
addMasslessForce()加一个忽略质量的力,可以用来模拟重力
addForce()加一个考虑质量的力,可以模拟风力
addGroup()把组加入到引擎中
init() 初始化引擎,默认值为1/4,值越低越精确。

paint()和step()方法要在主程序中循环使用,要建立一个ENTER_FRAME的侦听,来执行APEngine的paint()和step()方法。

下面给出一个简单的例子
先是文档类

package {
	import flash.display.*;
	import flash.events.*;
	import org.cove.ape.*;
 
	public class wendanglei extends Sprite {
 
		private var example:Example;
 
		public function wendanglei() {
			//对舞台进行一些设置
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.frameRate=55;
 
			example=new Example(stage);//实例化之前定义的类
 
			//加一个侦听器,调用paint()和step()函数
			addEventListener(Event.ENTER_FRAME,run);
 
			//对APEngine的初始化
			APEngine.init(1 / 4);
			APEngine.container=this;
			APEngine.addForce(new Vector(0,2));
			//把example组加入到引擎中
			APEngine.addGroup(example);
		}
		private function run(e:Event) {
			APEngine.step();
			APEngine.paint();
 
		}
	}
}

然后是一个定义了各种粒子的组

package {
	import flash.display.*;
	import flash.events.*;
	import org.cove.ape.*;
 
	public class Example extends Group {
 
		//声明变量
		private var mStage:Stage;
		private var group:Group;
		private var Ball1:CircleParticle;
		private var Ball2:CircleParticle;
		private var Ball3:CircleParticle;
		private var lian1:SpringConstraint;
		private var lian2:SpringConstraint;
		private var Wall1:RectangleParticle;
		private var Wall2:RectangleParticle;
		private var Wall3:RectangleParticle;
		private var wheel:WheelParticle;
 
		public function Example(mStage:Stage) {
 
			//变量的初始化
			Ball1=new CircleParticle(200,295,5,true);
			Ball2=new CircleParticle(5,150,true);
			Ball3=new CircleParticle(390,true);
			lian1=new SpringConstraint(Ball1,Ball2,1,true,10);
			lian2=new SpringConstraint(Ball1,Ball3,10);
			Wall1=new RectangleParticle(200,-5,400,10,true);
			Wall2=new RectangleParticle(-5,75,true);
			Wall3=new RectangleParticle(405,true);
			wheel=new WheelParticle(20,10);
 
			//把粒子和约束加入到组里
			addParticle(Ball1);
			addParticle(Ball2);
			addParticle(Ball3);
			addParticle(Wall1);
			addParticle(Wall2);
			addParticle(Wall3);
			addParticle(wheel);
			addConstraint(lian1);
			addConstraint(lian2);
 
			//组内的粒子之间可以碰撞检测
			this.collideInternal=true;
 
			//在舞台上添加侦听
			this.mStage = mStage;
			this.mStage.addEventListener(MouseEvent.MOUSE_DOWN,AddForce);
		}
		//在点击鼠标时,给wheel一个随机的力
		private function AddForce(e:MouseEvent) {
			wheel.addForce(new Vector(100*Math.random(),100*Math.random()));
		}
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读