[AS3] Dictionaryクラスを使ってみる [Edit]

Dictionaryクラスは、独自のメソッドとしてコンストラクタしか備えていません(「Dictionary()コンストラクタ」参照)。クラスの説明を読んでも、使い方はもちろん、その意味さえわかりにくいようです。

Dictionaryインスタンスの使い途は基本的に配列やObjectインスタンスと同じで、複数の値を納める容れ物です。ただ、値にアクセスしたいとき、配列なら整数インデックス、Objectインスタンスは文字列の識別子を用います。それに対して、Dictionaryインスタンスは、オブジェクトの参照そのものをキーとして指定できるのです。

簡単なフレームアクションを、サンプルとして書きました(スクリプト001)。3つの青い矩形のSpriteインスタンスをタイムラインに配置し、それらをクリックすると、それぞれに異なるフィルタが適用されます(図001)。

スクリプト001■クリックしたインスタンスごとに異なるフィルタを適用する
// フレームアクション
var nColor:uint = 0x0000FF;
var sizePoint:Point = new Point(100,25);
var myDictionary:Dictionary = new Dictionary();
var mySprite:Sprite;
mySprite = createSprite(10, 10);
myDictionary[mySprite] = new BevelFilter();
mySprite = createSprite(10, 50);
myDictionary[mySprite] = new BlurFilter();
mySprite = createSprite(10, 90);
myDictionary[mySprite] = new GlowFilter();
mySprite = null;
function createSprite(nX:Number, nY:Number):Sprite {
  var mySprite:Sprite = new Sprite();
  var myGraphics:Graphics = mySprite.graphics;
  addChild(mySprite);
  mySprite.addEventListener(MouseEvent.CLICK, applyFilter);
  myGraphics.beginFill(nColor);
  myGraphics.drawRect(0, 0, sizePoint.x, sizePoint.y);
  mySprite.x = nX;
  mySprite.y = nY;
  return mySprite;
}
function applyFilter(eventObject:MouseEvent):void {
  var mySprite:Sprite = eventObject.currentTarget as Sprite;
  mySprite.filters = [myDictionary[mySprite]];
  mySprite.removeEventListener(MouseEvent.CLICK, applyFilter);
}
図001■インスタンスをクリックするとそれぞれに異なるフィルタが適用される
FF0912041_001.gif FF0912041_002.gif

とくに動的に生成したインスタンスには、デフォルトではインスタンス名がなく、[出力]しても区別できません。上記のサンプルスクリプトでは、変数に代入されたSpriteインスタンスの参照も破棄しています。

しかし、Dictionaryインスタンスに対して、各Spriteインスタンスの参照をキーとしてフィルタオブジェクトを納めています。そして、クリックしたときのイベントオブジェクトから対象のインスタンスを調べ、Dictionaryインスタンスからそれがキーとされたフィルタオブジェクトを取出し、Spriteインスタンスに設定しています。

サンプルのクラスをwonderflに投稿しました。なお、Dictionaryクラス について詳しくは、gihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第32回「Dictionaryクラスを使う」をお読みください。

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事