ホーム > タグ > ActionScript

ActionScript

1人particle祭り

particle1 – wonderfl build flash online

レベルがあまりに高すぎてビビりつつずっとサボってたwonderflをまたやり始めました。
パーティクル祭に乗り遅れること半年以上、今日からちまちま1人パーティクル祭りやってくよー。
第1回目の今日はとりあえず放射線状に発射。

配列から重複せずに値を取り出す

最近クイズを作る機会が何度かありまして、総数20問から7問を重複しないよう抜き出して順番に表示していくというようなことをしました。その時に作ったクラスです。

配列から重複せずにn個取り出して新しい配列を返すRandomExtractクラス

Action Script
package
{
	public class RandomExtract
	{
		/**
		 * コンストラクタ
		 *
		 * @access public
		 * @param
		 * @return void
		 */
		public function RandomExtract():void
		{
		}

		/**
		 * ランダムに配列の値を取り出す
		 *
		 * @access public
		 * @param array 元になる配列
		 * @param num 取り出す配列の個数
		 * @return Array
		 */
		public static function random(array, num):Array
		{
			var a:Array = array;
			var t:Object = {};
			var r:Array = [];
			var l:int = a.length;
			var n:int = num < l ? num : l;
			while (n-- > 0) {
				//配列の数からランダムな値を作成
				var i = Math.random() * l | 0;
				r[n] = t[i] || a[i];
				//  t[i]がundefinedにならない処理
				--l;
				t[i] = t[l] || a[l];
			}
			return r;
		}
	}
}

例えば10個の配列から3個の値を取り出したい時は以下のように記述します。

Action Script
import RandomExtract;

var arr:Array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var num:int = 3;

var newArr:Array = RandomExtract.random(_arr, _num);
trace(newArr + "が取り出されるんだぜ");

出力結果はこんな感じです。

Action Script
2,1,6が取り出されるんだぜ

参考サイトがあってそこのコードを自分に分かりやすいように書き換えただけなのですが、どこだったか分からなくなってしまいました。見つけたら追記します。

[9/21 追記]
ムダにRandomExtractクラスをインスタンス化していたのでrandomメソッドをstaticに修正。

FlashVarsの受け取り方

【参考】
【Flash】FlashVarをFlashで受け取る(AS3)|atsumo+Flash

以下のようにして受け取ります。

Action Script
var flashVars:Object = loaderInfo.parameters;
for (var i:String in flashVars) {
	_txt.appendText(i + "=" + flashVars[i] + "\n");
}

受け取りたいFlashVarsの値の中身が複数あって、それぞれ別々の場所に格納したい以下のような場合には、

HTML
nickname=ore&age=10014

for…inループの変数部分にはObjectのプロパティ名が入ります。文字列を追加したいTextfieldを各プロパティ名に対応する値として格納しておくことで、別々のTextfieldに追加することができます。

Action Script
var flashVars:Object = loaderInfo.parameters;
var txtData:Object = {nickname:name_txt, age:age_txt};
for (var i:String in flashVars) {
	txtData[i].appendText(flashVars[i]);
}

ProgressionのContextMenuを表示させない

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

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

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

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

Action Script
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にも書いてある内容。

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

Action Script
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……とループします。

Action Script
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での記述はこんなんになりました。

Action Script
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つずつずらした多次元配列の作り方。

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

出力結果は以下のようになります(見難いので改行してます)。

Action Script
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

oval – wonderfl build flash online

wonderflデビュウしましたよ。三角関数使いこなせてませんが、凄腕のみなさんの作品で勉強させてもらいつつ、気持ちいいものをあげていければと想います。

データ型の変換

String型の”4649″をint型の4649として計算したい時など、データ型を変換したい場合があります。
型変換には、暗黙的に行われる場合と、明示的に行う必要がある場合があります。明示的に行う型変換を「キャスト」と呼びます。

暗黙的な変換

以下はuint型とString型の連結の例。数値の11が暗黙的に文字列に変換され、文字列同士の連結が行われます。

Action Script
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型の数値に変換する例。

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

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

小数点以下の数値を含むNumber型の数値をint型やuint型にキャストすると小数点井が切り捨てられます。

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

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

構文によるキャスト
専用の関数が用意されていないデータ型に変換する場合でも、次のような構文を使用することで関連するクラスにキャストできます。

Action Script
クラス(値)

以下はMovieClipクラスのインスタンス「mc」をSpriteクラスにキャストします。

Action Script
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”
Action Script
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を返します。

Action Script
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を返します。

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

Home > Tags > ActionScript

Search
Feeds
Meta
works
MYUNGMI'S PARK+
友人のイラストレーターのポートフォリオサイトです。ゴキゲンなイラストがいっぱい!
AnotherBookmark
1日1カワイ子ちゃん
やっぱダッフルでしょ

Return to page top