2010-08-28 点击:次
游戏开发中..常常需要显示特殊的美术字体..
像经验数字~扣血扣蓝~倒计时等~
像一般的基于字体的美术字~只需要嵌入字体即可~
但像下面这类纯手工的美术字~

处理起来就没有这么方便..
常见的方案一般为截取相应位置的bitmap数据..
然后重新拼成需要的内容..再显示之~
效果如下(可在下方的输出框内输出数字试试):
第一行的数字是不忽略透明空白,第二行则是忽略透明空白,对比一下应该就能明白了。
下面是源码..代码很简单..我就不多说了..
- 01.package
- 02.{
- 03. import flash.display.Bitmap;
- 04. import flash.display.Sprite;
- 05. import flash.events.Event;
- 06. import flash.text.TextField;
- 07. import flash.text.TextFormat;
- 08.
- 09. import net.l4cd.display.BitmapText;
- 10.
- 11. [SWF(backgroundColor="#FFFFFF",width="550",height="200")]
- 12.
- 13. /**
- 14. * BitmapTextExample
- 15. * @author l4cd
- 16. * @website http://l4cd.net
- 17. */
- 18. public class BitmapTextExample extends Sprite
- 19. {
- 20. [Embed(source="number.png")]
- 21. private var BitmapTextClass:Class;
- 22.
- 23. private var bt1:BitmapText;
- 24. private var bt2:BitmapText;
- 25. public function BitmapTextExample()
- 26. {
- 27. //不忽略透明空白
- 28. bt1 = new BitmapText((new BitmapTextClass as Bitmap).bitmapData,50,50,0,false,"0123456789");
- 29. addChild(bt1);
- 30. bt1.x = 20;
- 31. bt1.y = 10;
- 32.
- 33. //忽略透明空白
- 34. bt2 = new BitmapText((new BitmapTextClass as Bitmap).bitmapData,50,50,0,true,"0123456789");
- 35. addChild(bt2);
- 36. bt2.x = 20;
- 37. bt2.y = 80;
- 38.
- 39. bt1.text = "152443004";
- 40. bt2.text = "152443004";
- 41.
- 42. graphics.beginFill(0xCCCCCC);
- 43. graphics.drawRect(0,150,550,50);
- 44.
- 45. var txt:TextField = new TextField();
- 46. txt.defaultTextFormat = new TextFormat("宋体",12);
- 47. txt.background = true;
- 48. txt.backgroundColor = 0xFFFFFF;
- 49. txt.multiline = false;
- 50. txt.border = true;
- 51. txt.borderColor = 0xCCCCCC;
- 52. txt.type = "input";
- 53. txt.width = 200;
- 54. txt.height = 16;
- 55. txt.x = 20;
- 56. txt.y = 165;
- 57. txt.restrict = "0-9";
- 58. txt.text = "152443004";
- 59. addChild(txt);
- 60. txt.addEventListener(Event.CHANGE,_txtChanged);
- 61. }
- 62.
- 63. private function _txtChanged(e:Event):void
- 64. {
- 65. bt1.text = bt2.text = e.target.text;
- 66. }
- 67. }
- 68.}
net.l4cd.display.BitmapText源码:
- 01.package net.l4cd.display
- 02.{
- 03. import flash.display.BitmapData;
- 04. import flash.display.Sprite;
- 05. import flash.geom.Matrix;
- 06. import flash.geom.Point;
- 07. import flash.geom.Rectangle;
- 08.
- 09. /**
- 10. * @author l4cd.net
- 11. * @website http://l4cd.net
- 12. */
- 13. public class BitmapText extends Sprite
- 14. {
- 15. private var _map:Array;
- 16. private var _chars:String = "0123456789+-.";
- 17. private var _bitmapData:BitmapData;
- 18. private var _height:Number;
- 19. private var _width:Number;
- 20. private var _blank:Boolean;
- 21.
- 22. /**
- 23. * @param bitmapData 位图的bitmapData对象
- 24. * @param width 单个字符的宽
- 25. * @param height 单个字符的高
- 26. * @param gap 输出的文字间隔
- 27. * @param blank 是否忽略空白
- 28. * @param chars 位图的字符集
- 29. *
- 30. */
- 31. public function BitmapText(bitmapData:BitmapData,width:Number,height:Number,gap:Number,blank:Boolean=false,chars:String=
- "0123456789+-.")
- 32. {
- 33. super();
- 34. _bitmapData = bitmapData.clone();
- 35. _width = width;
- 36. _height = height;
- 37. _blank = blank;
- 38. _map = [];
- 39. if(chars)_chars = chars;
- 40. for(var i:uint=0;i<_chars.length;i++)
- 41. {
- 42. var bit:BitmapData = new BitmapData(width,height,true,0);
- 43. bit.copyPixels(_bitmapData,new Rectangle(i*width,0,width,height),new Point(0,0));
- 44. var rect:Rectangle = bit.getColorBoundsRect(0xFF000000,0x00000000,false);
- 45. rectrect.x = rect.x + i*width;
- 46. _map[_chars.charAt(i)] = rect;
- 47. bit.dispose();
- 48. }
- 49. }
- 50. private var _text:String;
- 51. public function get text():String
- 52. {
- 53. return _text;
- 54. }
- 55. public function set text(value:String):void
- 56. {
- 57. _text = value;
- 58. _draw();
- 59. }
- 60.
- 61. private function _draw():void
- 62. {
- 63. graphics.clear();
- 64. var x:Number = 0;
- 65. for(var i:uint=0;i<text.length;i++)
- 66. {
- 67. var char:String = text.charAt(i);
- 68. var index:int = _chars.indexOf(char);
- 69. var rect:Rectangle = _map[char];
- 70. if(!_blank)x+=rect.x%_width;
- 71. graphics.beginBitmapFill(_bitmapData,new Matrix(1,0,0,1,x-rect.x,0),false);
- 72. graphics.drawRect(x,rect.y,rect.width,rect.height);
- 73. x+=rect.width;
- 74. if(!_blank)x = (i+1)*_width;
- 75. }
- 76. graphics.endFill();
- 77. }
- 78.
- 79. public function destroy():void
- 80. {
- 81. graphics.clear();
- 82. _map = [];
- 83. _bitmapData.dispose();
- 84. _bitmapData = null;
- 85. }
- 86. }
- 87.}