ActionScript 3.0勉強中の横移動する四角形のクリックで消えるプログラム

このQ&Aのポイント
  • ActionScript 3.0を勉強中の方が、横移動する四角形をクリックすると消えるプログラムを作成したところ、クリックしても横移動だけが続き、消えない問題が発生しました。
  • イベントリスナーをつなげて書き直すことは間違っていないと思いますが、どのように書き直せば正しく動作するのかわかりません。
  • どなたかお知恵をお貸しいただけると幸いです。
回答を見る
  • ベストアンサー

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

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

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

2つのイベントリスナーがどうしたこうしてではなくて 単なる凡ミスですね。 最後の関数 function onGo 内 の if文 の () 内↓ if(_mc.visible=true) この「=」は代入演算子です。 つまりこのままでは 「_mc を表示させろ!」という意味になり, それを ENTER_FRAME で実行させるわけですから, 「何が何でも _mc を表示させ続けろ!」 みたいな動作命令をしていることになります。 だから _mc は表示されっぱなしになるのです。 「等しいかどうか?」の判断に使うのは 等価演算子の「==」です。   ↓修正↓ if(_mc.visible == true) 「Adobe ActionScript 3.0 演算子」 ・等価演算子 http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7fd1.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7f64 ※それと思うのですが...   質問カテゴリも凡ミスしていらっしゃいませんか?

naonao321
質問者

お礼

BlurFiltan様 いつもありがとうございます。 一筋縄ではいかないようですね(汗。 もう少し考え方をつかんでいくにはまだ時間がかかりそうです。 今しばらくおつきあいいただければ幸いです。 ありがとうございました。

naonao321
質問者

補足

BlurFiltan様 いつもありがとうございます。引き続き質問をさせてください。以下のように、_mc.visibleプロパティーがtrueの時には、横移動を続け且つ,_mcをクリックすると visibleプロパティーがfalse(否定され)になり、逆に_mc.visibleプロパティーがfalseの時は、stageをクリックするとvisibleプロパティーがtrueになる事を意図して、記述をしました。しかし TypeError: Error #1034: 強制型変換に失敗しました。flash.events::Event@35d28ec1 を flash.events.MouseEvent に変換できません。 と出力にでます。どのようにしたらよろしいのでしょうか?よろしくお願いします。 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); stage.addEventListener(MouseEvent.CLICK,onClick3) } function onClick2(event:MouseEvent):void { if(_mc.visible==true) { trace(event.target.name + "をクリックしました。"); _mc.visible= !(_mc.visible); } } function onGo(event:MouseEvent):void { if(_mc.visible==true) { _mc.x += 1 } } function onClick3(event:MouseEvent):void { if(_mc.visible==false) { _mc.visible= !(_mc.visible); } } } }

その他の回答 (1)

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

#1 です。 まずエラーメッセージの件からです。 > TypeError: Error #1034: 強制型変換に失敗しました。 > flash.events::Event@35d28ec1 を > flash.events.MouseEvent に変換できません。 > と出力にでます。 これはそのエラーメッセージの通りしょう。 _mc.addEventListener(Event.ENTER_FRAME,onGo); ここ↑で _mc に対して Event.ENTER_FRAME (毎フレーム実行) で 関数「onGo」 を実行させ続けようとされていますが, それを受ける 関数「onGo」 の仮引数の型が MouseEvent になっているからです↓。 function onGo(event:MouseEvent) Event.ENTER_FRAME (毎フレーム実行) はマウスイベントではありません。 というわけで修正↓。 function onGo (event:Event)     ================ 次です。 > _mcをクリックすると > visibleプロパティーがfalse(否定され)になり、 > 逆に_mc.visibleプロパティーがfalseの時は、 > stageをクリックするとvisibleプロパティーが > trueになる事を意図して、 > 記述をしました。 「_mc」は「stage の中」に存在するわけです。 つまり 「_mc」をクリックする = 「stage」もクリックする ということになります。 ですから 最初のエラーを修正しても, 説明されているような動作にはなりません。 とりあえずは「_mc」をクリックしても「_mc」は消えません。 これは「_mc」をクリックすると同時に「stage」もクリックしていることになるからです。 (「_mc」クリックで「_mc」は消えても,「stage」クリックによってまた表示される。) この件に関しては 次のようにするのが1つの対処法でしょうか。 ◎第1案 //============================ package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class Main extends Sprite { var _mc:Sprite = new Sprite(); //_mc をクリックしたかどうかのフラグを用意 var click_flag:Boolean = false; 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); stage.addEventListener (MouseEvent.CLICK,onClick3); } function onClick2 (event:MouseEvent):void { //_mc は無条件に表示 _mc.visible = false; // _mc クリックフラグを true にする click_flag = true; } function onGo (event:Event):void { if (_mc.visible) { _mc.x += 1; } } function onClick3 (event:MouseEvent):void { //_mc の visible が false であり if (!_mc.visible) { //なおかつ _mc クリックフラグが true のとき if (click_flag) { //_mc クリックフラグを false にする click_flag=false; } else { //それ以外(フラグが false)のときに限って _mc を表示 _mc.visible=true; } } } } } //============================   全く別の考え方ですが 次のような方法もアリかもしれません↓。 ◎第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); stage.addEventListener (MouseEvent.CLICK,onClick2); _mc.addEventListener (Event.ENTER_FRAME,onGo); } function onClick2 (event:MouseEvent):void { // _mc の visible が false のとき if (! _mc.visible) { // _mc を表示 _mc.visible = true; // それ以外で もし _mc がマウスとヒットしていれば } else if (_mc.hitTestPoint(stage.mouseX,stage.mouseY,true)) { // _mc を非表示にする _mc.visible = false; } } function onGo (event:Event):void { if (_mc.visible) { _mc.x += 1; } } } } //============================ どちらにしても 中学数学の集合のややこしい版みたいですね。。。

関連するQ&A

  • actionscript 3.0 勉強中のもです。

    ある四角の枠状のものを加速をつけて落下させることを意図して入力をしましたが、ただいま以下のプログラミングにおいて「外部からの表示可能な複数の定義は使用できません。」とメッセージを受けました。当方、勉強中にて全くメッセージ内容の見当がつきません。もしご回答、アドバイス等いただけましたら助かります。またプログラムの書き方についても以下でお気づきの点がありましたら、ご指導いただければ幸いです。 よろしくお願い致します。 package{ import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; public class Rakka extends Sprite{ var maru_mc:Sprite = new Sprite; maru_mc.graphic.lineStyle(6,0xee0033) maru_mc.graphic.drawRect(0,0,120,120) var i:int; this.addChild(maru_mc); maru_mc.addEventListener(Event.ENTER_FRAME,goBound); stage.addEventListener(Event.MouseEvent,onEnter); } function onEnter(e:MouseEvent):void{ maru_mc.x = mouseX maru_mc.y = mouseY } function goBound(e:Event){ i = 5; mouse_mc.y = mouse_mc.y +i*y/100 } }

    • ベストアンサー
    • 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
  • ActionScript3.0について質問です。

    ActionScript3.0について質問です。 ムービークリップ(town1)の中にムービークリップ(park)を作成して、その入れ子にしたムービークリップをマウスオーバーしたときにストップをかけたいのですが反応しません。 下のように、parkをクリックしたときにtown1を停止させたく書いてみたのですが、どこが間違っているのか分からずどなたかお力を貸してください! package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; public class komoTown extends Sprite{ public function komoTown(){ town1.park.addEventListener(MouseEvent.MOUSE_OVER,rolloverHandler); } function rolloverHandler(event):void{ town1.stop(); } } } 分かりづらい説明ですみません! よろしくお願いします!!

    • ベストアンサー
    • Flash
  • ActionScript3.0についての質問です。

    ActionScript3.0についての質問です。 ムービークリップAの中に入れ子でムービークリップBを作成し、またその中に入れ子でムービークリップCを作成しました。 そしてこのムービークリップCをクリックできるようにしたいのですがうまくいかないんです。 こんなふうに書いてみたのですがどこが間違っているのか指摘してもらえると嬉しいです。 package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; public class komorebi extends MovieClip{ public function komorebi(){ A.B.C.addEventListener(MouseEvent.CLICK, clickHandler); } function clickHandler(ev:Event){ signBoard.gotoAndPlay("parkUp"); } } } >A.B.C.addEventListener(MouseEvent.CLICK, clickHandler); これがちょっと怪しい気がするのですが、A.B.C ←こういった参照のしかたでよろしいんでしょうか? もし説明不足でしたらまた追記しますので言ってください! すみませんがよろしくお願いします!!

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

  • 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
  • ActionScript3.0の修正に関して

    下記スクリプトは、A_btnをマウスオーバーすると、mcを表示し、 A_btnをマウスアウトすると、mcを非表示にするというスクリプトです。 これのマウスオーバー、マウスアウトを クリックしたら表示し、もう一度クリックしたら非表示にするというものに 変更したいのですが、 単にMouseEvent.CLICKにすると動作しなかったので どなたか教えていただけないでしょうか? よろしくお願いします。 ---------------------- 環境 action script3.0 Mac OSX Flash CS4 ---------------------- var mc:Fukidashi = new Fukidashi(); A_btn.addEventListener(MouseEvent.MOUSE_OVER,xMouseOver); function xMouseOver(evt){ mc.alpha = 0; addChild(mc); mc.x = 0; mc.y = 0; mc.addEventListener(Event.ENTER_FRAME,imgAlpha); function imgAlpha(event:Event){ mc.alpha += 0.05; if (mc.alpha > 1){ mc.removeEventListener(Event.ENTER_FRAME,imgAlpha); } } } A_btn.addEventListener(MouseEvent.MOUSE_OUT,xMouseOut); function xMouseOut(evt){ removeChild(mc); mc.alpha = 0; }

    • ベストアンサー
    • Flash
  • actionscript3.0について教えてください。

    actionscript3.0について教えてください。 Flash CS4で、マウスオーバーすると画像が表示するものを制作しました。 (全レイヤー、1フレーム目のみで制作していました) そして最近その以前制作したものの直前に別のムービーを入れることになり、 画像のように1フレーム目から4フレーム目まであけました。 そしてもともとあったフレームをすべて5フレーム目に移動しました。 すると、エラーが出るようになりました。 5フレーム目に移動するとエラーが出るようになってしまったので、 試しに2フレーム目、3フレーム目など試しましたが同じくエラーが出ました。 エラーの内容は TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 at test_fla::MainTimeline/frame5() です。 下記のスクリプトを上から二つ目のレイヤーに記述しています。 一番上のレイヤーには、stop();と記述しています。 超初心者のため説明不十分かもしれませんが、宜しくお願いいたします。 /*ボタン1 */ nav1txt_mc.visible = false; nav1_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover); function onMouseover(e:MouseEvent):void{ nav1txt_mc.visible = true; nav1txt_mc.gotoAndPlay("nav1txt_mc"); } nav1_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay); function nondisplay(e:MouseEvent):void{ nav1txt_mc.visible = false; } /*ボタン2*/ nav2txt_mc.visible = false; nav2_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover2); function onMouseover2(e:MouseEvent):void{ nav2txt_mc.visible = true; nav2txt_mc.gotoAndPlay("nav2txt_mc"); } nav2_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay2); function nondisplay2(e:MouseEvent):void{ nav2txt_mc.visible = false; } /*ボタン3*/ nav3txt_mc.visible = false; nav3_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover3); function onMouseover3(e:MouseEvent):void{ nav3txt_mc.visible = true; nav3txt_mc.gotoAndPlay("nav3txt_mc"); } nav3_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay3); function nondisplay3(e:MouseEvent):void{ nav3txt_mc.visible = false; } /*ボタン4*/ nav4txt_mc.visible = false; nav4_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover4); function onMouseover4(e:MouseEvent):void{ nav4txt_mc.visible = true; nav4txt_mc.gotoAndPlay("nav4txt_mc"); } nav4_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay4); function nondisplay4(e:MouseEvent):void{ nav4txt_mc.visible = false; } 宜しくお願いいたします。

    • ベストアンサー
    • 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
  • ActionScript3.0についての質問です

    はじめまして。 いまFlash ActionScript3.0を勉強中です。 フルスクリーンについてどうしてもわからないことがありまして 質問させていただきました。 フルスクリーン処理をasファイルで制作中で、 fullscreenボタンを押すとnormalボタンに切り替わる処理ができません。 特にエラーも起きなくて混乱中です。 すいませんがよろしくお願いします。 ※質問内容以外省略。 package { //インポート import flash.display.Sprite; import flash.display.SimpleButton; import flash.display.Stage; import flash.display.StageDisplayState; import flash.events.Event; import flash.events.MouseEvent; import flash.events.FullScreenEvent; [SWF(backgroundColor="#000000", width="600", height="400", frameRate="30")] public class Main extends Sprite { //プロパティ private var fullscreenBtn:Sprite; private var fullscreenBtn1:SimpleButton; private var normalBtn1:SimpleButton; // コンストラクタ public function Main() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; init(); stage.addEventListener(Event.RESIZE, updatePos, false, 0, true); } // メソッド private function init():void { fullscreenBtn = new Sprite(); addChild(fullscreenBtn); fullscreenBtn.y = 6; var fullscreenBtn1 = new FullscreenBtn(); var normalBtn1 = new NormalBtn(); fullscreenBtn.addChild(fullscreenBtn1); fullscreenBtn.addEventListener(MouseEvent.CLICK,btChangeClicHandler); stage.addEventListener(FullScreenEvent.FULL_SCREEN,stageFullScreenHandler); updatePos(null); } //イベント private function updatePos(evt:Event):void { fullscreenBtn.x = stage.stageWidth - 85; } //マウスイベント private function btChangeClicHandler(evt:MouseEvent):void { if (stage.displayState == StageDisplayState.FULL_SCREEN) { stage.displayState = StageDisplayState.NORMAL; } else { stage.displayState = StageDisplayState.FULL_SCREEN; } } //ボタンの切り替え ※この処理がうまくいきません。エラーは起こりません。 private function stageFullScreenHandler(evt:FullScreenEvent):void { if (evt.fullScreen) { fullscreenBtn.removeChild(fullscreenBtn1); fullscreenBtn.addChild(normalBtn1); } else { fullscreenBtn.removeChild(normalBtn1); fullscreenBtn.addChild(fullscreenBtn1); } } } }

    • ベストアンサー
    • Flash