bitMap以及bitMapData的使用技巧,在flash里想要做动画做得炫,你就必须得熟知这两个玩意儿的用法,
而我们今天就来探讨其中的一种技巧:切图。
copyPixels(), 它的作用是把一个bitmapData整体中的一部分像素复制出来给另一个bitmapData,
这是一张256 * 256像素的图片,长度么应该是256 / 4 宽度也是 256 / 4
[Embed(source="melee.png")]
private var resource:Class;
private var displayBMP:Bitmap;
private var displayBMPD:BitmapData;
private var sourceBMPD:BitmapData;
private var i:int = 0;
public function Main()
{
sourceBMPD = (new resource() as Bitmap).bitmapData; //先拿到目标图像数据
displayBMP = new Bitmap(); //这是我们用来盛放切下来的图像数据并显示的东东哦
addChild( displayBMP );
displayBMPD = new BitmapData(64,64); //切图开始
displayBMPD.copyPixels( sourceBMPD, new Rectangle( 0, 0, 64, 64 ), new Point( 0, 0 ) );
displayBMP.bitmapData = displayBMPD; //切下来的BitmapData必须放到已添加至舞台的bitmap中才能显示出来哦
}
private var resource:Class;
private var displayBMP:Bitmap;
private var displayBMPD:BitmapData;
private var sourceBMPD:BitmapData;
private var i:int = 0;
public function Main()
{
sourceBMPD = (new resource() as Bitmap).bitmapData; //先拿到目标图像数据
displayBMP = new Bitmap(); //这是我们用来盛放切下来的图像数据并显示的东东哦
addChild( displayBMP );
displayBMPD = new BitmapData(64,64); //切图开始
displayBMPD.copyPixels( sourceBMPD, new Rectangle( 0, 0, 64, 64 ), new Point( 0, 0 ) );
displayBMP.bitmapData = displayBMPD; //切下来的BitmapData必须放到已添加至舞台的bitmap中才能显示出来哦
}
我们现在想做一个动画咋办?这图片一行的四张图片看起来可以组成一个连贯的攻击动作,
那我们就试试看把这四个图片组成一个动画吧。
做动画之前我们先想想具体的思路是怎样的,
我们知道,一个位图bitmap的外观改变无非就是其内部的bitmapData发生了改变而已,
那我们就隔一阵子改变一下它的BitmapData好了,
不过使用enterFrame来改变的话动画会播放太快了,因为一般的swf帧频都有30多,
就是一秒播放30多帧,此时我们就需要推出一个新的计时器类:Timer。
[Embed(source="melee.png")]
private var resource:Class;
private var displayBMP:Bitmap;
private var displayBMPD:BitmapData;
private var sourceBMPD:BitmapData;
private var i:int = 0;
public function Main()
{
sourceBMPD = (new resource() as Bitmap).bitmapData;
displayBMP = new Bitmap();
addChild( displayBMP );
var timer:Timer = new Timer(100); //限定计时器每100毫秒触发一次
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start(); //启动计时器
}
private function timerHandler( event:TimerEvent ):void{
displayBMPD = new BitmapData(64,64);
displayBMPD.copyPixels( sourceBMPD, new Rectangle( i * 64, 0, 64, 64 ), new Point( 0, 0 ) );//因为我们要切割的4张图片都在一行上,所以只需要改变切图的x位置即可
displayBMP.bitmapData = displayBMPD;
if(i==3)i=0; //若是当前所切图已到行尾最后一张图片,那就从行首第一张图片从新开始切过
else i++;
}
private var resource:Class;
private var displayBMP:Bitmap;
private var displayBMPD:BitmapData;
private var sourceBMPD:BitmapData;
private var i:int = 0;
public function Main()
{
sourceBMPD = (new resource() as Bitmap).bitmapData;
displayBMP = new Bitmap();
addChild( displayBMP );
var timer:Timer = new Timer(100); //限定计时器每100毫秒触发一次
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start(); //启动计时器
}
private function timerHandler( event:TimerEvent ):void{
displayBMPD = new BitmapData(64,64);
displayBMPD.copyPixels( sourceBMPD, new Rectangle( i * 64, 0, 64, 64 ), new Point( 0, 0 ) );//因为我们要切割的4张图片都在一行上,所以只需要改变切图的x位置即可
displayBMP.bitmapData = displayBMPD;
if(i==3)i=0; //若是当前所切图已到行尾最后一张图片,那就从行首第一张图片从新开始切过
else i++;
}