AS3.0中人物行走代码剖析。

先提供下人物行走图片素材:       根据以上图片实现人物行走的具体实现方法是:通过改变Bitmap实例的bitmapData属性,来动态的改变Bitmap实

  先提供下人物行走图片素材:
     
  根据以上图片实现人物行走的具体实现方法是:通过改变Bitmap实例的bitmapData属性,来动态的改变Bitmap实例在舞台上的显示。
然后设置enterFrame 或 Timer事件,使Bitmap实例的bitmapData属性不断的改变,就可以实现人物行走的效果。

  具体代码如下:

人物行走代码
 1 package
 2 {
 3     import flash.display.Bitmap;
 4     import flash.display.BitmapData;
 5     import flash.display.DisplayObject;
 6     import flash.display.Sprite;
 7     import flash.events.MouseEvent;
 8     import flash.events.TimerEvent;
 9     import flash.geom.Matrix;
10     import flash.utils.Timer;
11     [SWF(width=32,height=48)]
12 
13     public class main extends Sprite
14     {
15         [Embed(source="img/B3.PNG")]
16         private var MovePng:Class;
17         private var _bmp:Bitmap;
18         private var _bmd:BitmapData;
19         private var _arr:Array;
20         private var timer:Timer;
21         private var i:uint=0;
22         private var j:uint=0;
23 
24         public function main()
25         {
26             var png:DisplayObject=new MovePng();
27             _bmd=new BitmapData(png.width, png.height, true0);
28             _bmd.draw(png);
29             _arr=fillArr(_bmd, 44, _arr);
30             _bmp=new Bitmap();
31             addChild(_bmp);
32             _bmp.bitmapData=_arr[0][0];
33             timer=new Timer(150);
34             timer.addEventListener(TimerEvent.TIMER, onTimer);
35             stage.addEventListener(MouseEvent.MOUSE_DOWN, move);
36         }
37 
38         private function onTimer(e:TimerEvent):void
39         {
40             _arr[i].push(_arr[i].shift());
41             _bmp.bitmapData=_arr[i][0];
42         }
43         
44         private function move(e:MouseEvent):void
45         {
46             timer.stop();
47             j=j==0?1:0;
48             if(j==1){
49                 i=++> 3 ? 0 : i;
50                 timer.start();
51             }
52         }
53 
54         private function fillArr(bmd:BitmapData, wNum:uint, hNum:uint, arr:Array):Array
55         {
56             arr=[];
57             var mx:Matrix=new Matrix();
58             var sw:Number=bmd.width / wNum;
59             var sh:Number=bmd.height / hNum;
60             var _bmd:BitmapData=new BitmapData(sw, sh);
61             for (var i:uint=0; i < hNum; i++)
62             {
63                 arr[i]=[];
64                 for (var j:uint=0; j < wNum; j++)
65                 {
66                     _bmd=_bmd.clone();
67                     mx.tx=-1 * sw * j;
68                     mx.ty=-1 * sh * i;
69                     _bmd.draw(bmd, mx);
70                     arr[i][j]=_bmd;
71                 }
72             }
73             return arr;
74         }
75     }
76 }
77 

 

演示效果见

  实现要点:通过Matrix将人物行走图片的各个动作分离出来,放进数组里(此时数组里的每个元素都是BitmapData的一个实例),然后遍历数组的各个项。
关键点1:Bitmap的bitmapData属性改变后,Bitmap的显示即发生改变。
关键点2:BitmapData实现draw方法后,BitmapData即发生变化,代码中66行_bmd=_bmd.clone();是将一个新的实例赋值给了_bmd,相当于又建立了个BitmapData的实例。这样一来通过draw方法就不会改变原来的_bmd的内容了。如果没有这一行,那么数组里的每个元素将都是一模一样的值即都是最后一个_bmd,将不会实现行走效果。
关键点3:Matrix,这个类不仅能将图片切割,而且能实现图片的马赛克效果等。