as3 人物走动(图片序列)

转:http://www.cnblogs.com/huomiao/archive/2009/12/26/1626293.html 

需要有人物走动的序列图

as3 人物走动(图片序列) 

通过改变Bitmap实例的bitmapData属性,来动态的改变Bitmap实例在舞台上的显示。

然后设置enterFrame 或 Timer事件,使Bitmap实例的bitmapData属性不断的改变,就可以实现人物行走的效果。 

 package

{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.geom.Matrix;
    import flash.utils.Timer;
    [SWF(width= 532,height= 548)]
    
     public  class Main extends Sprite
    {
        [Embed(source= " B4.PNG ")]
         private  var MovePng:Class;
         private  var _bmp:Bitmap;
         private  var _bmd:BitmapData;
         private  var _arr:Array;
         private  var timer:Timer;
         private  var i: uint= 0;
         private  var j: uint= 0;
        
         public function Main()
        {
             var png:DisplayObject= new MovePng();
             // 创建了位图数据bitemapdata
            _bmd= new BitmapData(png.width, png.height,  true0);
            
            trace(png.width+ "   "+png.height);
             // bitmapdata获取了位图的具体数据
            _bmd.draw(png);
            
            _arr=fillArr(_bmd,  44, _arr);
            _bmp= new Bitmap();
            addChild(_bmp);
            _bmp.bitmapData=_arr[ 0][ 0];
            timer= new Timer( 150);
            timer.addEventListener(TimerEvent.TIMER, onTimer);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, move);
        }
        
         private function onTimer(e:TimerEvent): void
        {
             // 把某个动作的连贯组合循环播放
            
// 把当前的画面帧置底
            _arr[i].push(_arr[i].shift());
             // 永远播放最上面的帧
            _bmp.bitmapData=_arr[i][ 0];
        }
        
         private function move(e:MouseEvent): void
        {
            timer.stop();
            j=j== 0? 1: 0;
             if(j== 1){
                i=++i >  3 ?  0 : i;
                timer.start();
            }
        }
        
         private function fillArr(bmd:BitmapData, wNum: uint, hNum: uint, arr:Array):Array
        {
            arr=[];
             var mx:Matrix= new Matrix();
             var sw:Number=bmd.width / wNum;
             var sh:Number=bmd.height / hNum;
            
             var _bmd:BitmapData= new BitmapData(sw, sh);
             // 格子的每个画面数据
             for ( var i: uint= 0; i < hNum; i++)
            {
                arr[i]=[];
                 for ( var j: uint= 0; j < wNum; j++)
                {    
                     // 相当于又建立了个BitmapData的实例
                    _bmd=_bmd.clone();
                    mx.tx=- 1 * sw * j;
                    mx.ty=- 1 * sh * i;
                     // 给每个画面加入位图数据
                    _bmd.draw(bmd, mx);
                    arr[i][j]=_bmd;
                }
            }
             return arr;
        }
    }
    
}

 实现要点:通过Matrix将人物行走图片的各个动作分离出来,放进数组里(此时数组里的每个元素都是BitmapData的一个实例),然后遍历数组的各个项。

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(as3)