• as3 人物走动(图片序列)


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

    需要有人物走动的序列图

     

    通过改变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,这个类不仅能将图片切割,而且能实现图片的马赛克效果等。
  • 相关阅读:
    [题解]POJ_1417_(并查集背包
    [题解]POJ_2912_(带权并查集
    [题解]luogu_P1502_窗口的星星(扫描线
    [题解/模板]POJ_1733_Pairty game(带权并查集/扩展域
    [题解/模板]悬线法luogu_P1169_棋盘制作(悬线法
    [题解]luogu_P2059_卡牌游戏(状态设计/概率dp
    [题解]luogu_P2467_地精部落(思维dp
    「CJOJ2439」军队
    「LG2397」yyy loves Maths VI (mode)
    「LG2114」起床困难综合症
  • 原文地址:https://www.cnblogs.com/naiking/p/2294611.html
Copyright © 2020-2023  润新知