先提供下人物行走图片素材:
根据以上图片实现人物行走的具体实现方法是:通过改变Bitmap实例的bitmapData属性,来动态的改变Bitmap实例在舞台上的显示。
然后设置enterFrame 或 Timer事件,使Bitmap实例的bitmapData属性不断的改变,就可以实现人物行走的效果。
具体代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 =++ 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
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 =++ 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,这个类不仅能将图片切割,而且能实现图片的马赛克效果等。