- ベストアンサー
flashcs4 as3.0でエラーが発生!エラーの回避方法は?
- フレーム1に配置されたボタンを押すと、ボタンが消えてマウスがmc表示に変わり、mcをドラッグしてmc1に当たるとフレーム2の画面が表示されるようにしたいです。
- ムービープレビューを試してみると、ボタンが消えてマウスカーソルが変わるものの、フレーム2の画面は表示されずに「TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」というエラーが表示されます。
- このエラーを回避するためには、コードの修正が必要です。具体的には、イベントリスナーの設定やnullのオブジェクト参照のチェックなどを行うと良いでしょう。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> フレーム2の画面(TツールでCLEARを書いているだけ) ということでしたら フレーム2 には「mc」も「mc1」も「myb」も存在しないわけですよね。 そうでしたら 「mc」や「mc1」や「myb」を参照するイベントリスナーは全て削除しておかなかればダメでしょう。 つまり具体的には, 書かれていらっしゃるスクリプトの原型をなるべく変えない形で書くとすれば 最後の function ↓ function mymc(e:Event):void{ if(mc1.hitTestObject(mc)){ gotoAndStop(2); } これを次↓のように変更する必要があります。 function mymc(e:Event):void { if (mc1.hitTestObject(mc)) { //↓きれいに掃除をしてから myb.stage.removeEventListener(MouseEvent.CLICK, mystart); mc.stage.removeEventListener(MouseEvent.MOUSE_MOVE,mymouse); mc.stage.removeEventListener(Event.ENTER_FRAME,mymc); //↓フレーム2 で停止 gotoAndStop(2); } } イベントリスナーはすべて削除してから 何もないフレーム2へ gotoAndStop です。 本題は,一応以上です。 ===その他===================================== 本題と関係ないと言えば関係ないことですが, (関係あると言えば関係あることですが,) myb.stage.addEventListener(MouseEvent.CLICK, mystart); とか mc.stage.addEventListener(…略…); のように書かれていること自体が そもそも変ではないでしょうか。 特に myb.stage.addEventListener(MouseEvent.CLICK, mystart); は変だと思います。 これだと「myb」など関係なくて ステージ上のどこをクリックしても関数 mystart が実行されてしまいます。 「myb」をクリックしたときに「myb」が消えて 同時にマウスが「mc」表示に変わるようにさせるのでしたら, myb.addEventListener(MouseEvent.CLICK, mystart); です。 さらにまた, 上の部分を書き換えたとしても 「myb」をクリックする前であっても マウスを適当に動かしていると マウス(mc) が「mc1」に当たって わけもわからないまま勝手に「CLEAR」になってしまう(フレーム2に行ってしまう)ことがあります。 そんなこんなを考えて スクリプト全体を書き替えると次のようになります。 //------------------------------- stop(); mc.visible=false; //↓「myb」に対して addEventListener をする myb.addEventListener(MouseEvent.CLICK, mystart); function mystart(e:MouseEvent):void { myb.visible=false; Mouse.hide(); mc.visible=true; //↓ココで addEventListener しないと勝手に「CLEAR」になる stage.addEventListener(MouseEvent.MOUSE_MOVE,mymouse); stage.addEventListener(Event.ENTER_FRAME,mymc); } function mymouse(e:MouseEvent):void { mc.x=stage.mouseX; mc.y=stage.mouseY; e.updateAfterEvent(); } function mymc(e:Event):void { if (mc1.hitTestObject(mc)) { //↓きれいに掃除をしてから myb.removeEventListener(MouseEvent.CLICK, mystart); stage.removeEventListener(MouseEvent.MOUSE_MOVE,mymouse); stage.removeEventListener(Event.ENTER_FRAME,mymc); //↓フレーム2 で停止 gotoAndStop(2); } } //-------------------------------
お礼
BlurFiltan様 ご教示ありがとうございます。 おかげさまですべて解決できました。 変な動きが確かにありましたので 原因がわかり大変助かりました。 生半可な知識ではやっぱり駄目ですね。 これからもよろしくお願いいたします。 感謝です♪