• 締切済み

FLASHでHPのメニュー画面

FLASHを使って、ホームページのメニューを作りたいと思っています。 そこで、SONYのホームページのようにボタンを押すと、メニュー画面がスクロールして表示され、もう一度ボタンを押したらフレームが逆再生されてメニュー画面が消えるようにしたいと思い下記のように作成しました。 (suzuki-_-さんの方法を参考にして作らせていただきました。QNo.2540039) MC1に this.onEnterFrame=function(){ if(aaa%2==0){ this.prevFrame(); }if(aaa%2==1){ this.nextFrame(); } } ボタン1に on(press){ aaa=aaa+1; } としていました。 これでうまく動いていたのですが、ここでボタン2を作り、もう一つ同様のアクションをするものを作ったのですが、この場合MC1が表示されている場合、MC1を引っ込めてから、MC2を実行しようとして、以下のようにしたのですがうまく動作しません。どのようにしたらいいかアドバイスをお願いします。 MC1 this.onEnterFrame=function(){ if(aaa%2==0){ this.prevFrame(); }if(aaa%2==1){ this.nextFrame(); } } ボタン1 on(press){ aaa=aaa+1; if(bbb%2==1){ bbb=bbb+1; } } MC2 this.onEnterFrame=function(){ if(bbb%2==0){ this.prevFrame(); }if(bbb%2==1){ this.nextFrame(); } } ボタン2 on(press){ bbb=bbb+1; if(aaa%2==1){ aaa=aaa+1; } } これをメインのフレームに配置したのですがうまく動作しませんでした。 一応調べてみると、変数は定義したMCの中だけでしか有効ではないらしいということがわかりました。どうすれば、目的の動作が動くか教えていただきたいです。よろしくお願いします。

みんなの回答

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.1

> 一応調べてみると、変数は定義したMCの中だけでしか有効ではないらしいということがわかりました。 定義したMCの中だけで有効なのは、その変数名"のみ"での参照のことです 例えば、MC1(インスタンス名)の中で A = 1; とし、他の階層で B = A としても、Bの中に 1 は代入されません しかし、その変数名"のみ"で呼び出せないだけで、その階層を指定して変数名を呼び出せば代入することができます _root(仕様で決まっている最上階層(名))にMC1が置いてある状態で、MC1の変数Aを呼び出したい場合は _root.MC1.A となります なので、先ほどのBにMC1のAを代入したいならば、 B = _root.MC1.A とすることで、Bに 1 を入れることが出来ます _rootからの指定は、絶対パス(絶対指定)等と呼ばれます 絶対に対して、相対というのも存在します これは、自分の階層から見てのパスです 先ほどのMC1から _root へのパスは _parent( = 一個上階層と覚えると早い)となり、MC1から見た_root.B の相対パスは _parent.B となります _root(ここから見る変数Aは _root.MC1.A or MC1.A or this.MC1.A etc)  ├ 変数B  └ MC1(この中から見る変数Bは_parent.B or _root.B etc)    └変数A // ここからが本題です ちなみに「うまくいきません」というのは質問の際はタブーです 回答側はどううまくいっていないのか(エラー?一部だけ動く?等)わかりませんので。。。 基本的に質問者さんのスクリプトを使用して、前途のパスも使いつつ解決策を記述します ■mc1(プロパティのインスタンス名に付ける名前)の"中"のフレーム1に記述 stop(); this.onEnterFrame = function() { if ((_parent.aaa%2 == 0 || _parent.targetMC != this._name) && _currentframe != 1) { this.prevFrame(); if (_currentframe == 1 && _parent.targetMC != this._name) { _parent.aaa = 1; } } else if (_parent.aaa%2 == 1) { if (_parent.mc2._currentframe == 1 && _parent.targetMC == this._name) { this.nextFrame(); } } }; ■mc2(同上)の中のフレーム1に記述 mc1と同じものを記述して、下から5行目のmc2をmc1に変更 ■ボタン1(インスタンス名は特になし)に記述 on (press) { aaa = aaa%2+1; targetMC = "mc1"; } ■ボタン2(同上)に記述 on (press) { aaa = aaa%2+1; targetMC = "mc2"; } ■ボタン1.ボタン2、mc1、mc2を置いている階層のフレームに記述 aaa = 0; 想定する階層は下記のような感じです _root  ├ mc1  ├ mc2  ├ ボタン1  └ ボタン2 内容は説明するとすごく長くなりそうなので、ヘルプを参照したりして解読しながら進めてみてください //おまけ(ActionScriptに慣れてきたら) ■各配置は一緒 ■ボタン1にbt1というインスタンス名を、ボタン2にはbt2をつける ■全てを置いてある階層のフレームに以下を記述 bt1.onPress = function() { MC_MOVE(this._parent.mc1); }; bt2.onPress = function() { MC_MOVE(this._parent.mc2); }; function MC_MOVE(TARGET) { if (SET_MC == undefined) { TARGET.onEnterFrame = MC_GO; SET_MC = TARGET; TARGET.FLAG = "GO"; } else if (TARGET == SET_MC && TARGET.FLAG != undefined) { switch (TARGET.FLAG) { case "GO" : TARGET.onEnterFrame = MC_BACK; TARGET.FLAG = "BACK"; break; case "BACK" : TARGET.onEnterFrame = MC_GO; TARGET.FLAG = "GO"; break; } } else { SET_MC.onEnterFrame = MC_BACK; SET_MC = TARGET; SET_MC.FLAG = "WAIT"; } } function MC_GO() { this.nextFrame(); if (this._currentframe == this._totalframes) { delete this.onEnterFrame; } } function MC_BACK() { this.prevFrame(); if (this._currentframe == 1) { delete this.onEnterFrame; if (SET_MC != this) { SET_MC.onEnterFrame = MC_GO; SET_MC.FLAG = "GO"; } else { SET_MC = undefined; } this.FLAG = undefined; } } 他は特に記述なし(mc1/2のフレーム1にstop();位)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 逆再生の方法について ActionScript

    FLASH8を使用しています。 FLASHを使って、ホームページのメニューを作りたいと思っています。 そこで、SONYのホームページのようにボタンを押すと、メニュー画面がスクロールして表示され、もう一度ボタンを押したらフレームが逆再生されてメニュー画面が消えるようにしたいのですが、どのようにすればよいでしょうか?? 初心者なりに、prevFrame()を使って頑張ってみたのですが、うまくできませんでした。 aaa=0; if(aaa%2){ nextFrame(); }else{ prevFrame(); } とし、ボタンアクションで on(press){ aaa=aaa+1 } としたらうまくいくかなぁ~と考えてみたのですがうまくいきませんでした(涙)。初心者には荷が重すぎました・・・。 デバッガでエラーはでないのですが、動きませんでした。 もし、「ここはこうしたほうがいい」、「この関数では無理」などアドバイスをお願いします。

  • 3つのムービークリップ再生・巻き戻しの順番制御

    初めまして。 初心者につき、基本的な事だとは思うのですが、調べても分からなかったため、こちらで質問させて頂きたいと思います。 3つのムービークリップ(a_mc,b_mc,c_mc)【フレーム数30】と、 各々を再生させるためのボタン(A,B,C)を使って、 b_mcを再生中にAのボタンを押すと、b_mcを巻き戻した後で、 a_mcを再生するといった感じで3すくみのような状態にしたいのですが、b_mcの巻き戻しとa_mcの再生が同時に行われてしまいます。 現在のActionScriptは以下のようなものなのですが、どなたかご教授願えませんでしょうか? よろしくお願いいたします。 ボタンAのスクリプト on (release) { //Cの巻き戻し _root.c_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //Bの巻き戻し _root.b_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //BでもCでもないときの判別式? //Aの再生 _root.a_mc.onEnterFrame = function() { if (this._currentframe<=29){ this.gotoAndPlay(this._currentframe); delete this.onEnterFrame} } }

    • ベストアンサー
    • Flash
  • onRelease文での動作について・・・。

    ムービークリップをボタンにして、その階層の最初のフレームに this.onRollOver = function() { this.onEnterFrame = this.nextFrame; }; onRelease=function(){ var num:Number=0 onEnterFrame=function(){ trace("LOOP num ="+num) num ++ if(num>30){ delete onEnterFrame } } } stop() 最後のフレームに this.onRollOut = function() { this.onEnterFrame = function() { if (this._currentframe > 1) { this.prevFrame(); } }; }; とした場合について質問です。 ボタン上にカーソルがある場合は30までカウントされます。 しかし、クリック直後にカーソルがボタン上から離れるとカウントが停止します。 ボタンから離れてもカウントを続けるにはどうすればよいでしょうか?? ちなみに、このスクリプトは簡単に流れが分かるように作ったものなのでfor文などではなくonEnterFrame~での対処法を教えて下さい。 実際にはonEnterFrame以下はもっと長くなっているので・・・。 どうかお願いしますっ!!! m(_ _)m

    • ベストアンサー
    • Flash
  • 【actionscript2.0】gotoAndStopが解除されず、ループしてしまいます。

    FLASH CS3、actionscript2.0を使う初心者です。 状況説明をしますと、_rootにMCとボタンを置き、タイムライン上にはラベルが3箇所(1フレーム目にlabel1、2フレーム目にlabel2、3フレーム目にlabel3)あります。 label1に置いてあるボタンを押すと、label2に飛び、label2に置いてあるボタンを押すとlabel3に飛び、label3に置いてあるボタンを押すとlabel1に飛ぶという構造になっています。 label1のボタンにはlabel2へ行くという命令が書いてあります。 label1のMCは単純なアニメーションが再生されます。 label2のボタンには on (press) { _root.image2_mc.bg2_mc.setActive(1); } と記述し、 label2のMC(image2_mc)の中にあるMC(bg2_mc)には onClipEvent (load) { var speed = 10; function setActive (bOn) { bActive = bOn; } } onClipEvent (enterFrame) { _x += speed; if (bActive) { speed *= 0.5; } if (speed < 1) this.stop(); timerID = setInterval(function () { _root.gotoAndStop('label3'); clearInterval(timerID); }, 1000); delete (this.onEnterFrame); } } と記述しました。 label3のボタンには以下のようにlabel1に行くという命令が書いてあります。 on(press){ gotoAndplay('label1') } label3のMCは単純なアニメーションが流れます。 label3のボタンを押すと、一瞬だけlabel1が読み込まれるのですが、 すぐまたlabel3に戻ってしまいます。 label2に書いた「1秒後にlabel3へ行く」という命令がdeleteされず、生きているためにそのような現象になるのかと思い、 delete (this.onEnterFrame); のかわりに this.onEnterFrame = null; を記述しましたが、駄目でした。 原因がわかるかた、説明不足で意味不明な場合は補足いたしますので、教えていただけませんでしょうか。 どうぞ宜しくお願いいたします。

  • 【FLASH】swapDepthsでMCが増殖する??

    FLASH8(Win-XP)使用者です。 MCを最前面にもってくるために myDepth = _root.getNextHighestDepth() _root.myMC.swapDepths(myDepth); を使っていますが、不審な動作が多いため検証実験をしています。 不審点はフレーム逆行時のみMCが複製されているという点です。 以下が私の実験です。 ■実験■ 2フレームを用意し、タイムラインに以下を書き込みます。 <1フレーム目> this.stop(); myDepth = _root.getNextHighestDepth() _root.box.swapDepths(myDepth); _root.button.onRelease = function(){ _root.nextFrame(); } <2フレーム目> this.stop(); myDepth = _root.getNextHighestDepth() _root.box.swapDepths(myDepth); _root.button.onRelease = function(){ _root.prevFrame(); } ※ _root.box は解りやすくするため半透明なMCにします。 ここで2フレーム→1フレームに戻るときのみ box の色が濃くなっていくのがわかると思います。 どんどん複製されているためだと思います。 なぜ複製されてしまうのでしょうか? また回避策はあるのでしょうか? お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • AS2.0 ボタンを押し続けた際の処理

    ボタンを押し続けた際に~する、という処理を実現するため 次のようなスクリプトを作成しました。 //ここから //1フレーム目 mc_hoge.onPress = function() { this.onEnterFrame = function(){ cnt++; if(cnt>=max_cnt) delete this.onEnterFrame; } } mc_hoge.onRelease = function() { delete this.onEnterFrame; if(cnt>=max_cnt) trace("~秒押し続けた際の処理"); else trace("普通のクリックをした際の処理"); cnt = 0; } max_cnt=24;//カウントの上限を設定します。適当に24としました。 cnt = 0;//カウント用変数を初期化 //ここまで onEnterFrameでボタンが押されている間、カウントを続けます。 (ボタンを離すか、上限に達したらonEnterFrrameを削除しています) そのカウントした値でボタンを押し続けたかを判定しています。 ここで、この方法よりも動作に負荷がかからないようにするためには このスクリプトをどのように書き換えればよいでしょうか。

  • アニメーションするロールオーバーにリンクを張りたい

    http://www.geocities.jp/peperon44/peach.html←の様にアニメーションしてリンク先が出てくるロールオーバーを作っています。 http://www.geocities.jp/peperon44/peach.fla←に作っているファイルを置きましたが 一番上の階層にシンボル化したボタンを置き、その下の階層ですべてのフレームアニメーションをさせていますが、1フレーム目に this.stop(); //マウスカーソルがロールインした this.onRollOver = function() { //ロールオーバー開始 rollover = true; }; //マウスカーソルがロールアウトした this.onRollOut = function() { //ロールオーバー終了 rollover = false; }; //フレームが進む度に実行 this.onEnterFrame = function() { if (rollover) { //次のフレームへ進む(最終フレームでは無視される) this.nextFrame(); } else { //手前のフレームに戻る(先頭フレームでは無視される) this.prevFrame(); } }; を入れ大ボタンから出てくる紹介、名前、名簿をそれぞれフレームアニメーションにさせ、シンボル化させて各オブジェクトに on (release) { getURL("name.html", "_foot"); } を入れていますが、指定のURLにリンクがかかりませんのでボタンに反応してくれません。記述が間違っているのか、スクリプトを書く場所を間違えているのだと思います。 このつくりだと一番上の階層に on (release) { getURL("name.html", "_foot"); } と入れると指定のURLにリンクされますが、それでは3つリンク先を分けられないので大ボタンから3つの文字がアニメーションして出てくる意味がありません。大ボタンから出てくる小ボタンにリンクを張るようにしたいです。 FLASHに関してはまだまだの未熟者ゆえ解らないです。何方かお助け下さい。 環境はWindowsXP ソフトはFLASH8です。

    • ベストアンサー
    • Flash
  • ボタンを押してもすぐ戻ってしまう・・・。

    1フレーム目に、 onEnterFrame = function():Void { if (_totalframes == _framesloaded) { gotoAndStop("snap"); } total = _root.getBytesTotal(); loaded = _root.getBytesLoaded(); percent = Math.floor(loaded/total*100); _root.bar_mc._xscale = percent; }; stop(); と記入し2フレーム目のフレームラベルをsnapに。 2フレーム目には、画像と次のフレームにいくボタンが置いてあります。 ボタンには、 on(press){ gotoAndStop(3); } と書いてあるのですが。 このボタンを押すと、確かに3フレーム目にいくのですが、すぐ2フレーム目に戻ってしまうんです。 初めてローディングバーをつけてみたので、間違いだらけかもしれないですがどうすればいいか教えてください><

    • ベストアンサー
    • Flash
  • mcのスクロール

    以下のムービーを作ったのですが動作がおかしいです。 ----------------ステージ------------- | [ボタン]  [photo(mc_0とmc_1)] | ------------------------------------- 【ムービーの説明】 load時:photo(mc)がmcPos[-203]の位置に移動 enterframe:ボタンにmouseoverでそれぞれの座標に移動 ※photoは同じものを二枚重ねて、それぞれにmc_0とmc_1とインスタンス名をつけて、異なるスピードで移動。「//」で斜めにマスクを作っているので、ひとつの写真が斜めにずれながら移動しているように見える 【おかしな動作】 loading動作してない状態(FlashMXで単にCtrl+Enter)した状態だと再生時に「mcPos」の「-203」にphotoは移動するのですが、loadingを動作させると再生時にphotoが移動しない。ボタンにonRollOverしたときには、ちゃんとそれぞれの座標に移動します。ただ再生時に「mcPos」の「-203」に移動しない。 /---rootの1フレーム目(ローディング)---/ this.stop(); defWidth = bar._width; if (getBytesLoaded() == getBytesTotal()) {gotoAndStop("start");} this.onEnterFrame = function(){ per = Math.floor(getBytesLoaded()/getBytesTotal()*100); loading = "Now Loading..."+per+"%"; bar._width = defWidth*(per/100); }; /---rootの2フレーム目---/ this.stop(); mc_0.setMask(mask_0); mc_1.setMask(mask_1); mcPos=new Array(); mcPos=[-203, -589, -1361, 183, -975, -1747]; this.onLoad=function(){a=0;}; this.onEnterFrame = function(){ mc_0._x += (mcPos[a]-mc_0._x)/1.4; mc_1._x += (mcPos[a]-mc_1._x)/2; }; /---rootの2フレーム目(インターフェイス)---/ ボタン(mc)の編集画面 on(rollOver){_root.a = 0;gotoAndStop("top");} on(rollOut){gotoAndStop("out");} on (release, releaseOutside){getURL("index.html");}

    • ベストアンサー
    • Flash
  • swfobject:配置したflash内のボタンをクリックしても反応が無い

    お世話になります。 swfobjectで配置したflash内のボタンが、 マウスオーバーのアクションはしますがその後、クリックしてもリンク先に飛ばずに困っています。 ボタンは以下のような仕組みになっています。 ※配置したムービークリップに、以下のスクリプトを入力してボタンにしています。 onClipEvent (load) { this.stop(); flag = "0"; } on (rollOver) { flag = "1"; } on (rollOut, dragOut) { flag = "2"; } onClipEvent (enterFrame) { if (flag == "0") { this.stop(); } else if (flag == "1") { this.nextFrame(); } else if (flag == "2") { this.prevFrame(); } } on (release) { getURL("http://www.test.com"); } 静止しているボタンのような形のMCにマウスオーバーでアニメーションして(光る等)、 クリックしてリンク先に飛ぶようになっています。 ※swfobjectではなく通常の埋め込み方法では、動作確認済みです。 アニメーションに関係するスクリプトは、この問題に関係ないかとは思いますが、もし何か原因の一つであったらと思い記入致しました。 swfobjectでは、ボタンでリンクするのに何か特殊な事が必要なのでしょうか? それとも、上記スクリプトに何か原因があるのでしょうか? 何か小さな助言だけでも大変助かりますので、 ご存知の方、何卒よろしくお願いします。