您的位置:首页 > 其它

收藏两个位图切割实现动画效果的例子(一个是用位图切割的方式,另一个是用scrollRect)

2010-08-05 11:48 627 查看
位图切割方式:

package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.events.IOErrorEvent;
import flash.system.System;
import flash.geom.Rectangle;
import flash.geom.Point;
public class QBitmapData
{

private var bufferContainer:DisplayObjectContainer;
private var imagePath:String;
private var bitmapArray:Array;
private var _loader:Loader;
private var size:Number;
private var rowNum:uint;
private var listNum:uint;
private var count:uint;
public var callBack:Function;
public function QBitmapData(imagePath:String, size:Number=16,_bufferContainer:DisplayObjectContainer = null):void {

bufferContainer = _bufferContainer;
this.ImagePath = imagePath;
this.size = size;
}
public function set ImagePath(_path:String):void {

var urlRequest:URLRequest = new URLRequest(_path);
this._loader = new Loader();
//this._loader.contentLoaderInfo.addEventListener(Event.OPEN, openHandler);
//this._loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
this._loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
//this._loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
this._loader.load(urlRequest);
}

private function completeHandler(event:Event):void {
 
             var target:DisplayObject = _loader.content as DisplayObject;
 
var xpos:Number = -this.size;
var ypos:Number = 0;
var bmd:BitmapData = new BitmapData(target.width, target.height, true, 0);
bmd.draw(target);
this._loader.unload();
this._loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);

this.rowNum = Math.floor(bmd.width / this.size);
this.listNum = Math.floor(bmd.height / this.size);
this.count = this.rowNum * this.listNum;
//创建长度数组;
bitmapArray = new Array(count);
//
var rec:Rectangle = new Rectangle(0, 0, this.size, this.size);
var p:Point = new Point(0, 0);
for (var i:Number = 0; i < count; i++) {
var localBMD:BitmapData = new BitmapData(this.size, this.size);
if (xpos == (bmd.width - this.size)) { //换行读下一张,像是一个二维数组
ypos += this.size;
xpos = -this.size;
}
xpos += this.size;
rec.x = xpos;
rec.y = ypos;
localBMD.copyPixels(bmd, rec, p);
this.bitmapArray[i] = localBMD;
}

bmd.dispose();//释放bmd资源

this.callBack(this.bitmapArray,this.Index(0));
}

public function Index(index:Number):BitmapData {
if (this.bitmapArray.length<=index) {
throw new Error("超过索引");
}
return this.bitmapArray[index];
}

public function get BitmapArray():Array {
return this.bitmapArray;
}

public function get RowNum():uint {
return this.rowNum;
}
public function get ListNum():uint {
return this.listNum;
}
public function get Count():uint {
return this.count;
}
public function toString() {
return "lbynet bitamp array";
}

}

}


scrollRect方式:

package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.events.IOErrorEvent;
import flash.system.System;
import flash.geom.Rectangle;
import flash.geom.Point;
/**
* ...
* @lbynet
*/
public class QScrollRect
{

private var bufferContainer:DisplayObjectContainer;
private var imagePath:String;
private var rectArray:Array;
private var _loader:Loader;
private var size:Number;
private var rowNum:uint;
private var listNum:uint;
private var count:uint;
         public var callBack:Function;
public function QScrollRect(imagePath:String, size:Number=16,_bufferContainer:DisplayObjectContainer = null):void {

bufferContainer = _bufferContainer;
this.ImagePath = imagePath;
this.size = size;
}
public function set ImagePath(_path:String):void {

var urlRequest:URLRequest = new URLRequest(_path);
this._loader = new Loader();
this._loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
this._loader.load(urlRequest);
}

private function completeHandler(event:Event):void {

var target:DisplayObject = _loader.content as DisplayObject;

var xpos:Number = -this.size;
var ypos:Number = 0;
var bmd:BitmapData = new BitmapData(target.width, target.height, true, 0);
bmd.draw(target);
this._loader.unload();
this._loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);

this.rowNum = Math.floor(bmd.width / this.size);
this.listNum = Math.floor(bmd.height / this.size);
this.count = this.rowNum * this.listNum;
//创建长度数组;
this.rectArray = new Array(count);
var rec:Rectangle;
var p:Point = new Point(0, 0);
for (var i:Number = 0; i < count; i++) {
rec = new Rectangle(0, 0, this.size, this.size);
if (xpos == (bmd.width - this.size)) { //换行读下一张,像是一个二维数组
ypos += this.size;
xpos = -this.size;
}
xpos += this.size;
rec.x = xpos;
rec.y = ypos;
this.rectArray[i] = rec;
}

this.callBack(bmd,this.Index(0));
//bmd.dispose();//释放bmd资源

}

public function Index(index:Number):Rectangl
4000
e {

if (this.rectArray.length <= index) {
throw new Error("超过索引");
}
return this.rectArray[index];
}

public function get RectArray():Array {

return this.rectArray;
}
public function get RowNum():uint {
return this.rowNum;
}
public function get ListNum():uint {
return this.listNum;
}
public function get Count():uint {
return this.count;
}
public function toString() {
return "lbynet bitamp array";
}

}

}


下面是测试:

package
{

import flash.display.*;
import flash.events.*;
import flash.utils.Timer;
/**
* ...
* @lbynet
*/
public class Main extends Sprite
{
private var size:uint = 100;
private var timer:Timer;
private var bitmapArray:Array;
private var gameContent:Sprite;
private var qBitmapData:QBitmapData;
private var bitmapData:BitmapData;

private var direction:uint;//方向
private var index:uint;
private var rowNum:uint;
public function Main()
{
init();
}

private function init():void {

gameContent = new Sprite();
this.addChild(gameContent);
gameContent.x = stage.stageWidth / 2 - this.size/2;
gameContent.y = stage.stageHeight / 2 - this.size/2;
this.qBitmapData = new QBitmapData("sprite.png", this.size);
//this.qBitmapData = new QBitmapData("sprite.png", 100, gameContent);
this.qBitmapData.callBack = callBack;

}

private function addListener():void {

this.timer = new Timer(100);
this.timer.addEventListener(TimerEvent.TIMER, timerHandler);

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
}

private function timerHandler(event:TimerEvent):void {

if (this.gameContent.numChildren>1) {
this.gameContent.removeChildAt(0);
}

var btd:BitmapData = this.bitmapArray[this.direction*this.rowNum + this.index];
var bm:Bitmap = new Bitmap(btd);
gameContent.addChild(bm);

//角色动作控制
if (this.index < this.rowNum - 1) {
this.index ++;
} else {
this.index = 0;
}

trace(gameContent.width);
}

private function keyDownHandler(event:KeyboardEvent):void {
switch (event.keyCode) {
case 40 :
this.direction = 0;
break;
case 38 :
this.direction = 3;
break;
case 37 :
this.direction = 1;
break;
case 39 :
this.direction = 2;
break;
}
}

private function callBack(bitmapArray:Array, btd:BitmapData):void {
//trace("callBack function" + bitmapArray);
//trace("callBack function" + btd);

this.bitmapArray = bitmapArray;
this.rowNum = this.qBitmapData.RowNum;
this.addListener();

this.timer.start();

//var btd2:BitmapData=_bitmap.Index(10);
//var bm2:Bitmap=new Bitmap(btd2);
//gameContent.addChild(bm2);
}

}

}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐