- 締切済み
ActionScript3.0フレーム移動について
お世話になります。 Flash ActionScript3.0で、ボタンをクリックしたら、 階層違いのシーンに移動するという 単純なところでつまずいています。 一番上の階層には、 1フレーム目 フレームラベル "a" 2フレーム目 フレームラベル "b" として、それぞれ this.stop();を書いてあります。 "a""b"には、それぞれムービークリップが配置してあって、 今やりたいことは、"a"に配置してあるムービークリップの 2つ下(中?)の階層にあるボタンをクリックしたら、一番上の階層の"b"に移動して、 "b"に配置してあるムービークリップを表示するようにしたいのです。 "a"のムービークリップのボタンのあるフレームには、 this.stop(); button01.addEventListener(MouseEvent.CLICK,jumpB); function jumpB(event:MouseEvent):void { MovieClip(parent.parent).gotoAndStop("b"); } と書いてみましたが、 [TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。] と怒られます。 試しに MovieClip(stage).gotoAndStop("b"); とか、"b"に配置してあるムービークリップにインスタンス名"b_mc"を与えて MovieClip(parent.parent).b_mc.play(); などと苦し紛れにやってみましたが、すべて同じように怒られます。 どのようにすれば、下の階層から一番上の階層の別フレームに 移動することができますでしょうか? よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- webwebwebweb
- ベストアンサー率0% (0/1)
基本的にASはターゲットや変数が存在しないと、 存在しないと警告が出る仕様です。 よって > もし、gotoAndStop("b")にジャンプさせるのに、 > その"b"に配置してあるmcの、特定のフレーム、 > (5)とか(10)、あるいは、ラベル"go"などに > ジャンプしたい場合は、どのように指定すれば、 > 良いのでしょうか? このようなことを実現したい場合、 bと記述したフレームと同じフレーム(キーフレーム)に誰を動かすかを書きます。 例えば以下のようなフレームの構造だった場合 [a ][b ] ↓ レイヤーを一個追加し以下のような感じにします。 [。 ][。 ]←レイヤーを追加し、キーフレームを置きました。 [a ][b ] ↓ さらにbのキーフレームの直上にあるフレームに後述のようなコードを書きます。 [。 ][α ] [a ][b ] //コード this.mc.gotoAndStop(5); ↓ また任意で5フレーム目や10フレーム目など切り替えたい場合は 以下のようにbを動かすボタンから、rootに変数を渡し動かします。 [α ]←レイヤーを追加し後述のASを記述します。 [。 ][α ] [a ][b ] //一番上のレイヤーには以下のようなコードを書きます。 this.b_frame_number; //bを動かすコードが書かれている部分には以下のようにコードを追加します。 MovieClip(root).gotoAndStop("b");//bを動かすコード MovieClip(root).b_frame_number = 10;//←このように追加 こうすることで、ルートのb_frame_numberがあらかじめ定義されていますので エラーも出ませんし、数字や文字列を渡すことができます。
- BlurFiltan
- ベストアンサー率91% (1611/1754)
う~ん??? 書かれていらっしゃる通りにしても > [TypeError: Error #1009: null のオブジェクト参照の > プロパティまたはメソッドにアクセスすることはできません。] などというエラーメッセージは出ませんけどね。 もちろん 書かれていらしゃるスクリプトは間違っているのですが それとは別問題でそのようなエラーメッセージはでません。 書かれていらっしゃるようなエラーメッセージが出るのは 主にインスタンスが無かったときです。 具体的には 「button01」がそのスクリプトを書いたタイムラインのフレームに存在しない場合などにでます。 > "a"のムービークリップのボタンのあるフレームには、 と書かれていらっしゃいますが これは メインタイムライン の フレーム1(フレームラベル「a」と命名) に ムービークリップが置いてあって そのムービークリップ内のフレームにスクリプトを書いたという意味ですよね? そしてそのフレームには 確かに「button01」というインスタンス名を手動で付けたボタンがあるのですよね? ※【図】↓参照のこと。 その場合は次のようなエラーメッセージが出ます。 > TypeError: Error #1034: 強制型変換に失敗しました。 > flash.display::Stage@23a95b51 を > flash.display.MovieClip に変換できません。 このエラーメッセージの内容は簡単なことで 「parent.parent は MovieClip に変換できないよ!」 つまり 「stage は MovieClip に変換できないよ!」 という意味です。 そもそもパスが間違っています。 私が書いた上記のエラーメッセージを出ないようにする, つまりちゃんとしたパスにするには スクリプトを次のようにする必要があります。 //--------------------------------------- this.stop(); button01.addEventListener(MouseEvent.CLICK,jumpB); function jumpB(event:MouseEvent):void { MovieClip(parent).gotoAndStop("b"); } //--------------------------------------- つまり 書かれていらっしゃる MovieClip(parent.parent).gotoAndStop("b"); や MovieClip(stage).gotoAndStop("b"); ではなく MovieClip(parent).gotoAndStop("b"); のようにすべきだという意味です。 もっとも MovieClip(parent).gotoAndStop("b"); だけではなく MovieClip(this.parent).gotoAndStop("b"); としても良いですし, また絶対パスで書くならこうです↓。 MovieClip(root).gotoAndStop("b"); さらに stage まで遡りたい場合はこうです↓。 MovieClip(stage.getChildAt(0)).gotoAndStop("b"); ターゲットパスがそもそも間違っているというのも確かですが その前にご質問のようなエラーメッセージが出ること自体がかなり不可解です。 ※ CS3 辺りでそのような(似たような)不具合が起こることが あることは聞いたことがある気がします。 ※当方は,一応 CS4 にて検証しました。
お礼
BlurFiltanさま 丁寧にご回答いただき、ありがとうございました。 自分のめちゃくちゃなスクリプトに、失笑致しました。 MovieClip(root).gotoAndStop("b"); で、確かに問題なく動きます。 ありがとうございます! ただ、いろいろやってみましたところ(もちろん、まずこのめちゃくちゃなスクリプトを直しました)、構造が簡単ですと、このエラーメッセージが出ず、ボタンをmcの中に入れて、そこにまたスクリプトを書くというように、若干複雑にしていくと、どこかのタイミングでこのメッセージが、出るようになることがわかりました。 どこかがオカシイのでしょうね。 あと、ボタンが1フレーム目にあり、スクリプトも1フレームにあればエラーメッセージが出ず、1フレーム以外のフレームに配置してあると出るということもありましたので、その場合は、ダミーのボタンを1フレーム目において不可視にして、スクリプトを書いておくと、エラーメッセージが出ませんでした。 しかしながら、一々、ダミーを置くのに疲れまして、CS4で作業していますが、パブリッシュを flash player 9 にすると出なくなるので、今は、それで逃げております。 階層構造の勉強を、きちんと致します。 ありがとうございました。
補足
お礼を書いたあとに、書き足そうと思いましたら、もう出来ませんでしたので、こちらに書かせて頂きます。 もう一つ、気がついたのは、player9でパブリッシュしても、swfをplayerで見ると、エラーが出るのですが、「却下」をクリックすると、先に進めます。 そして、なぜか、一緒にパブリッシュされたhtmlを使って、ブラウザーで確認すると、すべて問題なく動きます。 パブリッシュされたhtmlで、なにか問題を解消するようなスクリプトが書かれているのでしょうか。 謎が多いです。 (すみません、お礼のつもりが、また長くなり恐縮です)
- webwebwebweb
- ベストアンサー率0% (0/1)
こんにちわ。 function jumpB(event:MouseEvent):void { MovieClip(parent.parent).gotoAndStop("b"); } この時、引数のeventのtargetプロパティにはbutton01のパスが格納されています。 function jumpB(event:MouseEvent):void { MovieClip(event.target.parent.parent).gotoAndStop("b"); } としたら動くかもしれないです。 あと動かない時に検証する方法のひとつとして、 function jumpB(event:MouseEvent):void { MovieClip(parent.parent).gotoAndStop("b"); trace("ターゲットは誰? → "+event.target); trace("フレームを動かしたい人はこの人? → "+event.target.parent.parent); } こんな感じにするとパスが見れますので 把握しやすくなりますよ。
お礼
ありがとうございました。 そろそろ質問を締切ろうと思いますが、みなさんのご回答が、それぞれ大変助けになりましたので、ベストアンサーを選ばずに示させて頂きます、ありがとうございました。
補足
webwebwebwebさん ありがとうございます。ターゲットを検証する方法、すばらしいです。 ターゲットが出ました。これを活用させて頂きます。 ところで、重ねて、ここでお伺いしてしまうのは、大変恐縮なのですが、もし、gotoAndStop("b")にジャンプさせるのに、その"b"に配置してあるmcの、特定のフレーム、(5)とか(10)、あるいは、ラベル"go"などにジャンプしたい場合は、どのように指定すれば、良いのでしょうか?
お礼
ありがとうございました。 そろそろ質問を締切ろうと思いますが、みなさんのご回答が、それぞれ大変助けになりましたので、ベストアンサーを選ばずに示させて頂きます、ありがとうございました。
補足
くわしくありがとうございました。 返信が遅くなって失礼しました。 検証に時間が掛かってしまいました。 書いてくださった「任意で5フレーム目や10フレーム目など切り替えたい場合」というのが、まさに今回やりたいことなのです。 それで、私がきちんと理解していないようなのですが、 [α ] [。 ][α ] [a ][b ] すみません、これを理解できなくて・・・。 この図は、 [α ]← ここがルート [。 ][α ]← ルートに配置されたmcの中のフレーム名 [a ][b ]← [。 ]にはmc[a ]を配置 [α ]にはmc[b ]を配置 という理解で良いのでしょうか? この構造で、[。 ]に配置してあるmc[a ]にある、 ボタン(例えばbuttonA)をクリックしたら [α ]に移動し、配置されているmc[b ]の フレーム10に移動するというようにしたい場合 [α ]←this.b_frame_number; [。 ] ↑ buttonA.addEventListener(MouseEvent.CLICK,jump_b); function jump_b(event:MouseEvent):void { MovieClip(root).gotoAndStop("α"); MovieClip(root).b_frame_number = 10; } を記述するということでしょうか? けれどもルートには、移動させたいフレーム[α ]は 存在しないので、 function jump_b(event:MouseEvent):void { MovieClip(parent).gotoAndStop("α"); MovieClip(root).b_frame_number = 10; } ではないでしょうか(ぐるぐる)? と言いつつ、結局どちらでもうまくいかず詰まっています。 フレームは移動するのですが、目的の10フレームには 飛ばないのです。 また、もう一つ分からないのは、 mc[a ]にある、ボタンbuttonAをクリックして [α ]に移動したとしても、そこにmc[b ]以外にも いくつかmcが配置されている場合に、 移動先が、mc[b ]の10フレーム目だ、ということは どこで分からせてあげているのでしょうか? せっかく教えて頂いているのに、わからなくて申し訳ないです。 もし、お時間ありましたら、よろしくお願い致します。