• 締切済み

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; } }; ↑最終的に上の処理にリネームの要素を加えていきたいと考えています。

  • Flash
  • 回答数1
  • ありがとう数1

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.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; } というようなことをさせても良いとは思いますが あまり意味があることのようには思えません。

関連するQ&A

  • actionscript2.0で動的な位置変化

    actionscript2.0を使い、bg0~bg9と配列で並んだムービークリップに対して、hit判定があった場合、hitしたムービークリップの数の分だけ、位置がずれていくという動的なムービークリップの移動と配置をさせたいと考えています。(画像参照) また、「hitBar」を外した際に、元いた位置に戻ってほしいです。 ムービークリップの配置の配列は、下記のスクリプトを使用しています。 objA = new Array(2* 5); D = 0; sy = 112; for (y = 0; y < 2; y++) { sx = 70; for (x = 0; x < 5; x++) { objA[D] = _root.attachMovie("bg" , "bg" + D, D + 100); objA[D]._x = sx; objA[D]._y = sy; D++; sx += 36; } sy += 36; } actionscriptはまだまだ未熟なもので、いろいろと試してみたのですが、どうにも上手くいかずに困っています… どうかお知恵を貸していただけたら幸いです。 画像のような動きができれば、上記のスクリプトを用いらずともまったくかまいません。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • actionscriptでfor文が正常に動かない

    自分ではどうやっても解決できなかったのでどうかご教授ください。 面倒な作りになっているので大変申し訳ないのですが、少ない数だと機能したものの、数を増やしたことで上手く動かなくなってしまいまして… ご面倒だとは思いますが、どうか教えていただきたいです。 actionscript2.0で、Photo0~23のMCがあり、各MCの中には5フレームを作っています。 Photo0~23をクリックすることでnextFrameで1ずつフレームが進むよう設定していています。 問題はここからなのですが、ボタンを押したら各MCの今現在表示しているフレームごとにリネームをしようと考えています。 例)()内表示されているフレーム数 Photo0(5),Photo1(3),Photo2(3),Photo3(1),Photo4(4),Photo5(2) ↓ Photo0(5),Photo4(4),Photo1(3),Photo2(3),Photo5(2),Photo3(1) (フレームの表示番号が多い順番に並べ替える(調べる)) ↓リネーム Photo0(元Photo0),Photo1(元P4),Photo2(元P3),Photo3(元P2),Photo4(元P5),Photo5(元3) 現在表示しているフレーム番号をMCの番号順(Photo0~23)順に調べるスクリプトは下記で出来ています。 しかし、いざリネームをさせると20や21までしかリネームできずに困っています。 var clip_addr:MovieClip = _root; Change_b.onPress= function(){ _global.px = 0; Clip_Align(); } function Clip_Align():Void { var i:Number, j:Number, px:Number; var ref:MovieClip; //表示フレームを順に調べる for (i=5; i>=1; i--) { //全てのMCをチェック for (j=0, px=0; j<=23; j++) { //走査するMCの参照を作成 ref = clip_addr["Photo"+j]; //該当するMCがあった場合、順にリネームする if (ref._currentframe == i) { ref._name= "Photo"+_global.px; //5から1の順に出てくるかを調べる/正常(しかし↓で21しか出ていない場合は21個しか出てこない) trace(i) //ちゃんとリネームされているか調べる/ここで毎回20や21などバラバラな数字が… trace(ref) //次のためにpxを更新 _global.px++; } } } } ここからずっと進めずに立ち往生してしまっている状態で、困っています… どこをどう直せば希望の動作をしてくれるのか、 もしくは、記述しているスクリプトがそもそもこれでは出来ないようでしたら、どう改変したらいいのか教えていただきたいです。 何卒よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • actionscriptの配列について

    antionscript初心者ですが、配列について質問があります。 使っているソフトはadobe flash CS3 professionalです。 配列を利用する際に 入力テキストやダイナミックテキストを入れるということはできないのでしょうか? ↓入力テキストの方 Var x: Array=new Array(2); x[0]= ○○.text; x[1]= ●●.text; ↓ダイナミックテキストの方 Var y: Array=new Array(2); y[0]= □□.text; y[1]= ■■.text; そのあとボタンをクリックしたら for(var i : int =0; i<x.length; i++){ if(x[i]>=5){ y[i]="A" }else if(x<5){ y[i]="B" } } というように 入力テキストにいれられた数値に応じてダイナミックテキストに文字を表示させたいのですが、うまくいきません。初心者なので意味不明な質問になっているかもしれませんが、よろしくお願いします。

    • ベストアンサー
    • Flash
  • 多次元配列(リファレンスを用いて)の行にアクセスする方法

    多次元配列において、行全体を表示させるには、どのようにしたらよいのでしょうか。 例えば、以下のような(無名)配列を作成したあとに、2行目を全て表示させる方法です。 @ARRAY = ( ["00", "01", "02"], ["10", "11", "12"], ["20", "21", "22"] ); cf: 一次元の場合は @list = ("1", "2", "3"); $ref = \@list; (print $ref; # ARRAY(0x9986)などとアドレスが表示) print @$ref; # 配列の全てが表示 ( print $$ref[1]; # "2"が表示 ) とやれるので、同じように $ref = \@ARRAY; print @$ref[1]; としてみても上手くゆきません。 (print $$ref[1][1]; # "11"が表示 はOK) すみませんが、宜しくお願い致します。

  • 空の配列を削除して、詰めていく。

    データベースから値を取ってくるとき、全て、同じ値が入ってくる場合があります。 $a = array(100,100,100,100,100)というような。 これを、array_uniqueで重複している値を削除したのですが、その際、print_rで見ると、 Array ( [4] => 100 ) と表示されました。つまり、キーが0ではなく、4となってしまっています。 array_uniqueで帰ってきた値が複数なら、さらにsortすることで0から始まる配列として並び替えられるのですが、1つしか帰ってこないとsortをしても、キーは変わらないようです。 この値を表示させるとき、countで配列の数を数え、さらにfor文でcountの数だけ回し、print $i;で表示させるようにしているのですが、上記のようにarray_uniqueで1つの値しか帰ってこないと、ページに値がきちんと表示できなくなってしまいます。 これを解決するために、空の要素を削除して、空白でない要素のキーを前に詰めてくれるような関数などを探しているのですが、何か方法などありますでしょうか? Array ( [4] => 100 ) が Array ( [0] => 100 )となるようにしたいのです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • AS3.0 二次元配列でムービークリップが出来ない

    Actionscript3.0 超初心者です。 二度目の質問です。  40x80のマス目をエクセルマクロが使えない人のためにFlashで表示させようとしています。 ライブラリーのMC mark_mcを二次元配列で並べようとしていますが、うまく行きません。 試しに一次元配列だと下記のコードでエラーが出なくうまく表示されます。 var mc_array:Array = new Array(); mc_array[3]=new mark_mc(); addChild(mc_array[3]); mc_array[3].scaleX = 0.5; mc_array[3].scaleY = 0.5; mc_array[3].x = 300; mc_array[3].y = 200; 二次元にして var mc_array:Array = new Array(); mc_array[3][2]=new mark_mc(); addChild(mc_array[3][2]); mc_array[3][2].scaleX = 0.5; mc_array[3][2].scaleY = 0.5; mc_array[3][2].x = 300; mc_array[3][2].y = 200; こうすると、TypeError: 「Error #1010: 条件は未定義であり、プロパティがありません。」が出てしまいます。 [3][2]の部分はfor文でデータをマス目に作ろうとしています。 基本的に間違っているのでしょうか?

    • ベストアンサー
    • Flash
  • createEmptyMoviClipをつかって画像とリンクを設定したい

    createEmptyMovieclipなどを使って、各ムービークリップに画像とリンク設定(getURL)をしたいと思っていますが、初心者なのもので、うまく設定できず困っております。 (その1):下記のコードでは、画像表示は計算通り表示されますが、リンク設定はできないでおります。 ※下記switch文の「case2」は無視していただいても構いません。 ------------------------------------------------------------------------------------------- file_list = new Array(); file_list = ["gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg"]; link = new Array(); link = ["http://www.yahoo.co.jp/" ,"http://www.yahoo.co.jp/" ,"http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/"]; load_obj = new MovieClipLoader(); act_step = 0; this.onEnterFrame = function(){ var i , clip ; switch(act_step){ //各画像を各空MCに割り当て case 0: for(i = 0;i < file_list.length;i++){ clip = this.createEmptyMovieClip("clip" + i ,i); load_obj.loadClip(file_list[i] , clip); } act_step++; break; case 1: loaded_cnt = file_list.length; if(loaded_cnt >= file_list.length) { for(i = 0; i < file_list.length ; i++){ clip = this["clip" + i]; //ムービークリップのサイズと表示位置設定 if(i <= 2){ clip._x = 290*i; } else{ clip._x = 290*i - (290/(i-1)); } clip._y = 50; if(i > 0){ clip._xscale = 100/i; clip._yscale = 100/i; } } act_step++; } break; } } ----------------------------------------------------------------------------------------- (その2)上記コード(その1)でリンク設定ができなかったので、下記のコードのように 「createEmptyMovieClip」を使って、画像表示とリンク設定をしたかったですが、これもうまくいきませんでした。 ---------------------------------------------------------------------------------------- file_list = new Array(); file_list = ["gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg","gazou.jpg"]; link = new Array(); link = ["http://www.yahoo.co.jp/" ,"http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/"]; act_step = 0; this.onEnterFrame = function(){ var i , clip , rinku; switch(act_step){ //各画像を各空MCに割り当て case 0: for(i = 0;i < file_list.length;i++){ this.createEmptyMovieClip("rinku"+i,i); this.rinku.createEmptyMovieClip("clip" + i ,i); this.rinku.clip.loadMovie(file_list[i] , i); this.rinku.onPress = function(){ getURL(link[i] ,"_self"); } } act_step++; break; case 1: loaded_cnt = file_list.length; if(loaded_cnt >= file_list.length) { for(i = 0; i < file_list.length ; i++){ clip = this["clip" + i]; //ムービークリップのサイズと表示位置設定 if(i <= 2){ clip._x = 290*i; } else{ clip._x = 290*i - (290/(i-1)); } clip._y = 50; if(i > 0){ clip._xscale = 100/i; clip._yscale = 100/i; } } act_step++; } break; } } ------------------------------------------------------------------- 上記「その1」または「その2」を修正して、リンクの設定を行う方法をご教示お願いいたします!

    • ベストアンサー
    • Flash
  • 多次元配列を、1次元の配列にする関数を書いてください。

    以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか? <?php $arr[0] = 'a'; $arr[1][0] = 'b'; $arr[1][1][0] = 'c'; $arr[1][1][1][0] = 'd'; $arr[1][1][1][1][0] = 'e'; $arr[1][1][1][2] = 'f'; $arr[1][1][2] = 'g'; $arr[1][2] = 'h'; $arr[2] = 'i'; function array_flatten($arg){   処理; } $new_arr = array_flatten($arr); print_r($new_arr); ?> ↓ Array (   [0] => a   [1] => b   [2] => c   [3] => d   [4] => e   [5] => f   [6] => g   [7] => h   [8] => i ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?

    • ベストアンサー
    • PHP
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • 配列を抜き出し新しい配列を作りたい

    いつも参考にさせて頂いています。 今あるボタンAに function sortFunc(a, b) { return a.ID-b.ID; } hoge = new Array(); hoge.push({ID:_root.g1, a:"○○", b:"mc_maru"}); hoge.push({ID:_root.g2, a:"△△", b:"mc_sankaku"}); hoge.push({ID:_root.g3, a:"□□", b:"mc_shikaku"}); hoge.sort(sortFunc); // 結果 { } for (var i = hoge.length; i>=0; i--) { trace(hoge[i].ID+hoge[i].a+hoge[i].b); this.key_text.text +=(("\r")+hoge[i].a); } } このような配列の並び替えをしています。 _root.g1、2、3の点数を受けて点数の高い順に並び替えしてる 物を_key.textと言うダイナミックテキストに渡して表示させています。 この並び替えを利用し点数の高いものを二つを抜きだしたいのですが、 Array.slice()をどうやって使えばいいのか分からず困っています。 わかる方いらしたら教えて頂けないでしょうか?

    • ベストアンサー
    • Flash

専門家に質問してみよう