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

  先提供下人物行走图片素材:
     AS3.0中人物行走代码剖析。
  根据以上图片实现人物行走的具体实现方法是:通过改变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,  true 0 );
28              _bmd.draw(png);
29              _arr = fillArr(_bmd,  4 4 , _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,这个类不仅能将图片切割,而且能实现图片的马赛克效果等。

你可能感兴趣的:(as3)