2009 年 12月 のアーカイブ

Adobe AIR Galleryに載りました。

2009 年 12月 18 日 金曜日 kosuke

FlowerWallPaper、Adobe AIR Galleryに登録しました。
登録から2週間、載せてもらえないのかと思ったよ。よかった。

記念、ショット。

AMFのこと

2009 年 12月 9 日 水曜日 kosuke

airアプリを作った際、その初期設定を保存するようにしました。
その保存フォーマットはオブジェクトをJSONでエンコードしてテキスト形式を使っていたのだけど、良くみてみるとActionScriptではAMFってフォーマットがある。
これを使えばActionScriptで生成したオブジェクトを丸ごと保存するってことが出来そうだ。

とりあえず、見つけた資料はこのあたり。
AS2.0までに対応する規格AMF0とAS3.0以降に対応する規格AMF3がある。
AMF 0 規格仕様
AMF 3 規格仕様

ググった感じサーバーとのやり取りに使うケースが主目的っぽいのと、なぜMovieClipは渡せないの?(上の規格資料だとAMF0規格時からサポート外となってるっぽい)とかまだ不明なところがあるのだが、今回のような目的ならJSONで保存するより便利そうと気づいた点が2点あります。

まず、JSONでうまくエンコードできなかったSpriteなどのオブジェクトもそのまま保存出来た。

以下のようなSpriteを含むオブジェクトをJSONでエンコードした場合(エンジンはas3corelibで試してます。)エラーになったけど、AMFではそのまま保存出来る。
次にAMFにある型のオブジェクトは、そのままの型で受け取れる。

var file:File;
var stream:FileStream		= new FileStream();
	stream.objectEncoding	= ObjectEncoding.AMF3;
var read:Object
var sp:Sprite	= new Sprite();
	sp.x		= 10;
 
//保存するオブジェクト
var write:Object	= {
	arr:[ "a", "b", "c" ],
	date:new Date(),
	xml:<root>root</root>,
	sprite:sp,
	byte:new ByteArray()
}
 
 
//AMF------------------------------------------
file	= File.desktopDirectory;
file	= file.resolvePath( "AMF.dat" );
 
stream.open( file, FileMode.UPDATE );
stream.writeObject( write );
 
stream.position	= 0;
read = stream.readObject();
 
trace( "AMF:", read.arr, read.arr is Array ); 
trace( "AMF:", read.date, read.date is Date );
trace( "AMF:", read.xml, read.xml is XML );
trace( "AMF:", read.sprite.x, read.sprite is Sprite ); 
trace( "AMF:", read.byte, read.byte is ByteArray );
 
file.clone();

traceの結果は、
AMF: a,b,c true
AMF: Tue Dec 8 18:52:43 GMT+0900 2009 true
AMF: root true
AMF: 10 false
AMF: true

JSONで試すと以下の結果でした。

//JSON------------------------------------------
file	= File.desktopDirectory;
file	= file.resolvePath( "JSON.txt" );
 
stream	= new FileStream();
stream.open( file, FileMode.UPDATE );
 
var json:String	= JSON.encode( write );
stream.writeUTF( json );
 
stream.position = 0;
read = stream.readUTF();
read	= JSON.decode( json );
 
trace( "JSON:", read.arr, read.arr is Array ); 
trace( "JSON:", read.date, read.date is Date );
trace( "JSON:", read.xml, read.xml is XML );
trace( "JSON:", read.byte, read.byte is ByteArray );
 
file.clone();

traceの結果は、
JSON: a,b,c true
JSON: [object Object] false
JSON: [object Object] false
JSON: [object Object] false

ひとまず、型が記録されるAMFの方が読み込み後のチェックなど便利そうに思える。
もう一点、AMFはバイナリデータである為、保存したファイルをテキストエディタで開いてもなんのことかわからない。

JSONもなんのことかわからないといえば、わからない訳だけどフォーマットを手書きで記述することが出来ないこともないと思う。
この辺も用途によるかなぁと思った。

FlowerWallPaper

2009 年 12月 8 日 火曜日 kosuke

FlowerRockをAir化してオリジナルAirアプリを作りました。
携帯用の壁紙を作れます。

詳しくはこちらをご覧ください。

BreakとReturn

2009 年 12月 7 日 月曜日 kosuke

Progression 4 にある中断コマンド、BreakとReturnについて、その違いをメモ。

シーン /index/a/1 から シーン /index に移動する時、
シーン /index/a/1 のGotoで Breakの場合とReturnの場合で試します。

protected override function atSceneGoto():void{
	this.addCommand(
		new Break(),  // ←これを使う場合と
		new Return(), // ←これを使う場合の違い
		new Trace( "a/1 - atSceneGoto" )
	)
}

Breakを使った場合
new Trace( “a/1 – atSceneGoto” ) は実行されないが、その後はシーン遷移に基づき シーン /index まで実行される。
つまりBreakの場合、処理中のコマンドリストはBreak実行された時点で完了となり、その後のコマンドリストは引き続き処理される。

試しに、Gotoを以下にした場合、

protected override function atSceneGoto():void{
	this.addCommand(
		new SerialList( {
				onComplete:function():void{
					trace("onComplete");
				}
			}, 
			new Break(),
			new Trace( "SerialList" )
		),
		new Trace( "a/1 - atSceneGoto" )
	)
}

new Trace( “SerialList” )は処理されないけど、
trace(“onComplete”)
new Trace( “a/1 – atSceneGoto” )
は実行される。

Returnを使った場合
new Trace( “a/1 – atSceneGoto” ) は実行されず、Returnが実行された時点でシーン遷移が停止する。

Breakの時と同様以下を試すと

protected override function atSceneGoto():void{
	this.addCommand(
		new SerialList( {
				onInterrupt:function():void{
					trace("onInterrupt");
				}
			}, 
			new Return(),
			new Trace( "SerialList" )
		),
		new Trace( "a/1 - atSceneGoto" )
	)
}

new Trace( “SerialList” )
new Trace( “a/1 – atSceneGoto” )
とも処理されず、
trace(“onInterrupt”)は実行される。つまり中断になるわけです。
ちなみに、Progressionクラスの stop() メソッドもReturnと同じっぽい。
試しに以下を実行した場合も結果は同じだった。

protected override function atSceneGoto():void{
	this.addCommand(
		new SerialList( {
				interruptType:CommandInterruptType.SKIP,
				onInterrupt:function():void{
					trace("onInterrupt");
				}			}, 
			function():void{
				manager.stop();
			},
			new Trace( "SerialList" )
		),
		new Trace( "a/1 - atSceneGoto" )
	)
}