2010年6月16日 星期三

Testing a sprite to use as the "command line" for Adobe Alchemy

Alchemy:Documentation:Developing with Alchemy:AS3 API 提到setSprite()
可以將Sprite模擬成Command Shell,本範例測試Alchemy是否能使用C語言常用
的輸出入函數將資料導到STDIN、STDOUT、 STDERR

以下程式改自Alchemy samples其中的stringecho範例
這是C程式
#include <stdlib.h>
#include <stdio.h>
#include "AS3.h"

static AS3_Val echo(void* self, AS3_Val args)
{

char* val = NULL;
AS3_ArrayValue( args, "StrType", &val );

if(val == NULL)
{
char* nullString = "null";
//return the string "null"
return AS3_String(nullString);
}

printf("*****Test printf() OK!!!*****\n");
fprintf(stderr, "*****%s Test fprintf(stderr,...) OK!!!*****\n",val);
fprintf(stdout, "*****%s Test fprintf(stdout,...) OK!!!*****\n",val);

return AS3_String(val);
}

int main()
{

AS3_Val echoMethod = AS3_Function( NULL, echo );


AS3_Val result = AS3_Object( "echo: AS3ValType", echoMethod );


AS3_Release( echoMethod );


AS3_LibInit( result );


return 0;
}




這是as3程式
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.Event;
import flash.events.MouseEvent;

import cmodule.stringecho.CLibInit;

public class EchoTest extends Sprite
{
protected var alchemyLib : Object;

public function EchoTest()
{
addEventListener( Event.ADDED_TO_STAGE, addedToStageHandler );

}

protected function addedToStageHandler( event : Event ) : void
{
removeEventListener( Event.ADDED_TO_STAGE, addedToStageHandler );
var loader:CLibInit = new CLibInit;
loader.setSprite(this);
alchemyLib= loader.init();
trace(alchemyLib.echo("foo0"));
alchemyLib.echo("foo1");
throw Error(alchemyLib.echo("foo2"));
}

}
}



執行的結果如下
*****foo1 Test fprintf(stderr,...) OK!!!*****
*****foo2 Test fprintf(stderr,...) OK!!!*****


經過用力的測測測........
目前只有fprintf(stderr,...)能成功輸出
Alchemy名字取的真好
可真是"煉金術"啊
讓我可以體會自古以來西方鍊金術士鍊金過程的辛苦
發思古之幽情........

這是swf檔
[Demo]

1 則留言:

  1. 想要输出fprintf(stdout,...)的话,
    需要加上
    fflush(stdout);

    回覆刪除