Actionscript 3.0の勉強中にif文でcontainer1.numChildrenの数値を使いたいがうまくいかない

このQ&Aのポイント
  • Actionscript 3.0の勉強中に、container1.numChildrenの数値をif文の条件式に使用しようとしたが、うまくいかない状況になってしまった。
  • 条件式としてif(container1.numChild == 2)としてみると、読み込み専用であると言われてしまった。
  • どのように考えれば良いのかわからないので、助言を求めている。
回答を見る
  • ベストアンサー

actionscript 3.0 勉強中のもです

numChildrenから出した値をつかって実験中です。 以下の記述に置いて、contaner1.numChildrenの数値(結果:2)をif構文の条件式に使おう したところうまく行きません。if(container1.numChild == 2)にしてみると、読み込み専用ですと言われてしまいます。どのように考えたらよろしいのでしょうか?お心当たりありましたら是非よろしくお願い致します。 import flash.display.Sprite; var container1:Sprite = new Sprite(); var container2:Sprite = new Sprite(); var counter:Sprite = new Sprite(); var circle1:Sprite = new Sprite(); var n:Number= new Number; circle1.graphics.lineStyle(10,0x3355bb,); circle1.graphics.drawCircle(40, 50, 40); var circle2:Sprite = new Sprite(); circle2.graphics.beginFill(0x00CCFF); circle2.graphics.drawCircle(80, 90, 40); var circle3:Sprite = new Sprite(); circle3.graphics.beginFill(0x7766FF); circle3.graphics.drawCircle(60, 40, 40); container2.addChild(container1); container1.addChild(circle1); container1.addChild(circle2); addChild(circle1); addChild(circle3); trace(container1.numChildren); // 2 trace(container2.numChildren); // 1 trace(circle1.numChildren); // 0 trace(circle2.numChildren); n = container1.numChildren if(n == 2)//container1.numChildrenの数を代入値として使いたい。 { circle1.x=300 }

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

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1です。 すみません。 #1は一部書き間違えています。 まずはその訂正から。 ~#1より引用~ > もっとも > trace(container1.numChildren); // 2 > で出力されるのは「2」ではなく「1」ですから > (container1 内には circle1 が 1 つあるだけですから) 書き間違えているのは 上記部分の最後の ( ) 内です。   ↓書き直します↓ (container1 内には circle2 が 1 つあるだけですから)     というわけで #1の補足のご質問です。 > なぜ、 > container1.addChild(circle1);container1.addChild(circle2); > のように明確にcontainerにはcircle1とcircle2が > 入っている事が設定されているのに > containerの中が1つとなっているのでしょうか? ご質問で書かれていらっしゃるスクリプトには 次の部分があります。  ~~~前略~~~ container2.addChild(container1); container1.addChild(circle1); container1.addChild(circle2); ここまでで 「container2」内の表示リストに登録されている スプライトの階層構造を書くと次のようになります。  container2(←まだどこにも addChild されていない)   └container1     ├circle2     └circle1 つまりここまでは確かに 「container1」 の子 として 「circle1」と「circle2」の2つのスプライトがあります。 問題は次の行からのスクリプトです。 addChild(circle1); addChild(circle3); スクリプトを書いたのが root のタイムラインであるとすれば 上記2行で表示リストに登録されているスプライトの階層構造は次のように変化します。  root   ├circle3   └circle1  container2(←どこにも addChild されないまま)   └container1     └circle2 最初「container1」内にあった「circle1」は 移動させられて root の子になるということです。 ですから, trace(container1.numChildren); // 2 では「2」ではなく 「circle2」1つのみの「1」と出ます。 ちなみに 上の表示リストに登録されているスプライトの階層構造にも書いていますが 「container2」は結局最後までどこにも addChild されません。 したがって 「circle2(水色の●)」はどこにも表示されません。 (「circle1(ドーナツ)」は root に addChild されているため表示されます。)

naonao321
質問者

お礼

なるほど。目から鱗です。addChildされたオブジェクトは、root直轄になるのですね。 つまり、containerからでていく。奥が深いですね。毎回BlurFiltan様の的確且つ明快なお話に驚かされます。またよろしくお願いします。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

circle1.graphics.lineStyle(10,0x3355bb,); ここの括弧内の最後に「,(カンマ)」だけがあるので このままではパブリッシュ不可能ですが それを削除すると何のエラーもなく無事に動作しますよ。 もっとも trace(container1.numChildren); // 2 で出力されるのは「2」ではなく「1」ですから (container1 内には circle1 が 1 つあるだけですから) if(n == 2)//container1.numChildrenの数を代入値として使いたい。 の部分を if(n == 1)//container1.numChildrenの数を代入値として使いたい。 に変えれば, ドーナツ型のスプライトが右に行きます。 つまり「読み込み専用です…」などというエラーは全く出ませんし, そもそも 読み込み(読み取り) にしか使っていませんから問題は起こらないはずです。 書かれていらっしゃらない部分に問題があるか もしくは Flash 作成ソフトの不具合かもしれません。 特に CS5 や CS5.5 をお使いで もしアップデートされてなければ アップデータを適用させてみることをおすすめします。 「Adobe - Flash サポート ダウンロード」 http://www.adobe.com/jp/support/flash/downloads.html

naonao321
質問者

補足

BlurFiltan様 いつもありがとうございます。 ご回答いただきました内容にて確認したところ確かに、「if(n == 1)//container1.numChildren」の通りに行うと、確かにドーナツが動きます。 しかし、なぜ、container1.addChild(circle1);container1.addChild(circle2); のように明確にcontainerにはcircle1とcircle2が入っている事が設定されているのに containerの中が1つとなっているのでしょうか? 加えまして、今回、BlurFiltan様のご助言通りに記述し直したものに container1.addChild(circle2);の記述を加えると、今度はまたご回答いただく前の状態になってしまいました。表示リストにcircle2を加える事に何ら支障はないと思うのですが、なぜこのようになってしまうのでしょうか? 大変文章が長くなってしまい申し訳ありません。 よろしくお願い致します。

関連するQ&A

  • actionscript初心者です。importに

    友人に教えてもらったプログラムを練習用に解読?しています。 以下のプログラムにおいて、 importを含んだ時 importを含まない時(2つを消してしまった場合)では プレビューにおいては両者とも問題なく動作しますが 以下に、importを加える必要があるのでしょうか? よろしくお願い致します。 import flash.display.Sprite; import flash.events.MouseEvent; var circle1:Sprite = new Sprite(); circle1.graphics.beginFill(0xFFCC00); circle1.graphics.drawCircle(20, 20, 20); circle1.buttonMode = true; circle1.addEventListener(MouseEvent.CLICK, clicked); var circle2:Sprite = new Sprite(); circle2.graphics.beginFill(0xFFCC00); circle2.graphics.drawCircle(120, 40, 40); circle2.buttonMode = false; circle2.addEventListener(MouseEvent.CLICK, clicked); function clicked(event:MouseEvent):void { trace ("OK"); } addChild(circle1); addChild(circle2);

    • ベストアンサー
    • Flash
  • actionscript3.0 初心者です。

    ある円の半径を、マウスカーソルのX座標に対応させて変化させよう思い、以下の記述を行ったのですが、プレビューにて全く何も表示されません。お心当たりあれば是非教えていただきたいです。やはり、半径の値をiの形で代入させるようにしたことが無理矢理だったのでしょうか。よろしくお願いします。 package { import flash.display.Sprite; import flash.events.Event; public class boin extends Sprite {  public function boin() { var _maru:Sprite = new Sprite(); var i:Number = new Number();    _maru.graphics.beginFill(0xFF0000);    _maru.graphics.drawCircle(0,0,i);    _maru.graphics.endFill();    _maru.x = 100;    _maru.y = 200;    addChild(_maru);  addEventListener(Event.ENTER_FRAME,boo);  {   function boo(event:Event):void    {     _maru.x = mouseX;     i = mouseX;     }   } } } } ASファイル(boin)

    • ベストアンサー
    • Flash
  • ac3 if 構文の作り方

    以下のスクリプとで、最初にbox1が動き出して、box1がbox2を、x座標について値が上回ったとき、box2も動き出す、というもので詰まっています。すごく単純な見落としをしているのだと思いますが、どうにも行きません。お知恵をお借りできますと助かります。 import flash.display.Sprite; import flash.events.Event; var box1:Sprite=new Sprite; box1.graphics.beginFill(0x00FF00);   box1.graphics.drawRect(50,100,50,50);   box1.graphics.endFill(); var box2:Sprite=new Sprite; box2.graphics.beginFill(0x00FF00);   box2.graphics.drawRect(100,200,50,50);   box2.graphics.endFill(); addChild(box1); addChild(box2); box1.addEventListener(Event.ENTER_FRAME,mo); function mo(e:Event):void{ box1.x += 1;} trace("ok") if(box1.x>box2.x){ box2.addEventListener(Event.ENTER_FRAME,mo2); function mo2(e:Event):void{ box2.x += 1} trace("ok2")};

    • ベストアンサー
    • Flash
  • actionscript 3.0 勉強中のもです。

    よろしくお願いします。 ある右へ動いていく四角をクリックするとそれ自体のvisibleプロパティに変化(消える)を起こす事を意図して以下のような、プログラムを作りました。しかしながら、横移動の動作を確認しましたが、クリックをしても横移動を続けるだけでした。_mc.addEventListener(Event.ENTER_FRAME,onGo)を抜かした状態で見てみると、しっかり消えることを確認しました。しかし_mc.addEventListener(Event.ENTER_FRAME,onGo) を加えると上記のようになります。2つのイベントリスナーをつなげて書く事は間違った事ではないと思っています。どのように考えて書き直したらしたらよろしいのでしょうか?お心当たりございましたらどうぞよろしくお願いします。 package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class Main extends Sprite { var _mc:Sprite = new Sprite; function Main() { _mc.graphics.beginFill(0x334455); _mc.graphics.drawRect(0,0,120,120); _mc.graphics.endFill(); _mc.x= 130; _mc.y= 220; addChild(_mc); _mc.addEventListener(MouseEvent.CLICK,onClick2); _mc.addEventListener(Event.ENTER_FRAME,onGo); } function onClick2(event:MouseEvent):void { trace(event.target.name + "をクリックしました。"); _mc.visible= !(_mc.visible); } function onGo(event:Event):void { if(_mc.visible=true) { _mc.x += 1 } } } }

    • ベストアンサー
    • HTML
  • actionscript3.0,hitTest()

    現在hitTestopoint()を使った移動範囲の制限について調べています。 以下のスクリプトにおいて、イラストレーターで作った描画(B)を、円形のオブジェクトms(A,右方向に進んでいく)の移動の制限範囲と使いたいのですが、まず(1)のようになスクリプトを作成すると、正確な描画の範囲ではなく、大まかな範囲(大きな四角)の端で制限が適応されます。(動きが止まります。)この描画はaiデータをライブラリーに読み込んだものをそのままステージに置いただけなので、bitmapにしたらどうなるかと思い、(2)を記述しましたが、こちらも結果は同じでした。どのように考えたらよろしいのでしょうか?お心当たりございましたら、是非お願い致します。 補助画像を添付しております。 *(2)では描画テータにhit3というクラスでリンケージしてます。 (1) import flash.display.Sprite; import flash.events.Event; var ms:Sprite = new Sprite(); ms.graphics.beginFill(0x552277); ms.graphics.drawCircle(30,30,60); ms.graphics.endFill(); addChild(ms); this.addEventListener(Event.ENTER_FRAME,go) function go(event:Event):void{ ms.x += 5 if (! hito4.hitTestPoint(ms.getBounds(this).right,ms.y, true)) { ms.x -= 5; } if (! hito4.hitTestPoint(ms.getBounds(this).left, ms.y, true)) { ms.x += 5; } if (! hito4.hitTestPoint(ms.x, ms.getBounds(this).bottom, true)) { ms.y -= 5; } if (! hito4.hitTestPoint(ms.x,ms.getBounds(this).top, true)) { ms.y += 5; } } (2) import flash.display.Sprite; import flash.events.Event; import flash.display.BitmapData; import flash.display.Bitmap; var hito_bmp:BitmapData= new hito3(0,0); var hito_bmp_on:Bitmap= new Bitmap(hito_bmp,PixelSnapping.AUTO,true); stage.addChild(hito_bmp_on); hito_bmp_on.x=-150 hito_bmp_on.y=-100 var ms:Sprite = new Sprite(); ms.graphics.beginFill(0x552277); ms.graphics.drawCircle(30,30,60); ms.graphics.endFill(); addChild(ms); this.addEventListener(Event.ENTER_FRAME,go) function go(event:Event):void{ ms.x += 5 if (!hito_bmp_on.hitTestPoint(ms.getBounds(this).right,ms.y, true)) { ms.x -= 5; } if (!hito_bmp_on.hitTestPoint(ms.getBounds(this).left, ms.y, true)) { ms.x += 5; } if (!hito_bmp_on.hitTestPoint(ms.x, ms.getBounds(this).bottom, true)) { ms.y -= 5; } if (! hito_bmp_on.hitTestPoint(ms.x,ms.getBounds(this).top, true)) { ms.y += 5; } }

    • ベストアンサー
    • Flash
  • AS3.0でムービークリップ制御

    現在、AS3.0でswfファイルを読み込み、その再生・停止をコントロールするswfを作ろうとしています。 そこで自分なりにプログラム書いてみたのですが、停止ができなくて困っています。 以下ソース package { import flash.display.*; import flash.events.*; import flash.net.URLRequest; public class Test extends Sprite { private var mc:MovieClip = new MovieClip(); private var btn_load:SimpleButton = new SimpleButton(); //loadボタン private var btn_stop:SimpleButton = new SimpleButton(); //stopボタン private var l:Loader = new Loader(); public function Test() { mc.x = 30; mc.y = 30; btn_load.upState = this.drawCircle( 0x228822, 20 ); btn_load.overState = this.drawCircle( 0x225522, 21 ); btn_load.downState = this.drawCircle( 0x553355, 20 ); btn_load.hitTestState = btn_load.upState; btn_load.addEventListener( MouseEvent.CLICK, Load ); btn_stop.upState = this.drawCircle( 0x228822, 20 ); btn_stop.overState = this.drawCircle( 0x225522, 21 ); btn_stop.downState = this.drawCircle( 0x553355, 20 ); btn_stop.hitTestState = btn_stop.upState; btn_stop.x = 50; btn_stop.addEventListener(MouseEvent.CLICK, Stop); addChild(mc); addChild(btn_load); addChild(btn_stop); mc.addChild(l); } private function drawCircle( color:uint, r:Number ):Shape { var circle:Shape = new Shape(); circle.graphics.lineStyle( 1, 0x222222 ); circle.graphics.beginFill( color ); circle.graphics.drawCircle( 0, 0, r ); circle.graphics.endFill(); return circle; } private function Load(e:Event):void{ l.load(new URLRequest("animation.swf")); } private function Stop(e:Event):void{ mc.stop(); } } } なにが原因なのでしょうか・・・ わかる方ご回答お願いします。。

    • ベストアンサー
    • Flash
  • 円をランダムで描画していき、最初の円から徐々に透明になる

    現在AS3.0にてランダムで永遠と円を描きながらも、描画した円から順番に透明になっていくスクリプトを書いているのですが、以下のスクリプトですと全体が透明になっていき、最終的に何も残らなくなってしまいます。 常に透明度1の円を描画しつつも、先に描画した円から徐々に透明になっていくスクリプトにするにはどうすればよいのでしょうか?ご教授お願いできればと思います。 addEventListener(Event.ENTER_FRAME, rain); import flash.display.Sprite; import flash.display.MovieClip; var mySprite:Sprite = new Sprite(); var myClip:Sprite = new Sprite(); addChild(myClip); function rain(event:Event):void { with(mySprite.graphics) { var circle:int = Math.floor(Math.random()*100); var stageX:int = Math.floor(Math.random()*stage.stageWidth); var stageY:int = Math.floor(Math.random()*stage.stageHeight); beginFill(0x000000); drawCircle(stageX, stageY , circle); endFill; myClip.addChild(mySprite); var diff:Number = 0.01; myClip.alpha -= diff; } }

    • ベストアンサー
    • Flash
  • actionscript3.0ものすごく初心者です

    周辺見かけたプログラムを解読(?)しながら勉強しています。 以下のプログラムをflash cs5(actionscript3.0)にて入力すると パッケージはネストできません。と出ます。 どなたかが、ASじゃないとダメなのかなぁ.....とつぶやいていたのを見かけたのですが 当方何のことか全くわかりません。どのようにそれば以下の内容をflash cs5にてうち込む ことができるでしょうか?またできました、なぜ以下のパッケージが受け付けられないのかも教えていただきますと助かります。(packageは既に含まれているという記述を見ましたが 当方何のことか全くわかりません。)よろしくお願いします。 package { import flash.display.Sprite; [SWF(width="240",height="80",frameRate="24")] public class GraphicsSample extends Sprite { public function GraphicsSample() { var sp1:Sprite = new Sprite(); sp1.x = 30; sp1.y = 20; sp1.graphics.lineStyle(5,0xFF0000,1); sp1.graphics.moveTo( 0, 0); sp1.graphics.lineTo(10,45); sp1.graphics.lineTo( 0,20); sp1.graphics.lineTo(45,60); addChild(sp1); } } }

    • ベストアンサー
    • Flash
  • ASファイルからのstage

    flashcs3 actionscript3.0で作成しています。 asファイル "Test.as" package { import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.display.Stage; import flash.display.StageDisplayState; import flash.events.*; public class Test extends Sprite { public function Test() { init(); } private function init() { for (var i:uint = 0; i<10; i++) { var sp:Sprite = new Sprite(); sp.graphics.beginFill(0x00CCFF); sp.graphics.drawRect(i*20,50,20,20); sp.graphics.endFill(); stage.addChild(sp); } } } } flash var hoge2 = new Test(); と書いてflash上のstage上にSpriteをaddChildしたいのですがstageをnullと解釈してしまいます。 この場合flash上のstageを参照するにはどうすれば良いのでしょうか?

    • ベストアンサー
    • Flash
  • FLASHの出力エラーについて

    FLASHの出力エラーの原因がわかりません。 プレビューを押したとき ArgumentError: Error #2004: パラメータの 1 つが無効です。 at flash.display::Graphics/drawRect() at _fla::MainTimeline/xClick() とでてしまいます。 詳しい方、ご教授お願い致します。 ↓アクションスクリプトです add_btn.addEventListener(MouseEvent.CLICK, xClick); function xClick(evt) { var num1:Number = Number(in1_txt.text); var num2:Number = Number(in2_txt.text); var h:Number; if (num1 < 18) { h = 60; } else if ((num1 >= 18) && (num1 < 20)) { h = 50; } else if ((num1 >= 20) && (num1 < 23)){ h = 40; } var black:Number; if (num1 < 18) { black = (0xb0c4de); } else if ((num1 >= 18) && (num1 < 20)) { black = (0x8e9db2); } else if ((num1 >= 20) && (num1 < 23)) { black = (0x66707f); } else if ((num1 >= 23) && (num1 < 26)) { black = (0x232933); } else if(num1 > 25) { black = (0x232933); } var iro:Number; if (num1 < 18) { iro = 0.3;; } else if ((num1 >= 18) && (num1 < 20)) { iro = 0.4; } else if ((num1 >= 20) && (num1 < 23)){ iro = 0.5; }else if (num1 >50){ iro = 1.0; } var color:Number; if ((num2 >= 18) && (num2 <=25)){ color = (Math.random() * 0xffffff); } else if ( (num2 >=40) && (num2 <= 50)) { color = (0x999966); } else if(num1 > 50){ color = (0x996633); } else { color = (Math.random() * 0xffffff); } var k:Number; if ((num1 >= 23) && (num1 < 25)) { var mae:Shape=new Shape(); mae.graphics.beginFill(color); mae.alpha = 0.5; mae.graphics.drawRect(645 ,410, 310, 30); mae.graphics.endFill(); addChild(mae); for( y = 455 ; y <= 770 ; y = y + 255 ) { var ye:Shape=new Shape(); ye.graphics.beginFill(black); ye.graphics.drawRect(645 ,y, 310, 35); ye.graphics.endFill(); addChild(ye); } for( y = 505 ; y <= 700 ; y = y + 55 ) { var shima:Shape=new Shape(); shima.graphics.beginFill(color); shima.alpha = 0.5; shima.graphics.drawRect(645 ,y, 310, 28); shima.graphics.endFill(); addChild(shima); } } var m:Number; if (num1 >= 25) { var bod:Shape=new Shape(); bod.graphics.beginFill(color); bod.alpha = 0.5; bod.graphics.drawRect(645 ,410, 310, 10); bod.graphics.drawRect(645 ,490, 310, 10); bod.graphics.drawRect(645 ,660, 310, 20); bod.graphics.drawRect(645 ,685, 310, 5); bod.graphics.endFill(); addChild(bod); for( y = 430 ; y <= 700 ; y = y + 265 ) { var rec:Shape=new Shape(); rec.graphics.beginFill(black); rec.graphics.drawRect(645 ,y, 310, 50); rec.graphics.endFill(); addChild(rec); } for( y = 500 ; y <= 655 ; y = y + 40 ) { var ran:Shape=new Shape(); ran.graphics.beginFill(color); ran.alpha = 0.5; ran.graphics.drawRect(645 ,y, 310, Math.random()*30); ran.graphics.endFill(); addChild(ran); } }

専門家に質問してみよう