ActionScriptの配列について

このQ&Aのポイント
  • ActionScriptで配列を利用する際の問題について質問があります。入力テキストやダイナミックテキストを配列に入れることはできるのか疑問です。
  • 具体的には、Adobe Flash CS3 Professionalを使用している初心者です。入力テキストの内容を配列に格納し、その値に応じてダイナミックテキストに文字を表示させたいのですが、上手くいきません。
  • この質問は初心者なので、分かりづらいかもしれませんが、どうぞよろしくお願いします。
回答を見る
  • ベストアンサー

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
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんな形でなら動くと思います。 Var y: Array=new Array(2); y[0]= □□; y[1]= ■■; if(x[i]>=5){ y[i].text="A" }else if(x<5){ y[i].text="B" } ---------------- 変数にセットする時String、Numberはその値がコピーされます。 つまり元のものとは独立した存在になります。 □□(テキストフィールド?)はアドレス(?)の値がコピーされます つまり元のもの同じものとして扱えます。 (この説明はたぶん不完全なので雰囲気を感じ取ってください)

pippijyun
質問者

お礼

わかりやすい回答ありがとうございます!この方法で動かすことができました。本当に助かりました。

その他の回答 (1)

回答No.1

ASでは真偽値と文字と数値は参照になりません (Boolean,String,uint,int,Number) b.text="犬" a=b.text a="猫" とやってもb.textは"猫"にはなりません aにb.textの"犬"が代入され つづいて"猫"が代入されるというだけです なので、bの参照をつくってそのtextに代入する というような形にします b.text="犬" a=b a.text="猫" 以前はダイナミックテキストの内容は 変数として扱われてましたが 今のダイナミックテキストはあくまで 『スクリプトで内容を読み書きできるテキストフレーム』です

pippijyun
質問者

お礼

回答ありがとうございます!本当に助かりました!

関連するQ&A

  • ActionScriptでの配列について

    var table:Array=["A1","A2"]; と配列を宣言しています。 他のレイヤーでこの配列の値を取得し onClipEvent(load){ for(i=0;i<=_root.table.length;i++){ if(_root.table[i] == "A1"){ //処理1     }else{ //処理2 } というようにその配列の値があれば処理1をなければ処理2をするプログラムを書きたいのですが・・。 rootの配列を読み込むやりかたを教えていただきたいです。 どなたかアドバイスいただけると助かります。

  • ActionScriptで配列をクリアする方法を教えてください。

    ActionScriptで、オブジェクトを格納した配列をクリアする正しい方法を教えてください。 具体的には、 ・new Array() で配列を生成する。 ・new Object() で生成したオブジェクトを配列に格納する。 ・配列の中身を処理したあと、配列を一度クリアする。 ・配列に別のオブジェクトを格納する。 ような処理をしたいのですが、メモリリークを起こさずに配列をクリアするにはどうしたらいいでしょうか? 例えば、イメージはこんな感じです。(意味のないコードですが) // 配列の生成 var arr = new Array(); // 配列にオブジェクトを格納 for (var i = 0; i < 5; i++) { var obj = new Object(); obj.num = i; } // 配列のクリア arr.length = 0; // クリアした配列に別のオブジェクトを格納 for (var i = 0; i < 5; i++) { var obj = new Object(); obj.num = i * 2; } 上記のコードで、arr.length = 0; で配列をクリアしていますが、これで配列に格納されたオブジェクトが確保したメモリがすべて解放されるでしょうか? あるいは、配列の内容がなくなるまで pop() 等で取り出す等の処理をする必要があるでしょうか? 以上よろしくお願いします。

    • ベストアンサー
    • Flash
  • 初心者です。 配列のエラーがどうしても解決できません。 誰か助けてください・・・

    魔方陣のプログラムを考えて書いてみましたが、 エラーが出てしまい実行することができません。 class mahoujin{ public static void main(String args[]){ int n=3; int a[][] = new int[3][3]; int x=0; int y=1; for(int p=0;p<=3;p++){ for(int q=0;q<=3;q++){ a[p][q]=0;} } for(int i=1;i<=n*n;i++){ if((i%n)==1){x++; }else{x--; y++;} if(x==0){x=3;} if(y==3){y=0;} a[x][y]=i;} } } 空の配列や配列を外れるものがあるかをよく考えてみましたが、どうしても解決できません。助けてください・・・

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

  • AS3.0でクリック数に応じて配列の値を返したい…

    こんにちは、 AS3.0のド初心者です。 タイトルの通りのことをやってみたいのですが、うまくいきません。 var myArray:Array=["一度クリックされました","二度クリックされました","三度クリックされました","四度クリックされました"]; addEventListener(MouseEvent.MOUSE_DOWN,myFunc); function myFunc(e:Event):void{ var i:int=0; if(i<=myArray.length){ myArray_txt.text=myArray[i]; i++; } else{ nextFrame(); } } これを実行すると、一度クリックされましたと表示されて以降、テキストが変化しません。 ご教授のほどよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 配列について、その要素を並べ替えて得られる配列を重複することなく全て得たいです。

    要素数が5つなら5!で120通り、nであればn!通りの配列をすべて得たい、といった具合です。 自分で組んでみたところ、再帰呼び出しを多用しているせいか要素を8つにした時点でFirefoxだと「このページのスクリプトは処理に時間がかかっているか応答しなくなっています。…」、IEでも似たような警告文が表示されてしまいます。 コードは以下に示すとおりです。 そこでお聞きしたいのは、  1.「処理に時間が~云々」などの表示をさせずに処理を   続けさせるにはどのように書いたらいいか  2.もっと短くスマートなコードで全走査できないか の2つです。 1.についてはユーザサイドでなく開発者サイドで、かつalertを使う以外の方法で、警告文を出させないで処理を続けさせるためにはコードをどのようにしたらよいでしょうか。 2.に関しては、私が書いたコードは正直わかりにくいと思いますので、もっとシンプルに全走査できるアルゴリズムがあったら教えてほしいです。 どうかよろしくお願いします。 <html> <body> <script type="text/javascript"> <!-- //Arrayオブジェクトに自身をコピーした配列を返すclone()メソッド追加 Array.prototype.clone = function(){ // 自分自身が配列かをチェック if(this[0].constructor == Array ){ var ar, n; //新しい配列を用意する ar = new Array(this.length); for(var n=0;n<ar.length;n++){ //再起呼び出しで配列の中身をコピー ar[n] = this[n].clone(); } //作成した配列を返す return ar; } return Array.apply(null,this); } //★要素を並べ替える前の配列の宣言 var ar = new Array("1","2","3","4","5","6","7","8"); //並べ替え後の配列を格納する配列宣言 var arranged_ar = new Array(); function arArrange(){ //引数は(呼び出した節の、並び替える前の配列内での順番,すでに取り出した節の配列,兄弟の配列) function createBranch(parentCounter,parentNodes,sameDepthBranches){ var branches = new Array(); //呼び出した節の子ノード格納用の配列宣言 branches = sameDepthBranches.clone(); //呼び出した節の兄弟をコピー branches.splice(parentCounter,1) //呼び出した節を除いて子ノードの配列作成完了 var pushed_ar = new Array(); //この節以前に登場した節を格納する(最終的に並べ替え終わった配列になる)配列宣言 pushed_ar = parentNodes.clone(); //呼び出し元のpushed_arをコピー for(var i=0;i<branches.length;i++){ pushed_ar.push(branches[i]); //pushed_arに子ノードを1つ追加 //走査が葉ノードに達したときの処理 if(pushed_ar.length == ar.length){ var length = arranged_ar.length; arranged_ar[length] = new Array(); for(var j=0;j<pushed_ar.length;j++){ arranged_ar[length].push(pushed_ar[j]); //arranged_arに並び替え後の配列を格納 } //走査がまだ葉ノードに達していない場合の処理 }else{ createBranch(i,pushed_ar,branches); //自身を再帰呼び出しすることで葉ノードに達するまでループ } //子ノード以下の走査が終わった場合の処理 pushed_ar.splice(pushed_ar.length-1,1); //追加した子ノードを削除して次の子ノード追加へ } return; } //↑で宣言したcreateBranch関数の呼び出し for(i=0;i<ar.length;i++){ var tempAr = new Array(); tempAr.push(ar[i]); createBranch(i,tempAr,ar); } //結果をresultに格納 var result = ""; for(var i=0;i<arranged_ar.length;i++){ result += i+1 + ": "; for(var j=0;j<arranged_ar[i].length;j++){ result += arranged_ar[i][j] + ","; } result += "<br>"; } //結果を画面に表示 document.getElementById("result").innerHTML = result; return; } --> </script> <input type="button" value="全並べ替えパターン走査" onclick="arArrange();"> <p id="result">ここに結果表示</p> </body> </html>

  • 配列

    以下のコードの用に配列内に入っている要素をif文の「(array[i] == AA)」みたいに直接判定するのは不可能なのでしょうか?よろしくお願いいたします。 String[] array = {"AA","BB","CC"}; for(int i = 0;i < array.length;i++) {  if(array[i] == AA) //ここの部分

    • ベストアンサー
    • Java
  • 配列

    最後にもう一つだけお願いします。ずっと格闘しても解決できません・・ 配列の中の数字で、偶数を全て奇数の前にもって行きます 例) {1,0,1,0,0,1,1} → {0,0,0,1,1,1,1} {3,3,2} → {2,3,3} {2,2,2} → {2,2,2} 流れとしては、まず奇数の数を数えます。これは何回シフトするから知るためです。 配列0から奇数を探し、あればそれを一番最後の配列へとシフトします。 奇数を探す作業が一度終わっても、まだシフトさせないといけない奇数があるかもしれないので(奇数が連続で並んでる場合)、最初に数えた奇数の数分だけちゃんとシフトするようにしようと思います。 public void evensLeft(int[] array) { int odd=0; for (int i = 0; i < array.length; i++) { if(array[i]%2!=0) odd++; //奇数の個数 } while (odd>0) { //奇数分シフトするためのカウント for(int j=0;j<array.length;j++){ //奇数を探す if (array[j] % 2 != 0) { odd--; //奇数のカウントを1減らす for (int k = j; k < array.length-1; k++) { //その奇数を一番最後に移動 int temp = array[k+1]; array[k+1] = array[k]; array[k] = temp; } } } } return array; } いくつかの例では動くのですが、{3,3,2}の例だと配列0に3が来てしまいます。色々変えてみても結果無理でした・・・ どなたかご教授お願いします。

    • ベストアンサー
    • Java
  • javaの二次元配列について質問です

    配列上にあるただ一つの1を入力に応じて移動させるプログラムを作っています。 たとえば0が入力されたら 0, 0, 0 0, 1, 0 0, 1, 0 → 0, 0, 0 0, 0, 0 0, 0, 0 という風に移動させ、端に行ったら移動できないようにしたいです。 今書いたプログラムだと、最初にある1が残ったままになってしまいます。 int[] p = {-1, -1}; int[][] im = new int[3][3]; Scanner scn = new Scanner(System.in); for (int i = 0; i < p.length; i++) { p[i] = 1; } im[p[0]][p[1]] = 1; for (int i = 0; i < im.length; i++) { for (int j = 0; j < im[i].length; j++) { System.out.print(im[i][j] + ","); } System.out.println(); } int n = 0; n = scn.nextInt(); if (n == 0) { p[0] -= 1; } else if (n == 1) { p[1] += 1; } else if (n == 2) { p[0] += 1; } else if (n == 3) { p[1] -= 1; } im[p[0]][p[1]] = 1; for (int i = 0; i < im.length; i++) { for (int j = 0; j < im[i].length; j++) { System.out.print(im[i][j] + ","); } System.out.println(); }

  • スクリプト改善

    おねがいします こちらのスクリプトは縦スクロールの音ゲームです。こちらを編集して横スクロールの音ゲームにしてもらえませんか?自分でやってもなかなかできなくて、、、 mport flash.events.Event; import flash.display.DisplayObject; import flash.events.KeyboardEvent; stop(); var se:SE1 = new SE1(); var hit:int,time:int; const speed:int = 10; var key:Array = [65,83,68,70,74,75,76,187]; var timeline:int = 0; var onp_y:Array = new Array(); init(); function init(){ txt_score.text = "0"; txt_combo.text = "0"; hit = 0; onp_y[0] = [36,110]; onp_y[1] = [42,123]; onp_y[2] = [48,155]; onp_y[3] = [81,165]; onp_y[4] = [89,200]; onp_y[5] = [95,211]; onp_y[6] = [103,260]; onp_y[7] = [110,300]; var onp_x = [160,220,280,340,460]; var clazz:Class = getDefinitionByName("o_001") as Class; for (var k:int=0; k<onp_y.length; k++){ for(var i:int=0; i<onp_y[k].length; i++){ var obj = new clazz(); obj.name = "onp"+k+i; obj.addEventListener (Event.ENTER_FRAME,update_onp); addChild(obj); obj.x = onp_x[k]; obj.y = -onp_y[k][i]*speed+mc_line.y; trace(-onp_y[k][i]); if(time < onp_y[k][i]){ time = onp_y[k][i]; } } } time += 12; //0.5秒 stage.addEventListener(KeyboardEvent.KEY_DOWN,pressKey); stage.addEventListener(Event.ENTER_FRAME,update_stage); stage.focus = stage; } function term(){ for(var k:int=0; k<onp_y.length; k++){ for(var i:int=0; i<onp_y[k].length; i++){ var ins:DisplayObject = getChildByName("onp"+k+i); ins.removeEventListener(Event.ENTER_FRAME,update_onp); removeChild(ins); } } stage.removeEventListener(KeyboardEvent.KEY_DOWN,pressKey); stage.removeEventListener(Event.ENTER_FRAME,update_stage); SoundMixer.stopAll(); } function update_stage(e:Event){ timeline++; if(timeline>time){ term(); if(hit<4){ gotoAndStop("bad"); }else if(hit<8){ gotoAndStop("nice"); }else{ gotoAndStop("great"); } } } function update_onp(e:Event){ var ins:Object = e.target; ins.y += speed; if(400<ins.y && ins.visible == true){ txt_combo.text = "0"; ins.visible = false; mc_hantei.gotoAndPlay("miss"); } } function pressKey(e:KeyboardEvent){ for(var k:int = 0;k<key.length;k++){ for(var i:int = 0; i<onp_y[k].length; i++){ var ins:Object = getChildByName("onp"+k+i); if(e.keyCode == key[k] && ins.hitTestObject(mc_line) && ins.visible == true){ txt_score.text = String(Number(txt_score.text)+10); txt_combo.text = String(Number(txt_combo.text)+1); hit += 1; //se.play(); ins.visible = false; mc_hantei.gotoAndPlay("great"); k++; break; } } } }

専門家に質問してみよう