- 締切済み
actionscript2.0で空の配列を詰めたい
actionscript勉強中の初心者の身ですがどうかご教授下さい。 Photo1~10と名前のつけたMCを順に並べ、そのMCを押すとリムーブします。 そのリムーブしたMCの間を詰め、残ったものに順に1~また名前を振っていきたいと考えています。 例: Photo1 Photo2 Photo3→リムーブする Photo4→リムーブする Photo5 ↓ Photo1 Photo2 Photo5 ↓ 間を詰めて名前を振り直す Photo1 Photo2 Photo3(元5) これを配列を使ってやっているのですが、どうしても空の配列が出来てしまって、上手く希望通りになりません。 間を詰めるところまではたどり着いたのですが、それでも空の配列が前に詰められ、後ろに並び替えられたMCが配置されるというどうにも中途半端にしかできないでいます… 上の例でいきますと、 (空の配列) (空の配列) Photo1 Photo2 Photo5 という状態です。 この空白の配列を詰めて、Photo1~順に名前を振り直していきたいと思っています。 今後どんな風にスクリプトを書けばいいのか、もしくはもしこの方法では希望の動きが出来ないようであれば、どう変えればいいのかをどうか教えて頂きたいです。 分かりづらいとは思いますが、何卒よろしくお願いいたします。 var clip_addr:MovieClip = _root; var list:Array = new Array(); //2段にMC"Photo1~10"を順々に並べていく objA = new Array(2*5); D = 1; sy = 40; for (y=0; y<2; y++) { sx = 40; for (x=0; x<5; x++) { objA[D] = _root.attachMovie("Photo"+D, "Photo"+D, D+100); objA[D]._x = sx; objA[D]._y = sy; D++; sx += 100; } sy += 100; } //リストにrefを記録 //MCを押すとリムーブする for (i=1; i<=10; i++) { ref = clip_addr["Photo"+i]; list[i] = {clip:ref}; ref.onPress = function() { this.removeMovieClip(); }; } //naraというMCを押すと消された番号を詰めて並び変わる(並び変わる場所はテスト段階なので適当に配置) nara.onPress = function() { for (i=1; i<=10; i++) { list.sortOn("clip",Array.NUMERIC); trace(list[i].clip) mog = list[i].clip mog._x = 100*i; mog._y = 10*i; } }; ↑最終的に上の処理にリネームの要素を加えていきたいと考えています。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- BlurFiltan
- ベストアンサー率91% (1611/1754)
MC(ムービークリップ)のリネーム(インスタンス名付け直し)は そのMCの name プロパティを再度定義し直せば良いだけですが そもそもリネームする必要はあるのでしょうか? ActionScript 2.0 までは確かに「インスタンス名」は重要なものですが ActionScript 3.0 では 「インスタンス名」 は重要ではありませんし 動的に生成したインスタンスにはそもそもインスタンス名など自動では付きません。 ではどうやってインスタンスの管理をするのかというと インスタンスを「参照する変数」で管理します。 「[AS3] MovieClipインスタンスとインスタンス名」 http://f-site.org/articles/2008/04/19014939.html わざわざインスタンスの管理に配列を使われるのでしたら (つまり インスタンス名 とは離れたものを用意するのでしたら) ActionScript 3.0 風な考え方を取り入れて その配列にMCへの参照を代入し, ひたすらその MCへの参照 を管理すれば良いのではないでしょうか。 あと配列の要素を間引くのには splice() メソッドを使うのが簡単で便利です。 ↓全文例↓ (コピペ可) ----------------------------------- //変数clip_addrに_root階層の参照を代入 var clip_addr:MovieClip = _root; //2段にMC"Photo1~10"を順々に並べていく var objA:Array = new Array(2*5); var sx:Number = 40; var sy:Number = 40; for (var i = 0; i<=9; i++) { //識別子 Photo1~10 のMCを呼び出し //その参照を 配列 objA[0~9] に代入 objA[i] = _root.attachMovie("Photo"+(i+1), "Photo"+(i+1), i+101); } //ムービークリップを配置する関数 arrangeMC を定義 function arrangeMC():Void { //配列 objA の要素数分ループ for (var i = 0; i<=objA.length-1; i++) { // x座標を (i を 5 で割った余り)×100+sx にする objA[i]._x = i%5*100+sx; // y座標を (i÷5) の小数を切り捨て×100+sy にする objA[i]._y = Math.floor(i/5)*100+sy; } } //関数 arrangeMC を即実行 arrangeMC(); //各MCプレス時の動作を定義 for (i=0; i<=9; i++) { objA[i].onPress = function():Void { //配列 objA の要素数分ループ for (var i = 0; i<=objA.length-1; i++) { // もし配列の要素にこのプレスしたMCの参照が入っていれば if (objA[i] == this) { //その要素を1つ抜き取る objA.splice(i, 1); } } //このプレスしたMCを削除 this.removeMovieClip(); // //関数 arrangeMC を実行 arrangeMC(); }; } ----------------------------------- 別にこの後(MCのプレス時), //配列 objA の要素数分ループ for (var i = 0; i<=objA.length-1; i++) { //リネーム objA[i].name = "Photo" + i; } というようなことをさせても良いとは思いますが あまり意味があることのようには思えません。