CS3 導入に伴う自作クラスの修正(3)
2007/06/06 20:49 - AS3.0
Public Alpha → CS3 切り替えに伴うクラスの修正第三弾です。
私の作る Flash 作品はそのほとんどが、複数の表示オブジェクトを個別に動かすタイプのものです。
例えば「動くグリッド」は正方形セルが個別に、モーションタイポはそれぞれの文字が個別に動くことで一つの作品になっています。
以下、その複数の表示オブジェクトを便宜上『セル』と呼ぶことにします。
『セル』を個別に動かすということは、全『セル』へアクセスしなければならないわけですが、その処理の実現をおこなうコード表現には幾つかの方法がありますね。
例えば、各『セル』にユニークな名前をつけて、以下のように舐めるとか。
<生成時> while( cnt-- ) { var c = new Cell(); c.name = "CELL" + cnt; } <舐める時> for ( var i:int=0; i<cellNum; i++ ) { this["CELL"+i] に何らかの処理 }
私は AS2 の頃から、このユニークな名前による識別は採用していません。
Array を使う方法を採用しています。
『セル』の生成と同時に、配列にその『セル(の参照)』を push もしくは unshift していきます。 そして、全『セル』にアクセスするときは、その配列を舐めるわけです。
<生成時> while( cnt-- ) { var c = new Cell(); cellArray.push( c ); } <舐める時> for ( var idx:int in cellArray ) { cellArray[idx] に何らかの処理 }
今回問題となったのは配列を舐めるときにおこなった以下の記述です。
for ( var idx:int in cellArray ) { // Error
AS3 では for や while などのループがずいぶん早くなったという話を聞きました。 とりわけ for in ループの速度向上は劇的だとか。
大雑把なワタクシは、Array も Object も同じようなもんだろうと、Public Alpha では Array に対して for in を使ったんですが、はやり自分勝手な解釈はイカン。
idx に int 型なんか指定するんじゃねー、とコンパイラから叱られました。
型指定を外して以下の記述にすればコンパイラを通ります。
for ( var idx in cellArray ) {
でも特別な理由がない限り型指定はしておいた方が良さそうだし、for in で Array を舐めるのはあまり一般的じゃなさそうだし、前回エントリーした addchild 周りでのエラーという反省点もあります。
やはりコード記述は我流をやめて、グローバルスタンダードやデファクトスタンダードに則った方がよろしかろう、ってことで Livedocs 読んで勉強しました。
AS3 で新設された for each in というかなり良さげなループがあったのでこちらに切り替えます。
for each ( var item in cellArray ) { item に何らかの処理 }
ただ私の作品では、一つのループの中で要素数が同じ複数の配列を同時に舐めるようなものもあります。 その際はどの記述が良いのか、少し検証が必要かも。
例えば cellArray と orderArray はそれぞれのインデックスで一対一対応をさせており、cellArray には各『セル』が、orderArray には対応する『セル』の動かす順番が格納されています。
全『セル』を舐めて、その『セル』の順番を orderArray から対応させるとき、以下の3パターンが考えられると思います。
<while 使用> var idx:int = cellArray.length; while ( idx-- ) { var orderNum:int = orderArray[idx]; cellArray[idx] に orderNum を反映させた何らかの処理 }
<for 使用> for ( var i:int; i<cellArray.length; i++ ) { var orderNum:int = orderArray[i]; cellArray[i] に orderNum を反映させた何らかの処理 }
<for each in 使用> var idx:int = 0; for each ( var item in cellArray ) { var orderNum:int = orderArray[idx]; item に orderNum を反映させた何らかの処理 idx++; }
for each in で Array を舐めたとき、インデックス 0 からの順次アクセスが確実に保証されているんなら、3番目のが良いのかなぁ。
なお、今回の修正に伴い、動くグリッド by tweener (6) のソースを入れ替えました。