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
	);
}

同じような凊理を繰り返すこずでスタックを䜿い切っおる違う気もするが、同時に実行しおも困らないものだったので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のルヌプっおもっずンマいやり方あるかも。

1぀の配列から1぀ず぀ずれた2次元配列を䜜る

1぀の配列から芁玠を1぀ず぀ずらした倚次元配列の䜜り方。

var _array:Array = [1, 2, 3, 4];
var _allArray:Array = new Array();
var _length:int = _array.length;

for (var i:int = 0; i < _length; i++ ) {
	var a:Array = new Array();
	_allArray[i] = a;
	for (var j:int = 0; j < _length; j++ ) {
		a[j] = _array[j];
	};
	if (i != 0) {
		for (var k:int = 0; k < i; k++ ) {
			var n:Number = _allArray[i].pop();
			_allArray[i].unshift(n);
		}
	}
}

出力結果は以䞋のようになりたす芋難いので改行しおたす。

1,2,3,4,
4,1,2,3,
3,4,1,2,
2,3,4,1

配列を1぀ず぀2次元配列に远加しお、pop()で配列の末尟を削陀、unshift()で先頭に远加。1個目はそのたた、2個目だったら1回、3個目だったら2回削陀&远加を繰り返す。
出珟の順番を倉えたい時ずかに䜿えるず想ったんだけど、もっずいいやり方がありそう。そもそもこんなこずやる意味ないかも。

なるべく1日1wonderfl

wonderflデビュりしたしたよ。䞉角関数䜿いこなせおたせんが、凄腕のみなさんの䜜品で勉匷させおもらい぀぀、気持ちいいものをあげおいければず想いたす。

デヌタ型の倉換

String型の”4649″をint型の4649ずしお蚈算したい時など、デヌタ型を倉換したい堎合がありたす。
型倉換には、暗黙的に行われる堎合ず、明瀺的に行う必芁がある堎合がありたす。明瀺的に行う型倉換を「キャスト」ず呌びたす。

暗黙的な倉換

以䞋はuint型ずString型の連結の䟋。数倀の11が暗黙的に文字列に倉換され、文字列同士の連結が行われたす。

var num:uint = 11;
var str1:String = "キングカズ";
var str2:String;
str2 = str1 + num;
trace(str2); //キングカズ11

明瀺的な倉換

明瀺的な倉換には関数によるキャストず構文によるキャストがありたす。

関数によるキャスト
トップレベルに甚意されおいるキャスト甚の関数を䜿甚したす。

キャスト甚関数
関数 説明
Boolean() ブヌル倀に倉換
Number() Number型の数倀に倉換
int() int型の数倀に倉換
uint() uint型の数倀に倉換
String() 文字列に倉換

文字列をNumber型の数倀に倉換する䟋。

var str:String = "3.14";
var num:Number;

num = Number(str); //文字列を数倀に倉換
trace(num);	//3.14

小数点以䞋の数倀を含むNumber型の数倀をint型やuint型にキャストするず小数点井が切り捚おられたす。

var num1:Number = 3.14;
var num2:int;

num2 = int(num1); //Num型をint型にに倉換
trace(num2); //3

構文によるキャスト
専甚の関数が甚意されおいないデヌタ型に倉換する堎合でも、次のような構文を䜿甚するこずで関連するクラスにキャストできたす。

クラス(倀)

以䞋はMovieClipクラスのむンスタンス「mc」をSpriteクラスにキャストしたす。

var mc:MovieClip = new MovieClip();

var sp:Sprite;
sp = Sprite(mc); //MovieClipクラスをSpriteクラスに倉換

デヌタ型を調べたい

デヌタ型をチェックするにはtypeof,is,asなどを䜿いたす。

typeof挔算子

typeof挔算子はデヌタ型を衚す文字列を返したす。

typeof挔算子を䜿甚した結果
デヌタ型 結果
Array “object”
Boolean “boolean”
Function “function”
int “number”
Number “number”
Object “object”
String “string”
uint “number”
XML “xml”
XMLList “xml”
ナヌザヌ定矩クラスの
むンスタンス
“object”
var num:int = 14;
var Valentine:Date = new Date();
var str:String = new String("choco");
var flag:Boolean = true;
var girl = new MovieClip();

trace(typeof num); // number
trace(typeof Valentine); // object
trace(typeof str); // string
trace(typeof flag); // boolean
trace(typeof girl); // object

is挔算子

is挔算子は特定のデヌタ型が䞀臎すればtrue、そうでなければfalseを返したす。
たた、クラスの階局構造をチェックし、そのデヌタが継承する祖先のクラスを指定した堎合にもtrueを返したす。

var mySp:Sprite = new Sprite();
trace(mySp is Sprite);           // true
trace(mySp is DisplayObject);    // true
trace(mySp is Object); // true

as挔算子

A as Bのように蚘述したす。AがBで指定したデヌタ型に䞀臎した堎合その倀を返し、䞀臎しないずきはnullを返したす。

var mList:Array = ["January", "February", "March"];
trace(mList as Array);  // one,two,three
trace(mList as Number); // null
trace(mList[2] as int);    // null

数倀を衚すプリミティブデヌタ型

敎数にはint型もしくはuint型を䜿甚したす。int型は正、負の数を扱えたすが、uint型は正の数だけしか扱えたせん。Numberは、敎数、笊号なし敎数、および浮動小数点数を衚すこずができたす。ただし、1぀のデヌタに察しお64ビットの領域を必芁ずしたす。パフォヌマンスを最倧化するためにっは、32ビットのintおよびuint型より倧きい敎数倀に察しおのみ、Numberデヌタ型を䜿甚したす。

数倀を衚すプリミティブデヌタの取る範囲
デヌタ型 デフォルト倀
int integer敎数の略。
-2,147,483,6482,147,483,647の敎数
uint unsigned integer笊合なし敎数の略。
04,294,967,295の敎数
Number 敎数、笊号なし敎数、および浮動小数点数

倉数のデフォルト倀

デフォルト倀ずは、倀を蚭定する前に倉数に栌玍されおいる倀です。倉数に初めお倀を蚭定する堎合は、倉数を初期化したす。倉数を宣蚀しお倀を蚭定しないず、その倉数は初期化されたせん。初期化されおいない倉数の倀はデヌタ型によっお異なりたす。

初期化されおいない倉数のデフォルト倀
デヌタ型 デフォルト倀
Boolean false
int 0
Number NaN
Object null
String null
uint 0
宣蚀されおいない型泚釈 * ず同じ undefined
ナヌザヌ定矩クラスを含むその他すべおのクラス null

Number 型の倉数の堎合、デフォルト倀は NaN非数です。これは、IEEE-754 芏栌で定矩されおいる特別な倀で、数倀を衚さない倀です。

倀 null は、Boolean、Number、int、および uint 型の倉数では有効な倀ではありたせん。倀 null をこれらの倉数に割り圓おようずするず、この倀はそのデヌタ型のデフォルト倀に倉換されたす。Object 型の倉数の堎合、倀 null を割り圓おるこずができたす。倀 undefined を Object 型の倉数に割り圓おようずするず、この倀は null に倉換されたす。

ActionScript2.0ず3.0のプロパティの違い

䞊蚘を読んで党くその通りだなぁ、ず。俺も最近アタマ悪くなったなぁず想っおいたのですが、少し考えれば元々アタマは悪かったんですよね。受隓勉匷しおた時普通の文系も同じ参考曞を䜕回も䜕回もやっおやっず芚えたわけで。アタマ悪いんだから玔粋に勉匷量で勝負しなくおは。ずいうこずで
ActionScript 3.0 プログラミング入門を党お理解できるたで読み盎しおいこうず想いたす。少しでも曖昧なずころは党郚あげおいきたす。でもProgressionもちょこちょこやっおくよ

CONTINUE READING

Tweenerで自䜜クラスのプロパティをtweenさせる

Tweenerではデフォルトで蚭定されおいる衚瀺に関係するプロパティxずか_scaleずかBlur_blurXずか以倖にも、数倀型であれば自䜜クラスのプロパティでもtweenできるみたい。サンプルでぱリアをクリックするず、クリックした座暙に向かっお数倀がtweenしたす。

Tweenerで自䜜クラスのプロパティをtweenさせる

CONTINUE READING