在flash开发的时候,我们常常希望能够把trace信息显示在舞台上,以便于调试。特别是做网络游戏或网络应用时,经常有这样的需求。
如下是我用as3写的MyTrace类。为了尽量保持轻量级,文本显示我用的是TextField。为了便于使用,可视内容都是用代码搞定的。
功能:
- 添加trace信息,参数跟使用trace一样;
- 清除所以信息;
- 行号;
- 总是保持在最上层;
- 文本内容总是滚动到最下面;
- 重设文本框大小;
打算添加的功能:
- 鼠标拖动调整文本框大小;
- 保存trace信息为文本文件;
MyTrace类
package
{
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.display.Shape;
import flash.events.MouseEvent;
//import fl.controls.TextArea;
//import mx.controls.TextArea;
/**
* ...
* @author ycy 09,19,2008
*/
public class MyTrace extends Sprite
{
private var num:uint;
private var child:Sprite = new Sprite();
private var size:Number = 10;
private var bgColor:uint = 0xFFCC00;
private var borderColor:uint = 0x666666;
private var borderSize:uint = 0;
private var traceTxt:TextField = new TextField();
public function MyTrace(w:Number = 100,h:Number=200 ) {
traceTxt.width = w;
traceTxt.height = h;
traceTxt.y = size;
traceTxt.border = true;
traceTxt.background = true;
drawCircle();
addChild(traceTxt);
}
public function add(...args):void {
num++;
var str:String = num+":";
for (var i = 0; i < args.length; i++) {
str += args[i];
}
str += "\n";
traceTxt.appendText(str);
scrollText();
getToTop();
}
public function clear():void {
traceTxt.text = "";
}
public function reSize(w:Number, h:Number):void {
traceTxt.width = w;
traceTxt.height = h;
}
private function getToTop():void {
var o:DisplayObjectContainer = this.root as DisplayObjectContainer;
if (o.numChildren - 1 > o.getChildIndex(this)) {
o.setChildIndex(this, o.numChildren - 1);
}
}
private function drawCircle():void {
var halfSize:uint = Math.round(size / 2);
child.graphics.beginFill(bgColor);
child.graphics.lineStyle(borderSize, borderColor);
child.graphics.drawCircle(halfSize, halfSize, halfSize);
child.graphics.endFill();
addChild(child);
child.addEventListener(MouseEvent.CLICK, clickHandle);
child.buttonMode = true;
child.useHandCursor = true;
}
private function clickHandle(e:Event):void {
add("click");
traceTxt.visible = !(traceTxt.visible);
}
private function scrollText():void {
traceTxt.scrollV = traceTxt.maxScrollV;
}
}
}
使用方法:
var myTrace:MyTrace=new MyTrace();
addChild(myTrace);
for(var i=0;i<20;i++){
myTrace.add(" just ","a test");
}