AC3 if構文の作り方

このQ&Aのポイント
  • AC3 if構文の作り方を学びましょう。
  • box1が動き出して、box1がbox2を上回った時にbox2も動き出すアルゴリズムの作り方について詳しく教えてください。
  • box1とbox2の位置を変更することでアルゴリズムの動きを調整できます。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数2

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

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

スクリプトも全体的に変ですが それ以前に 「動かす対象物は何なのか」 「何の座標と何の座標とを比較するのか」 これをご自身の中でハッキリさせましょう。 まず, 「動かす対象物はスプライト『box1』と『box2』」 なのでしょう? そして, 「スプライト『box1』と『box2』の座標を比較する」 のでしょう? ↑この2点をキッチリと意識してください。 書かれていらっしゃるスクリプトの var box1:Sprite=new Sprite; と var box2:Sprite=new Sprite; で スプライト『box1』と『box2』ができます。 しかしその後, 各スプライトの座標は指定されていません。 座標を指定しなければ それらスプライトは (x,y)=(0,0) にできます。 つまり最初から 『box1』と『box2』の座標は等しくて どちらとも (x,y)=(0,0) なのです。 『box1』のx座標が『box2』のx座標の値を上回るときなど 『box1』が動きだした直後です。 土台からして考えなおす必要がありますよね。   それと, それぞれのインスタンスに対して別々のイベントリスナー(関数)を登録するのではなくて 1つのイベントリスナー(関数)で済ませる方が管理がずっと簡単になるのではないでしょうか? というわけで 私でしたら次のようにするでしょう。 //------------------------------------ //スプライト「box1」を作成 var box1:Sprite = new Sprite(); //スプライト「box1」の座標を指定 box1.x = 50; box1.y = 100; //スプライト「box1」内に緑■を描画 box1.graphics.beginFill(0x00FF00); box1.graphics.drawRect(0,0,50,50); box1.graphics.endFill(); //スプライト「box2」を作成 var box2:Sprite = new Sprite(); //スプライト「box2」の座標を指定 box2.x = 100; box2.y = 200; //スプライト「box2」内に緑■を描画 box2.graphics.beginFill(0x00FF00); box2.graphics.drawRect(0,0,50,50); box2.graphics.endFill(); //スプライト「box1」と「box2」を配置 addChild(box1); addChild(box2); //毎フレーム 関数 mo を実行 this.addEventListener(Event.ENTER_FRAME,mo); //関数 mo の定義 function mo(e:Event):void { //「box1」を右に1pxずつ移動 box1.x += 1; //もし「box1」のx座標が「box2」のx座標より大きくなれば if (box1.x>box2.x) { //「box2」を右に1pxずつ移動 box2.x+=1; } } //------------------------------------ ========================== ついでに..., > 自身で調べたところでは > そのようなプロパティーの記述は見当たりませんでした。 > isMovingについてご解説いただければ幸いです。 isMoving は anyhelp さんが適当に作られた変数ですよ。 変数と言ってもフラグの役割を果たす変数です。 「box1」のx座標が「box2」のx座標より大きくなった次の瞬間から box2.addEventListener(Event.ENTER_FRAME,mo2); をし続けるのは変ですよね? ですからフラグを false で用意しておいて 「box1」のx座標が「box2」のx座標より大きくなった次の瞬間にだけ box2.addEventListener(Event.ENTER_FRAME,mo2); を実行させると同時にフラグを true にして その後は addEventListener を繰り返し実行させないようにしているのです。 「フラグ (コンピュータ) - Wikipedia」 http://ja.wikipedia.org/wiki/%E3%83%95%E3%83%A9%E3%82%B0_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)

naonao321
質問者

お礼

おっしゃる通りでした。 それぞれのboxを四角ツールで恣意的に置いた状態から、記述をした為に boxの位置の記述を省くということをしていました。説明が不足して大変申し訳ありません。ありがとうございました。

その他の回答 (1)

  • anyhelp
  • ベストアンサー率43% (79/180)
回答No.1

box2.isMoving=false; function mo(e:Event):void{ box1.x += 1; if(!box2.isMoving && box1.x>box2.x){ box2.addEventListener(Event.ENTER_FRAME,mo2); box2.isMoving=true; } } function mo2(e:Event):void{ box2.x += 1} となります。

naonao321
質問者

お礼

ありがとうございました。

naonao321
質問者

補足

早速のご回答、助かります。 御記述いただいたものの中にisMovingというプロパティーがありますが、 これはas3でも適用されるものなのでしょうか? 自身で調べたところではそのようなプロパティーの記述は見当たりませんでした。 isMovingについてご解説いただければ幸いです。 よろしくお願い致します。 (adobe flash cs5にて記述してみましたがisMovingを認識しませんでした。)

関連するQ&A

  • 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
  • ac3 tweener の 色変換について

    tweenerを使って、オブジェクとの色が変化する様子を確認しようと試したところ、以下の記述の中で_colorが認識されません。ある方のページから引用したものをほとんどそのまま試しているのですが、どのように修正したらよろしいでしょうか?お願いします。 package { import flash.display.*; import caurina.transitions.Tweener; import flash.events.MouseEvent; [SWF( backgroundColor='0xFFFFFF', width='300', frameRate='30')] public class Tweener_Test extends Sprite { public function Tweener_Test() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; init(); } private function init():void{ var Box:Sprite = new Sprite(); Box.graphics.beginFill(0x000000); Box.graphics.drawRect(0,0,50,50); Box.graphics.endFill(); addChild(Box); Box.addEventListener(MouseEvent.CLICK,function():void{ Tweener.addTween(Box, {_color:0xFF0000,x:120,time:2,transition:"linear"}); }); } } }

    • ベストアンサー
    • Flash
  • AS3.0 写真の切り替え

    調べても調べても漠然とした状態が続いてるので質問させていただきました。 まず、サンプルとしてこんなようなものが作りたいんです。 http://www.subaru-sls.co.jp/ ここの企業みたいな写真が一定時間でその場所その場所に移動していくというのを作りたいのですが、今後のことを考え、タイムラインにASを組むのではなく、外部AS(ドキュメントクラス?)だけで作りたいのです。 因みに写真などの配置はなんとかできたのですが、写真が切り替わるのがまったくわかりません。 こちらが現状況のコードになります。↓ package { import flash.display.Sprite; import flash.display.Loader; import flash.net.URLRequest; import flash.display.Shape; import flash.events.TimerEvent; import flash.utils.Timer; import flash.events.MouseEvent; import flash.display.Bitmap; [SWF(width = "550",height = "400")] public class main extends Sprite { //プロパティ var mc01:Sprite = new Sprite(); var mc02:Sprite = new Sprite(); var mc03:Sprite = new Sprite(); var imgUrl01:String = "kabegami1.jpg"; var imgUrl02:String = "kabegami2.jpg"; var imgUrl03:String = "kabegami3.jpg"; var onUrl01:URLRequest = new URLRequest(imgUrl01); var onUrl02:URLRequest = new URLRequest(imgUrl02); var onUrl03:URLRequest = new URLRequest(imgUrl03); var img01:Loader = new Loader(); var img02:Loader = new Loader(); var img03:Loader = new Loader(); var square01:Shape = new Shape(); var square02:Shape = new Shape(); var square03:Shape = new Shape(); var i:int = 0; var timer:Timer = new Timer(20); //コンストラクタ public function main () { init (); } //メソッド private function init () { square01.graphics.beginFill (0x000000); square02.graphics.beginFill (0x000000); square03.graphics.beginFill (0x000000); square01.graphics.drawRect (10, 10, 330, 380); square02.graphics.drawRect (350, 10, 110, 380); square03.graphics.drawRect (470, 10, 70, 380); square01.graphics.endFill (); square02.graphics.endFill (); square03.graphics.endFill (); img01.mask = square01; img02.mask = square02; img03.mask = square03; img01.load (onUrl01); img02.load (onUrl02); img03.load (onUrl03); addChild (square01); addChild (square02); addChild (square03); addChild (img01); addChild (img02); addChild (img03); timer.addEventListener (TimerEvent.TIMER,onTimer); timer.start (); img01.addEventListener (MouseEvent.MOUSE_DOWN,mouseDownHandler); } private function mouseDownHandler (event:MouseEvent):void { } private function onTimer (event:TimerEvent):void { i++; img01.alpha -= 0.01; } } } 長文になってしまいましたが、どうかご教授お願いします。

    • ベストアンサー
    • 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
  • 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
  • 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
  • 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); } }

  • 円をランダムで描画していき、最初の円から徐々に透明になる

    現在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
  • AS 3 mouseout & over

    以下のようにMOUSEOUT,MOUSEOVERをつかって、 インスタントにマウスオーバーするとその幅が増えていき、幅200のところで止まる。 インスタントからマウスアウトするとその幅が減っていき、幅60のところで止まる。 という事を意図して、記述しました。 しかしながら、マウスオーバーの内容は意図した通りのいくのですが、 マウスアウトの場合は少し幅が減っただけで、すぐに止まってしまいます。 どのように直せば、意図した通りに行くのでしょうか? お知恵をいただければ幸いです。 package { import flash.events.MouseEvent; import flash.events.Event; import flash.display.Sprite; public class main extends Sprite { var _sikaku:Sprite = new Sprite(); public function main(){ _sikaku.graphics.lineStyle(6,0x330066); _sikaku.graphics.drawRect(0,0,120,120); this.addChild(_sikaku); _sikaku.addEventListener(MouseEvent.MOUSE_OVER,big_off); _sikaku.addEventListener(MouseEvent.MOUSE_OUT,big_on); function big_on(event:Event):void { _sikaku.addEventListener(Event.ENTER_FRAME,tijimi); function tijimi(event:Event):void { if(_sikaku.width==60 ) { _sikaku.removeEventListener(Event.ENTER_FRAME,tijimi); } if(_sikaku.width > 60) { _sikaku.width -= 1} trace("stop!") } } function big_off(event:Event):void { _sikaku.addEventListener(Event.ENTER_FRAME,kakudai); function kakudai(event:Event):void { if(_sikaku.width < 200) { _sikaku.width += 1 trace("stop?") } if(_sikaku.width == 200) { _sikaku.removeEventListener(Event.ENTER_FRAME,kakudai); } } } } } }

  • 関数の中でaddEventListenerを設定したい

    package { import flash.display.*; import flash.events.*; public class goo extends Sprite { public function goo() { var rect = create(); //rect.addEventListener(MouseEvent.MOUSE_DOWN,oMDH); ここだとエラーが出ない。 push(); } public function create() { var myRect:Sprite = new Sprite(); myRect.graphics.beginFill(0xFF0000); myRect.graphics.drawRect(10,10,200,10); myRect.name = "rect"; return addChild(myRect); } public function push() { rect.addEventListener(MouseEvent.MOUSE_DOWN,oMDH);//ここだと1120 未定義のプロパティ・・・エラー } public function oMDH(e) { trace("ok"); } } } push() の中で rect に addEventListenerを設定したいです。 どうすればよいでしょうか。 また、rect の 絶対パス(? stage.rectみたいなやつ)も教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Flash

専門家に質問してみよう