こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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;
}
};

↑最終的に上の処理にリネームの要素を加えていきたいと考えています。

投稿日時 - 2011-02-06 03:48:14

QNo.6501426

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

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;
}

というようなことをさせても良いとは思いますが
あまり意味があることのようには思えません。

投稿日時 - 2011-02-06 07:11:58

あなたにオススメの質問