使用OOP编程思想实现自由落体运动程序网络上有很多关于Flash模拟实现.docx_第1页
使用OOP编程思想实现自由落体运动程序网络上有很多关于Flash模拟实现.docx_第2页
使用OOP编程思想实现自由落体运动程序网络上有很多关于Flash模拟实现.docx_第3页
使用OOP编程思想实现自由落体运动程序网络上有很多关于Flash模拟实现.docx_第4页
使用OOP编程思想实现自由落体运动程序网络上有很多关于Flash模拟实现.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用OOP编程思想实现自由落体运动程序网络上有很多关于Flash模拟实现重力场的教程,但是大多都是使用AS2写的。那么今天我们就使用AS3编程语言,基于面向对象编程思想来实现这个程序。首先,我们就不免俗的再老生常谈一下什么是面向对象思想。顾名思义,就是以对象为基础的思想,通俗点说就是“神马”都是“对象”。这里这个“对象”可不是找“对象”的那个“对象”,对象指的是要研究的事物,我们可以把所有要研究的事物当作对象,对象可以是具体的事物,也可以是抽象的原理、规则等。定义好了对象,那么我们研究对象的时候,应该从哪下手呢?我们在研究对象的时候,主要是从两个方面着手,对象的“状态”和对象的“行为”,如果应用到我们的程序里,就是类的属性和方法。关于AS3的类和对象我们就不再累赘了,有兴趣的同学可以自己找书籍或者加入我们的AS3基础班学习。接下来开始着手我们要做的那个重力程序吧!第一步:复习物理学上学习重力知识。翻开我们的物理课本,翻到物体的运动这章,找到运动学的基本公式:S = S0 + vt; 每个时间点的路程等于之前的路程加上当前的速度乘以单位时间v = v0 + at; 每个时间点的速度等于之前的速度加上当前的加速度乘以单位时间在程序里,把运动分解成x和y两个方向的运动。第二步:抽象。找出程序里要用到的对象,把他们的共性找出来。移动对象(IMovable):场景中可以移动的物体。在AS3中,程序通过改变显示元件的坐标实现物体的移动,所以必须把DisplayObject的x和y属性写进接口。 属性有: x:横坐标 y:纵坐标 vx:x方向上的速度 vy:y方向上的速度 ax:x方向上的加速度 ay:y方向上的加速度 width: 物体宽度 height:物体高度运动规则(IMovement):例如重力场 常量有: G:重力加速度 属性有: target: 规则应用的对象 range:移动边界 行为有: register:规则应用到物体上 unregister:从物体上撤销运动规则 第三步:定义接口。(这就是面向对象和面向过程的区别所在)接口IMovable,作为一个可以移动物体的接口。代码如下:/ ./src/com/flash63/movement/IMovable.aspackage com.flash63.movement public interface IMovable / x方向上的位移 function get x():Number; function set x(value:Number):void; / y方向上的位移 function get y():Number; function set y(value:Number):void; / x方向上的速度 function get vx():Number; function set vx(value:Number):void; / y方向上的速度 function get vy():Number; function set vy(value:Number):void; / x方向上的加速度 function get ax():Number; function set ax(value:Number):void; / y方向上的加速度 function get ay():Number; function set ay(value:Number):void; / 物体的宽度 function get width():Number; function set width(value:Number):void; / 物体的高度 function get height():Number; function set height(value:Number):void; 接口IMovement,作为一个运动规则的接口。代码如下:/ ./src/com/flash63/movement/IMovement.aspackage com.flash63.movement public interface IMovement / 可移动的物体 function get target():IMovable; / 运动边界 function get range():Rectangle; function set range(value:Rectangle):void; / 把运动规则应用到物体上 function register(target:IMovable, range:Rectangle = null):void; / 停止运动规则的作用 function unregister():void; 第四步:实现接口,定义基类。基类Movable,作为一个可移动物体的基类。继承自Sprite,可以添加到显示列表中。代码如下:/ ./src/com/flash63/movement/Movable.aspackage com.flash63.movement public class Movable extends Sprite implements IMovable private var _vx:Number = 0; public function get vx():Number return this._vx; public function set vx(value:Number):void this._vx = value; private var _vy:Number = 0; public function get vy():Number return this._vy; public function set vy(value:Number):void this._vy = value; private var _ax:Number = 0; public function get ax():Number return this._ax; public function set ax(value:Number):void this._ax = value; private var _ay:Number = 0; public function get ay():Number return this._ay; public function set ay(value:Number):void this._ay = value; 基类Movement,作为所有运动规则的基类。拥有一个updateMovement(evt:Event):void函数作为帧加载侦听器。代码如下:/ ./src/com/flash63/movement/Movement.aspackage com.flash63.movement public class Movement extends Object implements IMovement / 触发器,使用帧加载事件驱动运动规则的计算 private static const _TRIGGER:Sprite = new Sprite(); private var _target:IMovable = null; public function get target():IMovable return this._target; private var _range:Rectangle = null; public function get range():Rectangle return this._range; public function set range(value:Rectangle):void this._range = value; public function Movement() super(); public function register(target:IMovable, range:Rectangle = null):void if(!target) return; this._target = target; this._range = range; _TRIGGER.addEventListener(Event.ENTER_FRAME, updateMovement); public function unregister():void _TRIGGER.removeEventListener(Event.ENTER_FRAME, updateMovement); protected function updateMovement(evt:Event):void 第五步:实现重力场规则。重力类Gravity。代码如下:/ ./src/com/flash63/movement/Gravity.aspackage com.flash63.movement public class Gravity extends Movement /重力加速度 public static cosnt G:Number = 2; /弹力损失 public static const BOUNCE:Number = -0.8; public function Gravity() super(); override protected function updateMovement(evt:Event):void if(!target) return; / 如果没有设置边界或者还没到达下边界 / 把y方向上的速度加上重力加速度,得到此时的速度 if(!range | target.y this.range.bottom - target.height / 2) target.vy += Gravity.G; / 把此时的速度叠加到路程y中 target.y += target.vy; / 如果没有设置边界就不做边界判断 if(!range) return; / 判断是否到达上边界 if(target.x = this.range.right - target.width / 2) target.x = this.range.right - target.width / 2; target.vx *= BOUNCE; if(target.y = this.range.bottom - target.height / 2) target.y = this.range.bottom - target.radius; target.vy *= BOUNCE; 第六步:实现绑定类和文档类设置源代码路径:将src文件夹设置为源代码路径。如图所示绑定类:在Flash中新建元件,以注册点为圆心画圆,并在元件属性面板导出为com.flash63.stuff.Ball; 基类设置为com.flash63.movement.Movable; 如图所示:文档类:在Flash中设置文档类,代码如下:/ ./Main.aspackage import flash.display.Sprite; import flash.events.MouseEvent; import flash.geom.Rectangle; import com.flash63.stuff.Ball; import com.flash63.movement.Gravity; public class Main extends Sprite private var ball:Ball = new Ball(); private var gravity:Gravity = new Gravity(); public function Main() super(); ball.x = ball.y = 100; addChild(ball); gravity.register(ball, new Rectangle(0, 0, stage.stageWidth, stage.stageHeight); ball.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); / 鼠标按下时,停止重力作用,鼠标可以拖曳小球 private function onMouseDown(evt:MouseEvent):void stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); gravity.unregister

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论