- ベストアンサー
ムービークリップをボタンがわりに
flash勉強中のものです。メニューを外部ファイルで作って読み込ませる感じにしています。それで、メニューの1フレーム目に各コンテンツを読み込むためのスクリプトを書き、ボタンがわりに使っているムービークリップにコンテンツを呼び出すスクリプトを書こうとしているのですが、 ボタンオブジェクトに書くときはon(release) { this.contact(); } でメニューの1フレーム目で定義したcontactメソッドを実行することができるのですが、作り込んだボタンにしたかったので後にムービークリップで作り直しました。 ここで未熟者の私はつまずいてしまったのですが、ムービークリップにon(release) { this.contact(); } と同じ動作を与えるにはどんなスクリプトを書けばよろしいのでしょうか? どうかご教授お願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
おそらく、ボタンからムービークリップに変えたら、this.contact という表現で関数 contact が呼び出せなくなった、ということではないかと思います。 結論から書きますと、 on(release) { _parent.contact(); } (↑各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) で、いかがでしょう。 --------------------------------------------- ActionScript は階層の指定にうるさい言語です。 変数や関数、インスタンスを操作する際は、目的のものがどの階層にあるのかを正確に指定しなければなりません。 階層の指定のことをターゲットパスといいます。 ターゲットパスは、自分の持っている変数や関数・インスタンスを操作する時は省略できます。 しかし、他の階層にあるものを使わせてもらうには、その持ち主を指定する必要があります。 厄介なものですが、この仕組みがあるおかげで、同じシンボルから作られた複数のインスタンスが同名の変数などを持っていたとしても、それぞれ別のものとして区別がつき、個別に操作できるのです。 this は、何となくおまじないのように使っているかもしれませんが、this とは自分自身を指す表現です。 例えば、ムービークリップ clip のタイムラインで contact という関数を定義したとしますと、この関数は clip の持ち物になります。 clip に on や onClipEvent を使い、この中で contact を呼び出す場合は、自分自身の持ち物なのでターゲットパスを省略して on(release) { contact(); } もしくは、自分自身を指す this を使い、 on(release) { this.contact(); } として呼び出すことができます。 ところで、ボタンシンボルには特殊なフレームが4つあるだけで、タイムラインがありませんよね。 しかし、contact という関数は、どこかのタイムラインで定義しているかと思います。 ボタンに設定した on で呼び出してはいますが、ボタンの持ち物でないことは確かです。 では、関数 contact は誰が持っているものなのでしょうか? ボタンシンボルはムービークリップとは違い、1つの階層とは見なされません。 ボタンのインスタンスに on アクションを書き、this を使った場合、この this はボタン自身ではなく親の階層、つまりボタンが存在するタイムラインを指します。 例えばステージにあるボタンでしたら、this は _root を指しますから、 this.contact(); この表現ですと、メインのタイムラインで設定した関数 contact を呼び出していることになります。 ボタンをムービークリップに変えると、そのボタンは1つの階層として見なされるようになります。 this は親ではなく自分自身を指すようになりますので、this では親のタイムラインにある関数を指定できません。 子から親の階層を指す相対的な表現として、_parent という書き方があります。 ムービークリップになったこのボタンから、親のタイムラインにある contact を呼び出すには、 _parent.contact(); このような表現になります。 ターゲットパスを自動で入力してくれる機能があります。 Flash MX 以降をお使いの場合は、「アクション」パネルの上部にアイコンが7つほど並んでいるかと思います。 このうちの中央のアイコンが、ターゲットパスを自動で入力してくれる機能になっています。 ターゲットパスがよく分からない時は、利用してみてください。
その他の回答 (1)
- kai123
- ベストアンサー率53% (88/163)
えっと・・・ ムービークリップシンボルでも on (release){} などが使えると思いますが。動かないんでしょうか? 他のやり方としては、 onClipEvent (load) { this.onRelease = function() { マウスの左ボタンが押されて、離されたときに実行される内容 }; } というやり方があります。 (対象のムービークリップに記述) クリックではなく「押したときに」という動作の on(press){} の場合、 onClipEvent (load) { this.onPress = function() { マウスの左ボタンが押されたときに実行される内容 }; } とやればできます。(ただし、flash player 6以上) onClipEvent (load) {}とは、これが記述されている シンボルがロードされたときに読み込まれるっていう意味です。
お礼
ご丁寧にありがとうございます。 メインステージに空のムービークリップを作ってそこに読み込ませようとしているのですが、ボタンオブジェクトにon(release) { this.contact(); } を記述すると読み込むのですが、ムービーオブジェクトに記述すると読み込まないのです。 onClipEvent (load) を試してみます。取り急ぎのお礼 でした。結果がわかり次第またご報告いたします。
補足
onClipEvent (load) { this.onRelease = function() { _parent.contact(); }; } と記述したら読み込めました! なんかいまいち_parent、_rootがわからないです。 ポイントなどございましたら教えていただきたいのですが。
お礼
ものすごく勉強になりました!!! それとDPE様のおっしゃる通りに記述したら動きました !!!! ターゲットパスは書籍で簡単な参考図などをみてなんとなく理解したつもりでいたのですが、オブジェクトが増えてくると???になってしまって、、、 ターゲットパスってすごく重要なものだと思い知らせれました。 また何かありましたときにはよろしくお願いいたします。本当にありがとうございました。