顯示具有 Works and Tests 標籤的文章。 顯示所有文章
顯示具有 Works and Tests 標籤的文章。 顯示所有文章

2008-06-06

以動態文字作為遮罩

mmug上討論的問題
在此我用之前的 Substitute 類別來解決

Frame Actions:
// 底
var bmd:BitmapData = new BitmapData(200, 200, true, 0xFFCCCCCC);
var seed:int = int(Math.random() * int.MAX_VALUE);
var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE;
bmd.perlinNoise(100, 80, 12, seed, false, true, channels, false, null);
var bm:Bitmap = new Bitmap(bmd);
this.addChild(bm);

// 動態文字
var _txt:TextField = new TextField;
_txt.autoSize = "left";
var myTextFormat:TextFormat = new TextFormat(null, 30, 0, true);
_txt.text = "動態文字";
_txt.x = 50;
_txt.setTextFormat(myTextFormat);
this.addChild(_txt);

// 建立替身
import lin.shinder.display.Substitute;
var s:Substitute = new Substitute(_txt).displace();
s.rotation = 30;

// 設定遮罩
bm.cacheAsBitmap = true;
s.cacheAsBitmap = true;
bm.mask = s;

原始檔下載

2008-06-05

取得 Domain Name (AS3 版)

/**
* author: shinder lin
* email: shinder.lin@gmail.com
*/
package lin.shinder.net
{
import flash.display.DisplayObject;
public class HttpDomain
{
static public var defaultDomain:String = "http://localhost";
static public function getDomain(displayObj:DisplayObject)
{
var url_str:String = displayObj['stage'].loaderInfo.loaderURL;
if (url_str.indexOf("http://") == 0 || url_str.indexOf("https://") == 0) {
var s_index:int = url_str.indexOf("/", 10);
return url_str.substring(0, s_index);
} else {
return defaultDomain;
}
}
}
}

由 URL 取得 Domain Name (AS2 版)

2008-05-20

建立 DisplayObject 物件 的 Bitmap 替身

包含動態文字的視覺物件常會因為旋轉而消失
在此弄個類別用以建立替身, 由於是點陣資料, 故縮放的時候會比較醜
測試的 Frame Actions :
import lin.shinder.display.Substitute;

var _txt:TextField = new TextField;
_txt.text = "ABCDEF";
this.addChild(_txt);

var s:Substitute = new Substitute(_txt).displace();
s.rotation = 30;

var s_mc:Substitute = new Substitute(t_mc);
s_mc.x = 200;
s_mc.y = 200;
this.addChild(s_mc);

類別檔 Substitute.as :
package lin.shinder.display
{
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.PixelSnapping;
// 替身
dynamic public class Substitute extends Sprite
{
private var bitmap:Bitmap;
public var bitmapData:BitmapData;
public var original:DisplayObject;

public function Substitute(disp:DisplayObject)
{
original = disp;
bitmapData = new BitmapData(disp.width, disp.height, true, 0);
var rect:Rectangle = disp.getBounds(disp);
var matrix:Matrix = new Matrix;
matrix.translate(-rect.x, -rect.y);
bitmapData.draw(disp, matrix);
bitmap = new Bitmap(bitmapData, PixelSnapping.AUTO, true);
bitmap.x = rect.x;
bitmap.y = rect.y;
this.addChild(bitmap);
this.visible = original.visible;
this.x = original.x;
this.y = original.y;
this.scaleX = original.scaleX;
this.scaleY = original.scaleY;
this.rotation = original.rotation;
}

public function displace():Substitute
{
if(! original.parent) {
trace('The original DisplayObject is not in display chains !');
return null;
}
var _parent:DisplayObjectContainer = original.parent as DisplayObjectContainer;
var depth:int = _parent.getChildIndex(original);
_parent.addChildAt(this, depth);

_parent.removeChild(original);
return this;
}
}
}

測試範例原始檔

2008-04-17

Popup Modal MovieClip for Flash/AS3

Flex 有 PopUpManager 可以 pop-up window 或 custom component
Flash CS3/AS3 則沒有 :(
若只是用個 PopUpManager, 以 Flex 發佈後實在有點肥大...

我在網路上找了老半天, 只找到 Yahoo ASTRA Flash Components 裡提供的 AlertManager. 不過功能實在太陽春, 想說做點客制化, 改著改著幾乎跟重寫差不多了. 版權 follow BSD.

Demo:


ModalDisplayManager.as
/*
Copyright (c) 2008 Yahoo! Inc. All rights reserved.
The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license

shinder modified
refer com.yahoo.astra.fl.managers.AlertManager

shinder.lin@gmail.com
http://qops.blogspot.com/
*/

package lin.shinder.fl.managers
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Graphics;
import flash.display.Stage;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.BitmapFilterQuality;
import flash.filters.BlurFilter;
import flash.filters.BitmapFilter;

public class ModalDisplayManager extends MovieClip
{
private static var _alertQueue:Array = [];
private static var _alert:MovieClip;
private static var _displayManager:ModalDisplayManager;
private static var _stage:Stage;
public static var overlayAlpha:Number = .16;
public static var modalBackgroundBlur:int = 3;
private static var _overlay:MovieClip;
protected var container:DisplayObject;
protected var parentFilters:Array;

public function ModalDisplayManager(container:DisplayObject)
{
if (! _displayManager) {
if (container != null) {
_stage = container.stage;
} else {
trace("ModalDisplayManager: the 1st parameter cannot be null !");
}
if ( _stage.scaleMode != StageScaleMode.NO_SCALE ) {
// trace("ModalDisplayManager prefers: stage.scaleMode = StageScaleMode.NO_SCALE !");
}
if ( _stage.align != StageAlign.TOP_LEFT ) {
trace("ModalDisplayManager prefers: stage.align = StageAlign.TOP_LEFT !");
}
_stage.addChild(this);
_stage.addEventListener(Event.RESIZE, stageResizeHandler);
_stage.addEventListener(Event.FULLSCREEN, stageResizeHandler);
}
}

public static function createModalDisplay(container:DisplayObject,
content:Class = null,
promp:Object = null):ModalDisplayManager
{
if (! _displayManager) {
_displayManager = new ModalDisplayManager(container);
}
_overlay = new MovieClip();
var g:Graphics = _overlay.graphics as Graphics;
g.beginFill(0xeeeeee, overlayAlpha);
g.moveTo(0,0);
g.lineTo(100, 0);
g.lineTo(100, 100);
g.lineTo(0, 100);
g.lineTo(0, 0);
g.endFill();
_displayManager.addChild(_overlay);

_overlay.stageResizeHandler = function() {
this.width = _stage.stageWidth;
this.height = _stage.stageHeight;
if (this._alert != null ) {
this._alert.x = (_stage.stageWidth-this._alert.width)/2;
this._alert.y = (_stage.stageHeight-this._alert.height)/2;
}
};

_alert = new content() as MovieClip;
_overlay._alert = _alert;
_overlay.stageResizeHandler();
if (_alert.init) {
_alert.init(promp);
} else {
// trace("ModalDisplayManager: the 2nd parameter should define a function named init(promp:Object) !");
}
_displayManager.addChild(_alert);
_displayManager.container = container;
var newFilters:Array = _displayManager.container.filters.concat();
var oldFilters:Array = _displayManager.container.filters.concat();

if(_alertQueue.length == 0) {
newFilters.push(_displayManager.getBlurFilter());
_displayManager.container.filters = newFilters;
}
for(var i:int=0; i < _alertQueue.length; i++) {
_alertQueue[i]['_alert'].filters = [_displayManager.getBlurFilter()];
}

var alertParams:Object = {
container:container,
content:content,
promp:promp,
_overlay:_overlay,
_alert:_alert,
_filters:oldFilters
};
_alertQueue.push(alertParams);
return _displayManager;
}

public function manageQueue():void
{
if(_alertQueue.length == 0){
return;
}
var obj:Object = _alertQueue.pop();
obj.container.filters = obj._filters;
_displayManager.removeChild(obj._alert);
_displayManager.removeChild(obj._overlay);
if(_alertQueue.length>0) {
_alertQueue[_alertQueue.length-1]['_alert'].filters = [];
}
}

public function getBlurFilter():BitmapFilter
{
var blurFilter:BlurFilter = new BlurFilter();
blurFilter.blurX = modalBackgroundBlur;
blurFilter.blurY = modalBackgroundBlur;
blurFilter.quality = BitmapFilterQuality.HIGH;
return blurFilter;
}

private function stageResizeHandler(evt:Event):void
{
for each(var o:Object in _alertQueue) {
o._overlay.stageResizeHandler();
}
}
}
}

Frame Actions:
import lin.shinder.fl.managers.ModalDisplayManager;
stage.align = StageAlign.TOP_LEFT;
b_btn.addEventListener(MouseEvent.CLICK, onClick);
y_btn.addEventListener(MouseEvent.CLICK, onClick);
function onClick(evt:MouseEvent):void
{
if (evt.currentTarget==b_btn) {
ModalDisplayManager.createModalDisplay(this, mc_gear);
} else {
ModalDisplayManager.createModalDisplay(this, mc_gear2, {a:"abc"});
ModalDisplayManager.createModalDisplay(this, mc_gear3);
}
}
測試範例原始檔

2007-12-03

將 JPG 檔案資料加入 SWF, 並讓 SWF 載入自己

Appending binary data of a JPG file to a swf file.
我們可以將 SWF 檔後接一個圖檔資料 (別的格式當然也行),然後再利用 SWF 讀取自己, 把圖秀出來。這樣做的優點是, 可以動態組合不同內容的 SWF, 而且包成一個檔, 攜帶方便。
找了 JPG 、 PNG 圖檔格式和 SWF 檔案格式, 如下:

Jpeg 檔案格式:
JPEG Header Information
JPG File Header Format

PNG 檔案格式:
怎樣才是好的 File Format Header
Designing File Formats

SWF 檔案格式:
Alexis' SWF Reference
SWF File Format Specification (內容有點舊)
Adobe 官方資料

然而由於無法直接從 SWF 檔頭得知壓縮後的 SWF 大小, 所以放棄使用原有檔案格式的標記,改用自己增加設定。以下是合併檔案的 PHP 語法:
<?php
$fw = fopen("merged.swf", "wb");
$fn0 = "read_self.swf";
$fn1 = "hippocampus.jpg";
$fr0 = fopen($fn0, "rb");
$fr1 = fopen($fn1, "rb");
$content0 = fread($fr0, filesize($fn0));
$content1 = fread($fr1, filesize($fn1));

fwrite($fw, $content0);
fwrite($fw, '-----'); // add a specific mark
fwrite($fw, $content1);

fclose($fr0);
fclose($fr1);
fclose($fw);
?>

載入自己的那個 FLA frame actions:
var MyUrl:String = new LoaderInfo().url;
var lastSlash:int = MyUrl.lastIndexOf("/");
var selfName:String = MyUrl.slice(lastSlash+1);

var urlr:URLRequest = new URLRequest(selfName);
var urll:URLLoader = new URLLoader;
urll.dataFormat = URLLoaderDataFormat.BINARY;
urll.load(urlr);
urll.addEventListener(Event.COMPLETE, loadFinished);

function loadFinished(e:Event):void {
var ba:ByteArray = urll.data;
while (true) {
if (ba.readByte() == 45) {
if (ba.readByte() == 45) {
if (ba.readByte() == 45) {
if (ba.readByte() == 45) {
if (ba.readByte() == 45) {
break;
}
}
}
}
}
}

var ldr:Loader = new Loader;
var img_ba:ByteArray = new ByteArray;
ba.readBytes(img_ba);
this.addChild(ldr);
ldr.loadBytes(img_ba);
}

相關檔案下載

2007-11-29

「Flash CS3 ActionScript 3.0 應用程式設計」圖片對照

收到「Flash CS3 ActionScript 3.0 應用程式設計」版權書了, 不過發現裡面的圖都比較深色, 問企編得到的答案是「油墨加重, 而且紙張是象牙白, 所以視覺上會變得更黑」。

其實有部份的圖應該印成彩色才適當, 不過因為售價及成本的關係, 又是偏程式書, 所以印成黑白書 (嘖! 定價520, 天瓏才賣406, 不知道有沒有算錯)。

為了讀者方便, 用昨天介紹的 BulkLoader 和書中的範例, 兜一個小相本用以查看書中的範例圖 (不包含圖說)。由於使用國外便宜的空間所以速度較慢, 敬請見諒。

「Flash CS3 ActionScript 3.0 應用程式設計」圖片對照

2007-11-13

「Flash CS3 ActionScript 3.0 應用程式設計」已經出版


前一陣子花了許多時間在編寫此書, blog 就很少更新了 :p

原則上這本書是「ActionScript 2.0 入門與應用」的改版, 不過後半部幾乎是重新寫過, 把一些比較少用的部份拿掉, 加入常用的基本範例。

當然一本書無法滿足所有讀者的需求, 讀者群定位在有點 ActionScript 編寫經驗, 想跨入 ActionScript 3.0 的讀者。對 Developers 是本入門書, 對 Designers 來說可能歸類進階書, 最好翻翻實體書, 再考慮購買吧。

2007,11,29 ---------------
圖片對照發文 圖片對照小相本

2007-09-12

Flash/AS3 z-index 處理 part 2

承上一篇
3)欲以物件的某個參考值當作 Depth
將 Display Object 和 Depth (參考值) 做成 Object
所有 Object 做成 Object Array, 就可以用 sortOn 幫你排
FLA 原始檔
var numObj:int = 12;
var dang:Number = Math.PI*2/numObj;
var xr:int = 200;
var yr:int = 20;
var shift:Number = 0;
var arObj:Array = [];
for (var i:int = 0; i < numObj; i++) {
arObj[i] = new mc_star;
this.addChild( arObj[i] );
}
this.addEventListener(Event.ENTER_FRAME, mEnterFrame);
function mEnterFrame(e:Event):void {
var _mc:MovieClip;
var ang:Number;
var depth:int;
var depthsRela:Array = [];
for (var i:int = 0; i < numObj; i++) {
ang = i*dang +shift;
_mc = arObj[i] as MovieClip;
_mc.x = xr*Math.cos(ang);
_mc.y = yr*Math.sin(ang);
_mc.scaleX = 0.8 + 0.2*Math.sin(ang);
_mc.scaleY = _mc.scaleX;
var blurN:Number = 4*(1- Math.sin(ang) );
_mc.filters = [new BlurFilter(blurN, blurN, BitmapFilterQuality.HIGH)];
// z-index 的參考值
depth = Math.sin(ang)*1000;
depthsRela.push({d:depth, mc:_mc});

}
// 排序
depthsRela.sortOn("d", Array.NUMERIC);
for (i=0; i < numObj; i++) {
this.setChildIndex(depthsRela[i].mc, i);
}
shift += 0.01;
}

2007-09-11

Flash/AS3 z-index 處理 part 1

z-index 的處理經常遇到的有三種情況, 先提兩種:

1) 將 display object 由原來的 z-index 提到最高值
可以先 removeChild, 再使用 addChild

2) display object 在某些時候要提到最高值, 某些時候要回到原來的 z-index
做個空的 Sprite 物件去佔原來位置, 之後再對調回來
FLA 原始檔
this.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
this.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
function onMouseOver(e:MouseEvent):void{
var _mc:MovieClip = e.target as MovieClip;
var _p:DisplayObjectContainer =
_mc.parent as DisplayObjectContainer;
// 建立佔茅坑者
_mc.occu = new Sprite;
_p.addChild(_mc.occu);
// 交換位置
_p.swapChildren(_mc, _mc.occu);
}
function onMouseOut(e:MouseEvent):void{
var _mc:MovieClip = e.target as MovieClip;
var _p:DisplayObjectContainer =
_mc.parent as DisplayObjectContainer;
// 換回原來的位置
_p.swapChildren(_mc, _mc.occu);
delete _mc.occu;
}

2007-08-16

實現 ActionScript 3 的全域物件 global

把 global.as 放在類別路徑上即可, 其內容為:
package {
public function get global():Object{
return this;
}
}

2007-06-28

取得 FLV 內的 header 資料

依據 osFlash 裡 FLV 檔案資料格式的說明, 利用 Flash 開發「取得 FLV 檔頭資料及串流資料」的 AIR app。
要注意的是 meta 裡包含兩個 AMF packets, 所以需使用 ByteArray.readObject() 兩次。
Flash frame AS3:
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;

var file:File;
var fs:FileStream;
var flvFilter:FileFilter = new FileFilter("Flash Video", "*.flv");
var header_ba:ByteArray;
var stream_ba:ByteArray;

function bClick(e:MouseEvent):void {
var targetName:String = e.target.name;
switch (targetName) {
case "open_btn" :
file = new File();
file.browseForOpen("Open", [flvFilter]);
file.addEventListener(Event.SELECT, readFLVHeader);
break;
case "show_btn" :
readStreamHeader();
break;
case "close_btn" :
fs.close();
break;
}
}
open_btn.addEventListener(MouseEvent.CLICK, bClick);
show_btn.addEventListener(MouseEvent.CLICK, bClick);
close_btn.addEventListener(MouseEvent.CLICK, bClick);


function readFLVHeader(e:Event) {
filename_txt.text = file.nativePath;
fs = new FileStream();
fs.open(file, FileMode.READ);

// read FLV Header
header_ba = new ByteArray();
fs.readBytes(header_ba, 0, 9);
main_txt.text = "Signature: "+ header_ba.readMultiByte(3, "") +"\n";
main_txt.appendText("Version: "+ header_ba.readUnsignedByte()+"\n");
main_txt.appendText("Flags: "+ header_ba.readUnsignedByte()+"\n");
main_txt.appendText("Offset: "+ header_ba.readUnsignedInt()+"\n");
main_txt.appendText("---\n");
}
function readStreamHeader() {
stream_ba = new ByteArray();
fs.readBytes(stream_ba, 0, 15);

main_txt.appendText("PreviousTagSize: "+ stream_ba.readInt()+" ----\n");
var type:uint = stream_ba.readUnsignedByte();
main_txt.appendText("Type: "+ type +"\n");
// 取 3 bytes
var bodyLength:uint = stream_ba.readUnsignedShort()<<8 | stream_ba.readUnsignedByte();
main_txt.appendText("BodyLength: "+ bodyLength +"\n");
var timestamp:uint = stream_ba.readUnsignedShort()<<8 | stream_ba.readUnsignedByte();
main_txt.appendText("Timestamp: "+ timestamp +"\n");
main_txt.appendText("Padding: "+ stream_ba.readUnsignedInt()+"\n");
if (type == 0x12) {
var t_ba:ByteArray = new ByteArray();
fs.readBytes(t_ba, 0, bodyLength);
// 設定 AMF 的格式, 即使是 on2 VP6 應該還是舊的
t_ba.objectEncoding = ObjectEncoding.AMF0;
// 第一個 AMF 物件是事件處理器的資料
var obj:Object = t_ba.readObject();
var str:String = QopDump.go( obj );
main_txt.appendText("***\nEvent handler:"+str+"\n***\n");
obj = t_ba.readObject();
str = QopDump.go( obj );
main_txt.appendText(str+"\n");
} else {
// skip the body
fs.position += bodyLength;
}
main_txt.verticalScrollPosition = main_txt.maxVerticalScrollPosition;
}

FLV 的第一個 stream unit 應該都是 meta。較舊 FLV 的 meta 大多有問題, 沒有提供仔細而實用的資料。

較新格式的 FLV 其 Flags 通常是 13 而不是 5。


原始檔: parseFLV.fla
安裝檔: parseFLV.air

2007-06-27

利用 NativeDragEvent, 以拖拉放的方式開啟檔案

參考網頁: Simple Drag and Drop AIR
依據上一篇: Adobe AIR Simple Text Editor 再加上拖曳開檔的功能
Flash frame actions:
import flash.events.NativeDragEvent;
import flash.desktop.DragManager;
import flash.desktop.DragActions;
import flash.desktop.TransferableFormats;
import flash.desktop.TransferableData;

this.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,onDragIn);
this.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,onDrop);
this.addEventListener(NativeDragEvent.NATIVE_DRAG_EXIT,onDragExit);

function onDragIn(event:NativeDragEvent):void {
// acceptDragDrop() 只能在 nativeDragEnter 或 nativeDragOver 事件處理器上使用
DragManager.acceptDragDrop(this);
}

function onDrop(event:NativeDragEvent):void {

// 下行若沒設定, 順序會是 copy, move, link
DragManager.dropAction = DragActions.COPY;
var tfd:TransferableData = event.transferable as TransferableData;
var dropfiles:Array = tfd.dataForFormat(TransferableFormats.FILE_LIST_FORMAT) as Array;
// 只取一個檔案
var sourceFile:File = dropfiles[0];
file = new File();
file.nativePath = sourceFile.nativePath;
filename_txt.text = file.nativePath;

fs = new FileStream();
fs.open(file, FileMode.READ);
var str:String = fs.readMultiByte(fs.bytesAvailable, "utf-8");
main_txt.text = str.replace( new RegExp(File.lineEnding, "g"), "\n");
fs.close();
}
function onDragExit(event:NativeDragEvent):void {
trace("Drag exit event.");
}

原始檔: test_dragAndDrop.fla

2007-06-26

Adobe AIR Simple Text Editor


這個例子主要是用來測試 File.browseForOpen 的功能
缺點還很多, 包含只能讀寫 utf-8 編碼的檔案

Flash frame actions:
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;

var file:File;
var fs:FileStream;
var textFilter:FileFilter = new FileFilter("Text", "*.txt");
file = new File("app-resource:/temp.txt");
filename_txt.text = file.nativePath;

function bClick(e:MouseEvent):void {
var targetName:String = e.target.name;
switch (targetName) {
case "new_btn" :
file = new File("app-resource:/temp.txt");
filename_txt.text = file.nativePath;
main_txt.text = "";
break;
case "load_btn" :
file = new File();
file.browseForOpen("Open", [textFilter]);
file.addEventListener(Event.SELECT, onSelectOpenFile);
break;
case "save_btn" :
fs = new FileStream();
fs.open(file, FileMode.WRITE);
fs.writeMultiByte(main_txt.text, "utf-8");
fs.close();
break;
case "saveas_btn" :
file = new File();
file.browseForSave("Save as");
file.addEventListener(Event.SELECT, onSelectWriteFile);
break;
}
}
new_btn.addEventListener(MouseEvent.CLICK, bClick);
load_btn.addEventListener(MouseEvent.CLICK, bClick);
save_btn.addEventListener(MouseEvent.CLICK, bClick);
saveas_btn.addEventListener(MouseEvent.CLICK, bClick);

function onSelectOpenFile(e:Event) {
filename_txt.text = file.nativePath;
fs = new FileStream();
fs.open(file, FileMode.READ);
var str:String = fs.readMultiByte(fs.bytesAvailable, "utf-8");
// 替換 換行符號
main_txt.text = str.replace( new RegExp(File.lineEnding, "g"), "\n");
fs.close();
file.removeEventListener(Event.SELECT, onSelectOpenFile);
}
function onSelectWriteFile(e:Event) {
filename_txt.text = file.nativePath;
fs = new FileStream();
fs.open(file, FileMode.WRITE);
fs.writeMultiByte(main_txt.text, "utf-8");
fs.close();
file.removeEventListener(Event.SELECT, onSelectWriteFile);
}


原始檔: test_browseForOpen.fla

2007-06-13

由 URL 取得 Domain Name (AS2 版)

在測試和發佈 Flash Remoting 專案時還滿有用的
原始檔 MyDomain.as
/**
* author: shinder lin
* email: shinder.lin@gmail.com
*/
class MyDomain {
static var defaultDomain = "http://localhost";
static function getDomain() {
var url_str = _root._url;
if (url_str.indexOf("http://") == 0) {
var s_index = url_str.indexOf("/", 10);
return url_str.substring(0, s_index);
} else {
return defaultDomain;
}
}
}

SDDump - Dump 的 AS2 版

原始檔 SDDump.as
/**
* author: shinder lin
* email: shinder.lin@gmail.com
*/
class SDDump {
static var n:Number = 0;
static var str:String = '';
static function echo(a) {
trace(go(a));
}
static function go(a) {
str = '';
dumpIt(a);
str = str.slice(0, str.length-1);
return str;
}
static function dumpIt(a) {
if (a instanceof Array) {
dumpArray(a);
} else if (a instanceof Object) {
dumpObject(a);
} else {
appendStr(a);
}
}
static function dumpArray(ar:Array):Void {
n++;
for (var o in ar) {
if (ar[o] instanceof Object) {
appendStr("["+o+"]:");
dumpIt(ar[o]);
} else {
appendStr("["+o+"]:"+ar[o]);
}
}
n--;
}
static function dumpObject(obj:Object):Void {
n++;
for (var o in obj) {
if (obj[o] instanceof Object) {
appendStr(o+":");
dumpIt(obj[o]);
} else {
appendStr(o+":"+obj[o]);
}
}
n--;
}
static function appendStr(s):Void {
str += getSpaces()+s+'\n';
}
static function getSpaces():String {
var s:String = '';
for (var i = 1; i < n; i++) {
s += " ";
}
return s;
}
}

2007-06-09

QopDump - Dump 的 AS3 版

改寫以前 AS2 的 Dump
使用方式
var a:Object = ["sd","tg","rt",{a:"1", b:"23", c:"11"}];
// 取得字串資料用 QopDump.go(a)
// 直接 trace
QopDump.echo(a);

執行結果:
[0]:sd
[1]:tg
[2]:rt
[3]:
c:11
a:1
b:23

原始檔 QopDump.as
/**
* author: shinder lin
* email: shinder.lin@gmail.com
*/
package {
import flash.utils.describeType;
public class QopDump {
static var n:int = 0;
static var str:String;
// trace
public static function echo(o:Object):void {
trace( go(o) );
}
// return the result string
public static function go(o:Object):String {
str = "";
dump(o);
// remove the lastest \n
str = str.slice(0, str.length-1);
return str;
}
static function dump(o:Object) {
var type:String = describeType(o).@name;
if(type == 'Array') {
dumpArray(o);
} else if (type == 'Object') {
dumpObject(o);
} else {
appendStr(o);
}
}
static function appendStr(s:Object) {
str += s + '\n';
}
static function dumpArray(a:Object):void {
n++;
var type:String;
for (var i:String in a) {
type = describeType(a[i]).@name;
if (type == 'Array' || type == 'Object') {
appendStr(getSpaces() + "[" + i + "]:");
dump(a[i]);
} else {
appendStr(getSpaces() + "[" + i + "]:" + a[i]);
}
}
n--;
}
static function dumpObject(o:Object):void {
n++;
var type:String;
for (var i:String in o) {
type = describeType(o[i]).@name;
if (type == 'Array' || type == 'Object') {
appendStr(getSpaces() + i + ":");
dump(o[i]);
} else {
appendStr(getSpaces() + i + ":" + o[i]);
}
}
n--;
}
static function getSpaces():String {
var s:String ="";
for(var i:int = 1; i < n; i++){
s += " ";
}
return s;
}
}
}

FB 留言