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; } } }