• ベストアンサー

ActionScriptでボタンをクリックしたときの動作をまとめて指定したい

FlashMX2004で、メニューを作成しています。 ボタンの数が多いことから、いちいち一個ずつのボタンにクリックしたときの動作(getURL)を指定するのが大変なので、一番最初のフレームにActionScriptで指定したいのです。 確か、以前そういうのをやった記憶があるのですが、 とても急いでいるので調べる時間がありません。 複数のボタンが、一番上の階層にあるもの(メインメニュー)と、ムービークリップ内に配置したサブメニューと様々あります。 それぞれの指定の仕方を教えてください。 よろしくお願いします。

  • Flash
  • 回答数1
  • ありがとう数4

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

on*** というイベントハンドラを使うと、ムービークリップやボタンが押された時のアクションをフレームでも定義しておくことができます。 例えば、ムービークリップのインスタンス clip が押された時に、新しいウィンドウを開いてページを表示するスクリプトは、  clip.onPress = function ()  {   getURL( "***.html" , "_blank" );  }; (↑このスクリプトをコピーする場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください) この書き方であれば、複数のムービークリップやボタンへの指示を、1箇所でまとめて定義できます。インスタンスがボタンの場合でも利用できますし、ムービークリップ内のムービークリップやボタンの場合は、ターゲットパスを付けると、メインのタイムラインからでも指定できます。 (できますが、パスが複雑になる場合は、ムービークリップ内のタイムラインで指定する方がオススメです) ただし、関数を定義する時点で、該当するムービークリップやボタンがタイムラインに登場していることが条件になります。 例えば、フレーム2で登場する clip2 というムービークリップの onPress ハンドラは、フレーム1では利用できません。定義してもエラーにはなりませんが、無効です。 対象が多い場合は、効率よくさばける方法を工夫しましょう。 1箇所でまとめて定義できるとはいえ、ボタンの数だけスクリプトを書くのは面倒です。コピー&ペーストで少しずつ変更しても、些細な間違いなどもあるかも知れません。 eval というアクションは、ムービークリップやボタンの名前を文字列で渡して、操作できるアクションです。 例えば、  eval( "clip" ).onPress = function () ・・・ このような使い方もできますし、変数を利用して  eval( "clip" + i ).onPress = function () ・・・ とすると、ループを利用して大量のムービークリップへの指示もコンパクトに済ませることができます。 コンポーネントというと、Flash に最初から付属している UI コンポーネントが有名ですが、自分で作ることもできます。 UI コンポーネントに、高機能だけど複雑で難しいというイメージがあるせいか、コンポーネントは高度で難しいもののように見えますが、自分の作品の中で個人的に使うなら、それほど難しいものではありません。上手く利用すると、とても便利な機能です。 コンポーネントの正体は、パラメータを持つムービークリップです。ムービークリップとして作ったものに、「コンポーネント定義」(ライブラリでシンボルを選び、右クリック/ Mac では control +クリック で出すメニューの中にあります)でパラメータを定義すると、コンポーネントになります。 「パラメータの定義」パネルでの基本操作は、「+」ボタンでパラメータの追加、「-」ボタンで削除です。すべてのパラメータを削除すると、コンポーネントはムービークリップに戻ります。 さしあたって必要な各項目の内容は次の通りです。  ・名前  「パラメータ」のタブで表示される、パラメータの名前。分かりやすい名前を付けておきましょう。  ・変数  「パラメータ」の実体となる、変数の名前。ActionScript では、 インスタンス名.ここで定義した変数名 という形で、パラメータを利用します。  ・値  パラメータの初期値です。  ・タイプ  パラメータのデータの型。よく使われるのは、Boolean( true / false )・String(文字列)・Number(数値)・Array(配列)など。   例えば、clip のシンボルに url というパラメータ(変数)を定義すると、clip から作られたインスタンスは、全て url というパラメータを持ちます。 コンポーネントの持つパラメータは、編集画面で「プロパティ」の右上にある、「パラメータ」のタブで編集できます。 つまり、ActionScript を直接いじらなくても、各インスタンスの持つ url という変数にそれぞれ好きな値や文字列を設定できるということで、これはコンポーネントの大きな利点です。 同じシンボルからインスタンスを作らない場合でも、ボタンとして使うシンボル全てに「 url 」という同じ名前のパラメータを指定しておき、インスタンス名を「 clip1 」「 clip2 」のように通し番号で付けると、先述の eval アクションと合わせて、次のように一気に移動先を定義することも可能です。  for( i = 1 ; i <= 10 ; i++ )  {   //clip1~10がクリックされた時の動作を定義   eval( "clip" + i ).onPress = function ()   {    //パラメータで持つURLに移動    getURL( this.url , "_blank" );   };  } 10 個分のムービークリップの移動先が、これだけで指定できてしまうというわけです。極端な話、ムービークリップが 20 個でも 50 個でも、指定に必要なアクションはこれだけで済みます。 コンポーネントのパラメータであれば、URLの編集はムービーの編集画面でできます。配置されているボタンの実物を見ながらの編集も可能ですから、「アクション」のウィンドウで編集するよりも間違いもしにくくなりますし、訂正するのも簡単です。 お急ぎのようですので、今回は名前を付け直したりコンポーネントにするなどの余裕はないかも知れませんが、何かの折にはぜひお試しください。 長くなってすみませんでした。 不明な点がありましたら、補足してください。

関連するQ&A

  • 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(); などと苦し紛れにやってみましたが、すべて同じように怒られます。 どのようにすれば、下の階層から一番上の階層の別フレームに 移動することができますでしょうか? よろしくお願い致します。

  • ボタンによるムービークリップ移動

    flashmx2004/actionscript2.0です。 ボタンにrollOverすると、別の場所にあるムービークリップが所定の位置まで移動する、と言う動きをさせたいと思っています。 ムービークリップがMC1としますと、単純にボタンに MC1._x=0; MC1._y=0; と指定したらその位置に移動はしますが、これのように瞬時に移動ではなく、動きがわかる程度のスピードで動くようにしたいのです。 イメージとしましては画像の上にシャッターのように次の画像が来る形にしたいのです。 フレームをあまり使わず、可能であればボタン1個で動作させたいのですが、どうにも手詰まりです。 ご教授戴ければ幸いです。

    • ベストアンサー
    • Flash
  • ActionScript2.0

    actionscript2.0で作成をしている初心者です 今、ドラッグが可能なムービークリップを作成し、 その下の階層にボタンを作成しています。 onClipEvent (enterFrame){ this.onPress = function(){ドラッグ開始} this.onRelease = function(){ドラッグ終了} this.button1.onPress = function(){ボタン押した処理} [現状] ムービークリップをドラッグ不可能にすれば、ボタンを押すことは可能なのですが、ドラッグ可能にするとボタンが押せなくなります。 ムービークリップのドラッグが可能で、かつムービークリップ階層下のボタンを有効にするためにはどうしたらよいでしょうか。 宜しくお願いします

  • ActionScriptで、押したボタンの判別方法を教えてください。

    ActionScriptで、押したボタンの判別方法を教えてください。 ActionScript3.0で作成しています。 6フレームの【oya_mc】というムービークリップの各フレームに フレーム1ラベル[m1]に【ko1_mc】 フレーム2ラベル[m2]に【ko2_mc】 フレーム3ラベル[m3]に【ko3_mc】 フレーム4ラベル[m4]に【ko4_mc】 フレーム5ラベル[m5]に【ko5_mc】 フレーム6ラベル[m6]に【ko6_mc】 というムービークリップを配置しています。 配置しているムービークリップには、それぞれ6個のボタンを呼び出して配置しています。 【btn1】【btn2】【btn3】【btn4】【btn5】【btn6】 【btn3】を押したときに【oya_mc】を3フレーム目に移動。 【btn6】を押したときに【oya_mc】を6フレーム目に移動。 というようにしたいのですが、なかなかうまくいきません。 FLASH初心者ですが、どうかご指導よろしくお願いします。 【ko1_mc】に書いたスクリプトを抜粋して書きます。 ------- for(var i:int = 1; i <= 6; i++){ this["btn" + i].addEventListener(MouseEvent.CLICK,Down); function Down(mo:Event):void{ MovieClip(parent).gotoAndPlay("m"+i); } } ------- よろしくお願いします。

    • ベストアンサー
    • Flash
  • Flash フレームを指定してムービークリップ再生

    ActionScript超初心者です。 よろしくお願いします。 ステージ上にボタン「A」「B」「C」を配置、 ボタン脇のスペースにムービークリップを配置、各ボタンで切り替え再生させたいと思っています。 2フレーム目に簡単なアニメーションのムービークリップ「animA」を、 3フレーム目に同様の「animB」4フレーム目に「animC」を配置し、 各ボタンon (release)で各ムービークリップの再生をしたいのですが うまくいきません。 どこにどのようなスクリプトを書けば良いか教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • Flash CS4 + ActionScript 3.0 で swf

    Flash CS4 + ActionScript 3.0 で swf ファイルを作成しました。 メインのタイムラインの 1 フレーム目に ActionScript で stop(); を 指定したのですが、swf 単体で再生(Adobe Flash Player 10で再生)して 確認したところでは問題なく 1 フレーム目で停止しますが、 swf を HTML に配置してブラウザで確認したところ、 ロード時にはメインのタイムラインがすべて再生されてしまいます。 これについての対処法はあるのでしょうか? 自分なりの調べて見つけた方法としては、 ↓こんな感じだったのですが、根本解決ではない気がするので、  何か良い方法があれば、教えてください。よろしくお願いします。 ・外部ファイルを読み込むだけの swf を作って、  実際に再生したい swf を UILoader に読み込む ・全部ムービークリップに入れてしまって、  メインのタイムラインには、そのムービークリップだけ配置する

    • ベストアンサー
    • Flash
  • flashの基本的なことが理解出来ません。

    windowsXPで、FlashMXを始めたばかりの初心者です。 ActionScriptを始めようと、何冊かの参考書を読み始めましたが、 一番最初に書かれている、フレーム、ムービークリップ、ボタンアクションの、 特に、フレームとムービークリップのアクションの違いがよく解りません。 どういう時に、フレームアクションを書くのか・・・良く理解出来ません。 何かに例えて、教えていただけませんでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Flash
  • Flashでボタンをつくっているのですが、actionscriptをつ

    Flashでボタンをつくっているのですが、actionscriptをつかってボタンをクリックさせたいのですが、アクションパネルのところに「現在の選択範囲にアクションを割り当てることはできません。」と表示されてしまいます。 参考書に附属されているflaをみたところ、Actionscript1.0、2.0となっているのですが、作成しているのはActionscript3.0で作っています。 ====== on (release) { /*↑ボタンが押されて離されたら*/ _parent.gotoAndPlay("about"); /*↑「about」ラベルへ移動*/ } ====== このようなscriptをいれたいのですが、うまくいきません。 ムービークリップでボタンを作るまではできました。その後、何かが抜けているのかして上記のようなエラーがでます。 flash初心者のため、どういう風に書いて質問させていただいたらよいのかわからないのですが、参考flaと見比べたときに「シンボル定義」のなかにあるムービークリップがひとつたりませんでした。(このムービークリップは「navigation」というものですのでそれがありません。) 質問するにはあまりにも情報が少ないかもわかりませんが、何卒ご教授いただけると大変助かります。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • サブメニューにカーソルが乗っている間もメニューボタンの色を変えたい

    FlashMX使用です。 メニューボタンにカーソルを乗せるとサブメニューボタンを表示、 メニューボタンまたはサブメニューボタンからロールアウトするとサブメニューボタンを非表示 というFlashを作成中です。 サブメニューボタンの表示、非表示は_visibleを使用しています。 サブメニューにカーソルが乗っている時、メニューボタンをオーバーの状態にしたいのですが、方法がわかりません。 調べてみたところ、フレームを切り替えて色を変えているものは発見できました。 actionscriptを使用して1フレーム内でする方法はないのでしょうか? アドバイスお願い致します。

    • ベストアンサー
    • Flash
  • ムービークリップをボタンがわりに

    flash勉強中のものです。メニューを外部ファイルで作って読み込ませる感じにしています。それで、メニューの1フレーム目に各コンテンツを読み込むためのスクリプトを書き、ボタンがわりに使っているムービークリップにコンテンツを呼び出すスクリプトを書こうとしているのですが、 ボタンオブジェクトに書くときはon(release) { this.contact();   } でメニューの1フレーム目で定義したcontactメソッドを実行することができるのですが、作り込んだボタンにしたかったので後にムービークリップで作り直しました。 ここで未熟者の私はつまずいてしまったのですが、ムービークリップにon(release) { this.contact(); } と同じ動作を与えるにはどんなスクリプトを書けばよろしいのでしょうか? どうかご教授お願いいたします。

    • ベストアンサー
    • Flash

専門家に質問してみよう