progression4 + Flash CS5 で XMLUtil を使う

SceneObject 等で読み込んだ XML データを扱いたい場合、

var obj:Object = XMLUtil.xmlToObject( XMLList(dataHolder.data) );

これで問題ないはずがエラーが出る。Progression フォーラムによると,

Flash CS5 では、標準ライブラリの中に XMLUtil クラスが増えているようです。
そのために、内部で使用している XMLUtil クラスが jp.nium.utils.XMLUtil を指すはずが、パッケージパスのない XMLUtil クラスを向いてしまい、コンパイルエラーとなってしまっているようです。

XMLUtil.xmlToObject() -> jp.nium.utils.XMLUtil.xmlToObject()

とのこと。以下のように記述すれば好い。

var obj:Object = jp.nium.utils.XMLUtil.xmlToObject( XMLList(dataHolder.data) );

ProgressionのContextMenuを表示させない

【Progression】右クリックで表示されるコンテキストメニューを非表示にする。

上記ページを参考に俺もやってみました。Index.asの_onInitに以下の記述を追加して、

//コンテキストメニューを非表示
Progression.uiContextMenu.enabled = false;
CastObjectContextMenu.enabled = false;
CastButtonContextMenu.enabled = false;

このままだとエラーが出たのでimport文を追加。

import jp.progression.core.ui.CastButtonContextMenu;
import jp.progression.core.ui.CastObjectContextMenu;

これで右クリックすると「Powered by Progression 3.1.62」「設定」「Adobe Flash Player 10 について」の表示になりました。フォーラムではimport文を書いてもダメだったとあったけど…何ででしょ。
「印刷する」だけとか個別に設定したい時は以下を参考に設定。

CastObjectContextMenu – Progression 3.1 – API Reference
CastButtonContextMenu – Progression 3.1 – API Reference

Error: Error #1023: スタックオーバーフローが発生しました。

OS10.5.6のFireFox3.0.1/Safari3.2.1で検証中、以下のエラーが出て処理が止まってしまった。

mac-error-090720

スタックオーバーフローとは何ぞ?と調べてみるとこれくさい。
StackOverflowError – ActionScript 3.0 言語およびコンポーネントリファレンス

ActionScript は、スクリプトで使用できるスタックを使い切った場合に StackOverflowError 例外をスローします。ActionScript はスタックを使用して、スクリプト内で行われた各メソッド呼び出しに関する情報 (例えば、メソッドが使用するローカル変数) を保管します。使用できるスタックスペースの量は、システムによって異なります。

StackOverflowError 例外は、無限反復が発生したことを示している可能性があります。その場合、関数に終了条件を追加する必要があります。また、再帰アルゴリズムには適切な終了条件があるものの、単にスタックを使い切ってしまったことを示している可能性もあります。この場合、代わりの方法として、アルゴリズムを反復的に表現するようにしてください。

スタックとはIT用語辞典によると、「最後に入力したデータが先に出力されるという特徴をもつ、データ構造の一種。」とのことなので、吐いたエラーはそんなに覚えらんねーよ、て事か。ローカル変数の使いすぎに注意、というのもどこかで見た。リファレンスの後半パラグラフは、最近やっと読み始めた「詳説 ActionScript 3.0」のP101にも書いてある内容。

今回エラーが出たコードはこんな感じのことをやっていました。

protected override function _onLoad():void {
var sList:SerialList = new SerialList();

(略)

for (var i:int = 0; i < 10; i++) { var sp:Sprite = new Sprite(); (略) sp.x = i *10; sList.addCommand( new AddChild(ore, sp) ); } // 実行したいコマンドを登録します。 addCommand( (略) sList ); } [/as3] 同じような処理を繰り返すことでスタックを使い切ってる?違う気もするが、同時に実行しても困らないものだったのでSerialListからParallelListに変更したところエラーは出なくなった。Progressionがどうこう言う前に(略)の箇所であれこれやってる部分が問題かも。要検証。

詳説 ActionScript 3.0
詳説 ActionScript 3.0

posted with amazlet at 09.09.19
Colin Moock
オライリージャパン
売り上げランキング: 17330

new DoTweenerでメモリリーク

Progressionで作業中、new DoTweenerのループを作ってSWFProfilerでチェックしていたらメモリがどんどん増えていってしまう。簡略化してるけど要はこんなことをしていました。tween1→tween2→tween1……とループします。

private function tween1():void {			
	new SerialList(null,
		new DoTweener(ore, {
			x:500,
			time:1
		}),
		new Func(tween2)
	).execute();			
}

private function tween2():void {			
	new SerialList(null,
		new DoTweener(ore, {
		x:0,
		time:1
		}),
		new Func(tween1)
	).execute();			
}

解決策は以下のページにありました。
Progressionで起きたメモリリーク

こちらで書いておられる通り、DoTweenerでの記述をTweenerに直してみたら改善されました。
Tweenerでの記述はこんなんになりました。

private function tween1():void {			
	Tweener.addTween(ore, {
	x:500,
	time:1
	onComplete:tween2		
	});	
}

private function tween2():void {			
	Tweener.addTween(ore, {
	x:0,
	time:1
	onComplete:tween1
	});
}

とりあえずこれでよしとする。
Progressionの次のメジャーアップではメモリ関連の対策に重点が置かれるらしいのでそちらに超期待。
そもそもTweenerのループってもっとンマいやり方あるかも。