代码改变世界

as3 切割图片

2008-11-21 23:00  宝宝合凤凰  阅读(823)  评论(0)    收藏  举报
as3 切割图片
来源:闪吧 作者:风的彼岸 2008年08月15日 17:38 网友评论:0条 点击: 460
如下图:








代码如下:
/*
库中图片,类:Jpg

如没有容器(cutImage第7参数为null)并设置可以拖拽,监听器为stage全局监听,屏幕上所有sprite类型对象都可拖拽,
如写为非文档类,须传入stage

function cutImage (

photoName :BitmapData , ....................位图数据
numX      :uint = 0 ,    ...................横切刀数
numY      :uint = 0 ,    ...................纵切刀数
apary     :Number = 0 , ....................切割后图片间距
type      :String = "sprite" , .............切割后产生图像的类型,只支持产生 bitmap 、shape 、sprite 图像
isDrag    :Boolean = false ,   .............拖拽
container :DisplayObjectContainer = null....容器

)

*/

var _stage = stage;
//如没有容器(cutImage第7参数为null)并设置可以拖拽,监听器为stage,如写为非文档类,须传入stage

init ();

function init ()
{
var jpg :Jpg = new Jpg( 0 , 0 );

var bmd :BitmapData = new Bitmap( jpg ) .bitmapData;

cutImage ( bmd , 3 , 3 , 1 , "sprite" , true , null );
//只有最后产生图像为sprite类型才可以用监听拖拽
}


function cutImage ( photoName :BitmapData , numX:uint = 0 , numY:uint = 0 , apart :Number = 0 , type :String = "sprite" , isDrag :Boolean = false , container :DisplayObjectContainer = null )
{
//位图数据,横切刀数,纵切刀数,切割后图片间距,切割后产生图像的类型,容器
if ( type != "shape" && type != "sprite" && type != "bitmap" )
{
   trace ("错误,只支持产生 bitmap 、shape 、sprite 图像。");
   return;
}
if ( type != "sprite" && isDrag )
{
   trace ("错误,如果需要拖拽,请将 type(5)参数写为“sprite”。");
   return;
}
if (container != null )
{
   addChild (container);
}
var _width :Number = photoName .width / ( numX + 1 );
var _height :Number = photoName .height / ( numY + 1 );
//平均切割图片,计算图片高宽

if ( _width < 5 || _height < 5 )
{
   trace (_width ,_height ,"切图过碎,请勿小于 5 * 5 像素面积,会导致“无法获取资源”");
   return;
}
var arrXY :Array = new Array();//每张被切割图片坐标数组
var counter :uint = 0;//计数器

for (var j : uint = 0; j < ( numX + 1 ); j++)
{
   for (var k : uint = 0; k < ( numY + 1 ); k++)
   {
    arrXY[counter] = [ j * _width , k * _height ] ;
    counter++;
   }
}
var array :Array =new Array();//存储切割后每张图片数据的数组

for (var i : uint = 0; i < ( numX + 1 ) * ( numY + 1 ); i++)
{
   //按参数5设定类型切割图片
   var bitmapData :BitmapData = new BitmapData( _width , _height );
   var matrix :Matrix = new Matrix( 1 , 0 , 0 , 1 , -arrXY[i][0] , -arrXY[i][1] );
   var photoType :*;

   bitmapData.draw ( photoName ,matrix );
   if ( type == "bitmap" )
   {
    photoType = new Bitmap( bitmapData );
   }
   if ( type == "sprite" )
   {
    photoType = new Sprite();
    photoType.graphics.beginBitmapFill ( bitmapData );
    photoType.graphics.drawRect ( 0 , 0 , _width , _height);
   }
   if ( type == "shape" )
   {
    photoType = new Shape();
    photoType.graphics.beginBitmapFill ( bitmapData );
    photoType.graphics.drawRect ( 0 , 0 , _width , _height );
   }
   array.push (photoType);
}
counter = 0;

for (var m : uint = 0; m < numX + 1; m++)
{
   for (var n : uint = 0; n < numY + 1; n++)
   {
    //显示图片
    if (container != null )
    {
     container.addChild (array[counter]);
    }
    else
    {
     addChild (array[counter]);
    }
    array[counter].x = m * (_width + apart);
    array[counter].y = n * (_height + apart);

    counter++;
   }
}
if (isDrag)
{
   //拖拽
   (container != null ) ? listenerDrag ( container ) : listenerDrag ();
}
}
function listenerDrag ( container :DisplayObjectContainer = null )
{
//拖拽监听
var containerObject:DisplayObjectContainer;
containerObject = ( container == null ) ? _stage : container;

containerObject.addEventListener ( MouseEvent.MOUSE_DOWN , startDragItem );
containerObject.addEventListener ( MouseEvent.MOUSE_UP , stopDragItem );

function startDragItem (e:Event)
{
   trace (e.target);
   if (String(describeType(e.target).@name) == "flash.display::Sprite")
   {
    var mc :Sprite = e.target as Sprite;

    //设置深度最高为目前被拖拽对象
    if ( container != null )
    {
     containerObject.setChildIndex ( mc , containerObject.numChildren -1 );
    }
    else
    {
     setChildIndex ( mc , numChildren - 1 );
     //stage只是全局监听器,切割后的图片并没有用stage做容器,没有前缀
    }
    e.target.startDrag ();
   }
}
function stopDragItem (e:Event)
{
   //停止拖拽
   if (String(describeType(e.target).@name) == "flash.display::Sprite")
   {
    e.target.stopDrag ();
   }
}
}