ActionScript 3.0で始めるオブジェクト指向スクリプティング

第32回 Dictionaryクラスを使う

この記事を読むのに必要な時間:およそ 3.5 分

今回は,新たに「Dictionaryクラス」をお題にする。Dictionaryクラスには,独自のメソッドとしてコンストラクタしか備わっていない。しかも,[ヘルプ]を読んでも,何をするクラスなのか要領を得ない。しかし,実はかなり使いでのあるクラスなのだ。

インスタンス同士を関連づける

練習のサンプルには,前回のロールオーバーのネタを使う。ステージの端にサムネイル画像を並べて,それらにロールオーバーしたとき,対応する大きい画像の表示を切替えるムービーだ(図1)。

図1 サムネイルにロールオーバーすると対応する画像が切替わる

図1 サムネイルにロールオーバーすると対応する画像が切替わる

画像

第31回「マウスのロールオーバー」の2ページからダウンロードできる,スクリプト2のサンプルファイルのスクリプトに手を加える(図2)。今回考えるのは,サムネイルと画像のインスタンスをどう関連づけるかである。

図2 メインタイムラインに書かれたフレームアクション

図2 メインタイムラインに書かれたフレームアクション

前回のスクリプト2は,以下に抜粋したように,サムネイルのインスタンス(button0_mc~button2_mc)に同じ名前の変数(show_mc)を設定し,それぞれに対応する画像のインスタンス(my0_mc~my2_mc)を納めた。そのうえで,リスナー関数(xShow())が受取ったイベントオブジェクトから,イベントリスナーの登録された(Event.currentTargetプロパティの)サムネイルのインスタンスを取出し,その変数が参照する画像のインスタンスを操作した。

button0_mc.addEventListener(MouseEvent.ROLL_OVER, xShow);
button1_mc.addEventListener(MouseEvent.ROLL_OVER, xShow);
button2_mc.addEventListener(MouseEvent.ROLL_OVER, xShow);
button0_mc.show_mc = my0_mc;
button1_mc.show_mc = my1_mc;
button2_mc.show_mc = my2_mc;
// ...[中略]...
function xShow(eventObject):void {
  var my_mc:MovieClip = eventObject.currentTarget as MovieClip;
  var show_mc:MovieClip = my_mc.show_mc;
  // ...[中略]...
  show_mc.visible = true;
  // ...[中略]...
}

今回は少し考え方を変えて,画像のインスタンス(my0_mc~my2_mc)はひとつにまとめて,サムネイルのインスタンス(button0_mc~button2_mc)をキーとして設定する。そのキーをもとに,対応する画像を取出そうということだ。

これまで学んだ方法でいえば,Objectクラスが使えるだろう(第19回Objectクラスと静的メソッドの定義)。Objectインスタンスにサムネイルの各インスタンス(button0_mc~button2_mc)名をプロパティ名として,対応する画像のインスタンス(my0_mc~my2_mc)の参照を納めればよい(スクリプト1)。

var showList:Object = new Object();  
// ...[中略]...
showList.button0_mc = my0_mc;
showList.button1_mc = my1_mc;
showList.button2_mc = my2_mc;
// ...[中略]...
function xShow(eventObject):void {
  var show_mc:MovieClip = showList[eventObject.currentTarget.name];

スクリプト1 Objectに設定した各インスタンス名のプロパティに対応するインスタンスを納める

// タイムライン: メイン
// MovieClipインスタンス
// サムネイル: thum0_mc~thum2_mc
// 表示画像: my0_mc~my2_mc
// フレームアクション
var glow:GlowFilter = new GlowFilter(0x000033);
var dropShadow:DropShadowFilter = new DropShadowFilter();
var filters_array:Array = [glow, dropShadow];
var showList:Object = new Object();   // 新規Objectインスタンスの生成
button0_mc.addEventListener(MouseEvent.ROLL_OVER, xShow);
button1_mc.addEventListener(MouseEvent.ROLL_OVER, xShow);
button2_mc.addEventListener(MouseEvent.ROLL_OVER, xShow);
// インスタンス名のプロパティに対応するインスタンスの参照を格納
showList.button0_mc = my0_mc;
showList.button1_mc = my1_mc;
showList.button2_mc = my2_mc;
xClearAll();
function xShow(eventObject):void {
  // Objectからインスタンス名のプロパティに納められた対応する参照を得る
  var show_mc:MovieClip = showList[eventObject.currentTarget.name];
  xClearAll();
  show_mc.visible = true;
  show_mc.filters = filters_array;
}
function xClearAll():void {
  my0_mc.visible = false;
  my1_mc.visible = false;
  my2_mc.visible = false;
  my0_mc.filters = [];
  my1_mc.filters = [];
  my2_mc.filters = [];
}

リスナー関数xShow()は,受取ったイベントオブジェクトのEvent.currentTargetプロパティからDisplayObject.nameプロパティでサムネイルのインスタンス名の文字列を得ている。そのうえで,配列アクセス演算子[]によりObjectインスタンスから,対応する画像のインスタンスを取出した(変数show_mcに格納)。

もっとも前回の最後に,DisplayObject.nameプロパティは,trace()関数で[出力]してインスタンス名を確かめる以外には,あまり使い勝手はよくない」と述べた(※1)。そして,「ActionScript 3.0では,できるだけインスタンスの参照を使う仕組みにする方がよい」とも申し上げた。その「仕組み」をつくるひとつの手がDictionaryクラスの利用だ。

※1
ActionScript 3.0におけるインスタンス名の扱いと注意点については,F-siteMovieClipインスタンスとインスタンス名を参照してほしい。

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書

コメント

コメントの記入