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

第32回 Dictionaryクラスを使う

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

Dictionaryクラスは参照をキーにできる

Dictionaryクラスは,きわめてあっさりした組立てだ。何しろ,独自のプロパティはなく,メソッドもコンストラクタしかない(図3)。流行りの言回しなら「草食系」クラスといったところだろう。では,中身もわかりやすいかというと,[ヘルプ]の[Dictionary]クラスにはこんな説明がされている。おそらく,これで理解できる人は少ないだろう。

Dictionaryクラスでは,プロパティの動的なコレクションを作成し,キーの比較に厳密な等式(===)を使用できます。オブジェクトがキーとして使用されている場合は,オブジェクトの識別子を使用してオブジェクトを検索し,オブジェクトのtoString()を呼び出して返される値は使用されません。

図3 Dictionaryクラスのプロパティとメソッド

図3 Dictionaryクラスのプロパティとメソッド

文法について詳しくは,筆者のサイトにDictionary()コンストラクタというリファレンスを掲載しているのでお読みいただきたい。ただ,押さえておくべきことはふたつだ。

第1に,Dictionaryクラスの使い途は,配列(Array)やObjectクラスと同じ複数の値を納める「容れ物」である。第2に, Dictionaryクラスの特長として,キーにオブジェクトの参照を用いることができる。その他にキーとしては,配列と同じ整数インデックスも指定できるし,もちろんObjectクラスを継承しているので文字列の識別子も使える。しかし,参照そのものをキーにできることが大きな利点といえる。

スクリプト1を書替えて,ObjectでなくDictionaryインスタンスを使った処理にしたのが以下のスクリプト2だ。

スクリプト2 Dictionaryにインスタンスの参照をキーにして対応するインスタンスを納める

// タイムライン: メイン
// 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:Dictionary = new Dictionary();   // 新規Dictionaryインスタンスの生成
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 {
  // Dictionaryからインスタンスの参照をキーにして対応するインスタンスを得る
  var show_mc:MovieClip = showList[eventObject.currentTarget];
  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 = [];
}

サムネイルのインスタンス(button0_mc~button2_mc)の参照をキーにするので,Dictionaryインスタンス(変数showList)に配列アクセス演算子[]で文字列でなくインスタンスそのものを指定し,対応する画像のインスタンス(my0_mc~my2_mc)を納めている。また,リスナー関数xShow()でも,イベントオブジェクトのEvent.currentTargetプロパティで得られた参照をそのままDictionaryインスタンスのキーに指定して,対応する画像のインスタンスが得られる。

var showList:Dictionary = new Dictionary();
// ...[中略]...
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];

今回のサンプルムービーは,サムネイルのインスタンスを予めタイムラインに置いてインスタンス名をつけておいたので,スクリプト1と2とでステートメント数が変わらない。けれど,インスタンスを動的に生成するときには,Dictionaryクラスで扱えば,わざわざインスタンス名をつけなくて済む(※2)。前回も述べたとおり,⁠ActionScript 3.0では,できるだけインスタンスの参照を使う仕組みにする」ことがお勧めといえる。

※2
インスタンスを動的に生成するサンプルとしては,前出Dictionary()コンストラクタ「例」にあるスクリプト001が参考になるだろう。

さて,次回からは,Flash Player 10の3次元空間の扱いに入りたい。

今回解説した次のサンプルファイルがダウンロードできます。

著者プロフィール

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

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

URLhttp://www.FumioNonaka.com/

著書