DPLib中的Move类及MoveData类的使用说明。
一,概述
Move类是用来设置一个显示对象的显示形状和图形的渐变。目前有下面几个方面可以设置:
- 直线运动(x,y)
- 透明度(alpha)
- 缩放比例(scaleX,scaleY)
- 显示大小(width,height)
- 旋转角度(rotation)
Move类通过Timer类的延时,来做到以上属性的渐变。
二,原理
Move的工作有两个部分,一个是Move类,一个是各种MoveData类。
Move类创建了一个Timer计数器和一个数据列表A,A中保存了所有需要用到的MoveData类。当A中有数据可以执行的时候,Move的Timer计数器开始运行,根据MoveData的内容对指定的显示对象进行设置。如果A中的所有数据都执行完成,Move暂停Timer计数器。
上面罗列的每一个设置方式有一个相应的MoveData类。分别如下:
- 直线运动——LineMoveData
- 透明度——AlphaMoveData
- 缩放比例——ScaleMoveData
- 显示大小——SizeMoveData
- 旋转角度——RotationMoveData
每个MoveData只能和一个显示对象绑定,并且在MoveData对象构造的时候,设置显示对象。
每个MoveData对象被建立以后,通过执行account方法,设置显示对象的渐变显示过程,并计算每一步的显示状态,并保存在一个数组中。例如,如果将一个显示对象的x坐标,从0改变到100,步长为5px,在执行account方法后,将有一个数组被建立起来,保存每一步的x值,即这个数据从索引0到索引20,依次递加5。Move类在Timer计数器中执行这个MoveData时,将在每一次执行的时候相应的改变显示对象的x坐标到指定的数值。
Move类使用单例实现,即在一个运行周期中,Move类的实例只有一个,且不能直接被实例化。Move的实例通过Move.instance获取。这样,在整个Move运行中,无论有多少个MoveData需要运行,只有一个Timer在计时。Timer的每一次计时,将会使所有被添加的MoveData被执行。
三、举例
下面以将对一个显示对象,通过Move类做以下的操作:
- 从坐标(0, 0)减速移动(100, 300)然后加速返回到(0, 0),反复5次;
- 透明度从0到1;
- 大小从(10, 10)到(100, 100);
- 当1完成以后,将显示对象放大到(200, 200)并逐渐淡出。
下面是实现的代码和部分注释:
[code lang="actionscript"]
package {
import dp.events.MoveEvent;
import dp.move.Move;
import dp.move.data.AlphaMoveData;
import dp.move.data.LineMoveData;
import dp.move.data.SizeMoveData;
import flash.display.Sprite;
import flash.geom.Point;
[SWF(backgroundColor="#FCFFFB")]
public class Tester extends Sprite
{
public function Tester()
{
stage.scaleMode = "noScale";
stage.align = "TL";
// 先画个方块
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0xFF9900, 1);
sp.graphics.drawRect(0, 0, 1, 1);
sp.graphics.endFill();
this.addChild(sp);
// 设置直线的运动
var md1:LineMoveData = new LineMoveData(sp); // 设置对象是sp
md1.account(new Point(0, 0), new Point(100, 300), 5, "down"); // 从坐标(0, 0)到(100, 300) 速度每步5px 减速运动
md1.addEventListener(MoveEvent.STOP_MOVE, onMoveEnd); // 给MoveData添加事件 完成移动后执行下一步
// 设置alpha的改变
var md2:AlphaMoveData = new AlphaMoveData(sp);
md2.account(0, 1); // 从0到1
// 设置size的改变
var md3:SizeMoveData = new SizeMoveData(sp);
md3.account(10, 100, 10, 100, 1); // width从10到100 height从10到100, 每步改变1px
// 将三个应用同时加入Move的队列中 开始运行
Move.instance.startMove("", md1, 10, true); // 反复5次来回 总共是10次运动
Move.instance.startMove("", md2);
Move.instance.startMove("", md3);
}
private function onMoveEnd(e:MoveEvent):void
{ // 当第一次的来回运动完成 将对象淡出
var sp:Sprite = e.moveObject as Sprite; // 获取显示对象
// 设置alpha的改变 从1到0
var md1:AlphaMoveData = new AlphaMoveData(sp);
md1.account(1, 0);
// 设置szie的改变 和第一次的方法一样
var md2:SizeMoveData = new SizeMoveData(sp);
md2.account(100, 200, 100, 200);
//
Move.instance.startMove("", md1);
Move.instance.startMove("", md2);
}
}
}
[/code]
想在as3里面用..试了用不了..
flex3里面OK