package chuanqi2.utils
{
import com.junyougame.core.SharedBMD;
import com.minimvc.core.Singleton;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.utils.Dictionary;
/**
*
* @author gushuai
*
*/
public class ShapeNumber extends Sprite
{
public static const WIDTH_CHANGE:String = "WIDTH_CHANGE";
private var _definiton:String;
private var _dividedType:String;
private var _hgap:int;
private var _numberWidth:int;
private var _numberHeight:int;
private var _numString:String;
private var _libBitmapData:BitmapData;
private var _dividedNumDic:Dictionary;
private var _numStringChanged:Boolean = false;
private var _hgapChanged:Boolean = false;
public var centerFlag:Boolean = false;
private var _oldLen:int;
/**
* @param _definition 引用的库路径
* @param _dividedType 切割方式,值为美术给的美术字
* @param _hgap 后一个数字头与前一个数字尾之间的距离*/
public function ShapeNumber(_definition:String,_hgap:Number=0,_dividedType:String="1234567890")
{
super();
this._dividedType = _dividedType;
definition = _definition;
hgap = _hgap;
}
/**库定义*/
public function set definition(value:String):void
{
if(value != _definiton)
{
_definiton = value;
if(!SharedBMD.libBMD[value])
{
var cls:Class = Singleton.getClass(value);
var bmd:BitmapData = new cls();
SharedBMD.libBMD[value] = bmd;
}
_libBitmapData = SharedBMD.libBMD[value];
divided();
}
}
/**设置字符间距*/
public function set hgap(value:Number):void
{
if(_hgap != value)
{
_hgap = value;
_hgapChanged = true;
invalidateView();
}
}
/**切割*/
private function divided():void
{
var _piece:int = _dividedType.length;
_numberWidth = _libBitmapData.width/_piece;
_numberHeight = _libBitmapData.height;
_dividedNumDic = new Dictionary();
var rect:Rectangle;
for(var i:int = 0;i<_piece;i++)
{
if(!SharedBMD.libBMD[_definiton+_dividedType.charAt(i)])
{
rect = new Rectangle(i*_numberWidth,0,_numberWidth,_numberHeight);
var bmp:BitmapData = new BitmapData(_numberWidth,_numberHeight);
bmp.copyPixels(_libBitmapData,rect,new Point(0,0));
SharedBMD.libBMD[_definiton+_dividedType.charAt(i)] = bmp;
}
_dividedNumDic[_dividedType.charAt(i)] = SharedBMD.libBMD[_definiton+_dividedType.charAt(i)];
}
rect = null;
}
/**值**/
public function set numString(value:String):void
{
if(_numString != value)
{
_numString = value;
_numStringChanged = true;
invalidateView();
}
if(_oldLen != value.length)
{
dispatchEvent(new Event(WIDTH_CHANGE));
}
_oldLen = value.length;
}
private function invalidateView():void
{
addEventListener(Event.ENTER_FRAME,onRender);
}
private function onRender(e:Event):void
{
removeEventListener(Event.ENTER_FRAME,onRender);
if(_numStringChanged||_hgapChanged)
{
if(_numStringChanged)
{
_numStringChanged = false;
}
if(_hgapChanged)
{
_hgapChanged = false;
}
draw();
}
}
private function draw():void
{
if(_numString)
{
graphics.clear();
var len:int = _numString.length;
var i:int = 0;
for(i;i<len;i++)
{
graphics.beginBitmapFill(_dividedNumDic[_numString.charAt(i)],new Matrix(1,0,0,1,i*(_numberWidth+_hgap),0));
graphics.drawRect(i*(_numberWidth+_hgap),0,_numberWidth,_numberHeight);
}
graphics.endFill();
if(centerFlag)
{
if(parent)
{
this.x = parent.width - this.width >>1;
}
}
}
}
/**获取单个图片**/
public function getshape(type:String):Shape
{
if(_dividedNumDic[type])
{
var shape:Shape = new Shape();
shape.graphics.beginBitmapFill(_dividedNumDic[type]);
shape.graphics.drawRect(0,0,_numberWidth,_numberHeight);
shape.graphics.endFill();
return shape;
}
return null;
}
public function dispose():void
{
graphics.clear();
_dividedNumDic = null;
}
override public function get width():Number
{
return _numberWidth*_numString.length + (_numString.length - 1)*_hgap;
}
// /**
// *一个字的渲染长度
// * @return
// */
// public function get wordWidth():int
// {
// return _numberWidth + _hgap;
// }
override public function get height():Number
{
return _numberHeight;
}
}
}