補足・追加原稿: 2009年9月アーカイブ

 シンボルにもカスタムクラスを関連付けることができます。この手法は先に出版したAS3入門ノートでは解説していましたが、今回の完全改訂版では割愛した内容です。その内容をここで補足したいと思います。

 シンボルからインスタンスを作る方法は「Section07-01 表示オブジェクトの追加」に説明してあるので、ここが補足箇所の候補になりますが(p.211)、この時点ではクラス定義や継承について学んでいません。
 シンボルとカスタムクラスを関連付ける方法はドキュメントクラスと同じ考え方なので、「Section08-06 ドキュメントクラス」の最後のp.486が適当でしょう。ここに以下の原稿を追加します。

シンボルが継承するクラス 追加原稿 p.486
 ドキュメントクラスと同じようにシンボルにもカスタムクラスを関連付けることができます。シンボルにカスタムクラスを関連付けるには、シンボルのプロパティパネルでリンケージ書き出しの設定を行い、クラスフィールドにカスタムクラスを指定します。

fig 08-06-04.jpg
シンボルのリンケージ書き出し設定で関連付けるクラスを指定します

 たとえば、次のFlowerAクラスをシンボルに関連付けると、このシンボルから作ったインスタンスをステージに追加するだけで回転するようになります。このとき、ムービークリップシンボルに関連付けるカスタムクラスは、必ずMovieClipクラスを継承しなければなりません。
 インスタンスはnew FlowerA()で作ることができますが、普通にライブラリからステージにドロップして作ってもかまいません。

[:script:]シンボルに関連付けるFlowerAクラス
package {
	import flash.display.MovieClip;
	import flash.events.Event;

	public class FlowerA extends MovieClip {
		public function FlowerA() {
			addEventListener(Event.ENTER_FRAME, enterFrameHandler );
		}
		protected function enterFrameHandler(eventObj:Event):void {
			rotation += 3;
		}
	}
}

fig 08-06-05.jpg
インスタンスを作ってステージに追加するだけで回転します。→swfを試す
ファイルをダウンロードするextendSymbol.zip

(section03-01 Arrayクラスの配列から抜粋)

 配列の値を検索したい場合には、すべての値を総当たりでチェックしなければならない場合もありますが、単純に値が含まれているかどうかがわかればよい場合があります。そのような場合にはindexOf()、lastIndexOf()のメソッドが便利です。
 indexOf()は指定した検索開始位置から後ろへ検索して最初に見つかった位置を返します。検索開始位置を省略すると最初から探しします。開始位置をマイナスで指定すると後ろから位置を数えます。検索の結果見つからなかった場合には-1が返ってきます。

[:script:]配列を前から後ろへ検索する
var vlist:Array = new Array("a","x","b","a","x","c");
trace(vlist.indexOf("a",2));//出力:3
trace(vlist.indexOf("a",4));//出力:-1
//開始位置を省略
trace(vlist.indexOf("a"));//出力:0
//開始位置を後ろから数える
trace(vlist.indexOf("x",-3));//出力:4
補足:
2行目:"a"をインデックス番号2、つまり"b"の位置から後ろへ検索します。すると"b"の次の"a"が見つかります。この"a"はインデックス番号3なので3が返ります。
3行目:インデックス番号4の"x"の位置から"a"の検索を開始します。"x"より後ろに"a"はないので-1が返ります。
5行目:配列の先頭から"a"を検索します。先頭の"a"が見つかるので、インデックス番号0が返ります。
7行目:検索開始位置が-3なので、後ろから3個目の"a"から検索を開始します。検索方向は"a"から後ろ方向です。"a"の次の"x"が見つかります。この"x"のインデックス番号は4番です。

 lastIndexOf()は指定した検索開始位置から手前に検索して最初に見つかった位置を返します。検索開始位置を省略すると最後から探します。開始位置をマイナスで指定すると後ろから位置を数えます。検索の結果見つからなかった場合には-1が返ってきます。

[:script:]配列を後ろから前へ検索する
var vlist:Array=new Array("a","x","b","a","x","c");
trace(vlist.lastIndexOf("a",2));//出力:0
trace(vlist.lastIndexOf("a",4));//出力:3
//開始位置を省略
trace(vlist.lastIndexOf("a"));//出力:3
//開始位置を後ろから数える
trace(vlist.lastIndexOf("x",-3));//出力:1
補足:
後ろから検索しても、返ってくる値は前から数えるインデックス番号です。勘違いしやすいので注意してください。
2行目:インデックス番号2、つまり"b"の位置から前方向に"a"を検索します。先頭の"a"が見つかるので、インデックス番号0が返ります。
3行目:インデックス番号4、つまり後ろの"x"の位置から前方向へ"a"を検索します。すぐ左の"a"が見つかるので、インデックス番号3が返ります。
5行目:開始位置を省略すると最後から手前へ検索します。後ろの"a"が見つかるので、インデックス番号3が返ります。後ろから3個目ではなく、"a"のインデックス番号です。
7行目:後ろから3個目の"a"から前方向へ"x"を検索します。前から2個目の"x"が見つかるので、インデックス番号1が返ります。

 次のuniquePush()はnoListに同じ値が入っていなければ値を追加する関数です。引数で渡された値が配列に含まれていないかどうかをindexOf()で検索して確かめ、検索結果が-1のときに値をpush()しています。

[:script:]ユニークな値だけ配列に追加する
function uniquePush(tmplist:Array, v:int):void {
	//値が配列に含まれていないか検索する
	var index:int=tmplist.indexOf(v);
	if (index==-1) {
		//値を追加する
		tmplist.push(v);
	}
}
//配列に値を追加していく
var noList:Array=new Array(1,2,3);
uniquePush(noList,2);
uniquePush(noList,50);
uniquePush(noList,60);
uniquePush(noList,50);
trace(noList);//出力:1,2,3,50,60

 ActionScript 3.0 言語およびコンポーネントリファレンスでLoaderクラスの説明を見ると継承には次のように書いてあります。

継承:Loader→DisplayObjectContainer→InteractiveObject   →DisplayObject→EventDispatcher→Object

 これを見ると確かにLoaderクラスはDisplayObjectContainerクラスを継承しているので、MovieClipやSpriteなどと同じようにaddChild()を使って入れ子の表示オブジェクトを追加できるはずです。しかし実際にはLoaderが表示できるのは読み取り専用のcontantプロパティで参照できる表示オブジェクトだけです。
 その理由はコンポーネントリファレンスの説明の続きに書いてあります。そこには次のように書いてあります。

Loaderクラスの説明

Loader クラスは、継承する次のメソッドをオーバーライドします。これは、Loader オブジェクトが持つことができるのは 1 つの子表示オブジェクト、つまり読み込むオブジェクトに限られているためです。次のメソッドを呼び出すと例外がスローされます。メソッドは、addChild()、addChildAt()、removeChild()、removeChildAt() および setChildIndex() です。読み込まれた表示オブジェクトを削除するには、親の DisplayObjectContainer 子配列から Loader オブジェクトを削除する必要があります。

 p.225の表示リストの図でLoaderを二重枠にしていない理由はそういうわけでした。

fig07-02-06.jpg

まったく新しいAS3の世界!
694a.jpg
Adobe Flash CS4
詳細!ActionScript3.0入門ノート[完全改訂版](CD-ROM付)

楽しいActionScript。
新たなる1歩へと踏み出しましょう。
■内容は?→ 目次を見る
■評判は?→ 書評を読む
この本を書いたわけ

このアーカイブについて

このページには、2009年9月以降に書かれたブログ記事のうち補足・追加原稿カテゴリに属しているものが含まれています。

前のアーカイブは補足・追加原稿: 2009年8月です。

次のアーカイブは補足・追加原稿: 2009年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

あわせて読みたいブログパーツ