转: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, true, 0);
trace(png.width+" "+png.height);
//bitmapdata获取了位图的具体数据
_bmd.draw(png);
_arr=fillArr(_bmd, 4, 4, _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;
}
}
}
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, true, 0);
trace(png.width+" "+png.height);
//bitmapdata获取了位图的具体数据
_bmd.draw(png);
_arr=fillArr(_bmd, 4, 4, _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,这个类不仅能将图片切割,而且能实现图片的马赛克效果等。
关键点2:BitmapData实现draw方法后,BitmapData即发生变化,代码中66行_bmd=_bmd.clone();是将一个新的实例赋值给了_bmd,相当于又建立了个BitmapData的实例。这样一来通过draw方法就不会改变原来的_bmd的内容了。如果没有这一行,那么数组里的每个元素将都是一模一样的值即都是最后一个_bmd,将不会实现行走效果。
关键点3:Matrix,这个类不仅能将图片切割,而且能实现图片的马赛克效果等。