• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ポップアップを一定時間、またはマウスが乗っている間表示させておく)

ポップアップを一定時間、またはマウスが乗っている間表示させておく

このQ&Aのポイント
  • ポップアップを一定時間、またはマウスが乗っている間表示する方法を教えてください。
  • エリアにマウスをのせるとポップアップウィンドウが表示され、ボタンをクリックして外部swfを読み込む仕組みを作りたいです。
  • エリアから外れても一定時間ポップアップを表示されたままにしたい方法と、ポップアップにマウスがのっている間は表示させておく方法を教えてください。

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1 です。 > どうしても質問に書いたスクリプトでやりたいということでは > 全くありませんので、他にもっといい方法がありましたら > ぜひ教えていただけると助かります。 いえ,これと言って良い方法というのは具体的にはないのです。 またムービーの構造(階層構造や位置関係など)がわからないので, よく考えると, 他のバージョンでもどれが良いかはわからないということに #1 を書いた後に気づきました。 ただ, ご質問のスクリプトや#1で書いたスクリプトでは, 1フレーム進む時間ごとに毎回ずっとマウスの位置を調べていて その結果 1フレーム進む時間ごとに毎回ずっと popup を表示または非表示させるという命令を出し続けるていることにすごく抵抗を感じるのです。 つまり 「すっと無駄な命令をし続けてCPUの無駄づかいだなぁ」 と思うのです。 Flash MX(Flash Player 6)以降では, ムービークリップにも on(rollOver) や onRollOver などが使えます。 また, Flash MX(Flash Player 6)以降では, setInterval が使えますから,これで ○秒おきに何かをさせることができます。 また, Flash 8 ※注↓ (Flash Player 8)以降では, setTimeout が使えますから,これで ○秒後に何かをさせることができます。 ※注  一応 setTimeout が使えるのは  無難に Flash 8 であると書きましたが  おそらく Flash MX でも使えると思います。  ただし プレビューしたり閲覧するFlashPlayerのバージョンは  Flash Player 8 以降である必要があります。 そんなこんなで, 絶対にこれが良いと言うわけではありませんが,  Flash 8 だと次のようにするのが普通かな? という例を書きます。 まずスクリプトを書いたエリアのムービークリップのスクリプトを全部消して, そのエリアのムービークリップにインスタンス名を付けます。 たとえば 「area_mc」 というインスタンス名を付けることにしておきます。 そして, ムービークリップ「popup」や「area_mc」が存在するフレームに, たとえば _root のフレーム1に次のようなスクリプトを書きます。 ------------------------------------- // 「popup」を非表示にする _root.popup._visible = false; // 「area_mc」にロールオーバーしたときの動作を定義 _root.area_mc.onRollOver = function() { // 「popup」を表示する _root.popup._visible = true; // セットした setTimeout を削除 clearTimeout(myID); }; // 「area_mc」からマウスをはずしたときの動作を定義 _root.area_mc.onRollOut = _root.area_mc.onDragOut=function () { // setTimeoutをセット myID = setTimeout(function () { // 「popup」を非表示にする _root.popup._visible = false; // 1000ミリ秒(1秒)遅延して実行 }, 1000); }; ------------------------------------- 必ずしもこれが良いとは限りません。 状況によっては使えないかもしれませんが, 「Flash 8 で普通に考えるなら,まずこんな感じにするかなあ。」 という例です。 ちなみに Flash 8 とは言っても ActionScript のバージョンは ActionScript1.0 のままです。 また,ボタン機能が重なるなど, 何かの理由で hitTest を使わなければならない場合で, なるべく無駄な命令をなくそうと思えば次のようになるかもしれません。 ------------------------------------- // 「popup」を非表示にする _root.popup._visible = false; // 「area_mc」 に対するロールオーバーのフラグを用意 area_flg = false; // マウスを監視するためのインスタンス「mouse_obj」を作成 mouse_obj = new Object(); // マウスが動いたときの動作を定義 mouse_obj.onMouseMove = function() { // もし 「area_mc」 がマウスとヒットして area_flg が false であれば if (_root.area_mc.hitTest(_root._xmouse, _root._ymouse, 1)) { // area_flg が false であれば if (!area_flg) { // セットした setTimeout を削除 clearTimeout(myID); // area_flg を true にする area_flg = true; // 「popup」 を表示する _root.popup._visible = true; } } else if (area_flg) { // setTimeoutをセット myID = setTimeout(function () { // 「popup」を非表示にする _root.popup._visible = false; // 1000ミリ秒(1秒)遅延して実行 }, 1000); // area_flg を false にする area_flg = false; } }; // 「mouse_obj」をMouseクラスのリスナーとして登録 Mouse.addListener(mouse_obj); ------------------------------------- やたらややこしくなってしまいましたね...。 ================== あと思ったのが, 作成しようとされているものは, ボタンをクリックすると外部swfを読み込むという仕組みの 「ポップアップウィンドウ」 のようなものですよね? そういったものは,黄色い 「ポップヒント」 とは違って, 「OK」や「キャンセル」や「×」ボタンなどがクリックされるまで普通出っぱなしになっていませんでしょうか? そういったものは,ふつう出っぱなしになっていると思うので, そもそもエリアから離れたときに消す必要があるのだろうか? とも思います。 これも場合や好みなどによるので何とも言えませんが。

ruby1024
質問者

お礼

いろいろ質問させていただきましたが、 教えていただいたスクリプトに付け足す感じで解決しました。 どうもありがとうございました!!

ruby1024
質問者

補足

ご回答ありがとうございます! 作ろうとしているものはまさに貼っていただいた画像のようなものです。 もう少し詳しくいうと、例えばarea_mcの部分がコーヒーカップの写真で、 そこにマウスがのると「コーヒーカップ」という名前と「詳しくはこちら」 というボタンのある吹き出しが出るようなイメージです。 「詳しくは…」をクリックすると詳細が表示されるというもので、 そこは外部swfを読み込むかたちにするつもりです。 画面の中にはコーヒーカップの他にもお皿やスプーンなどアイテムがあって、 マウスがのるとそれぞれ吹き出しが出るようにしたいのです。 なので、これはポップヒントに近いものだったかも知れません。 そこでもう1つ質問なのですが、教えていただいたスクリプトでは マウスがarea_mcから離れると1秒後にpopupは消えますよね。 この機能はそのままに、開いたpopupにマウスが乗っている間は そのpopupを表示しておき、マウスが離れたら消すということは できるでしょうか? 重ね重ねの質問で恐縮ですが、 お時間があれば教えていただけると幸いです。 どうぞよろしくお願いいたします。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

Flash のバージョン もしくは パブリッシュしたい SWF の Flash Player のバージョンを書かれていらっしゃいませんから 少々回答しにくいです。 スクリプトを見る限り, Flash 5 で無理をして,作成している感じに見えます。 (Flash 5 はバージョンが古く,できないことが多いので,変な工夫や無駄な動作が要る。) その Flash 5 路線を変えない場合で 簡単にするには次のようにすれば一応できると思います。 onClipEvent (load) { _root.popup._visible = false; } onClipEvent (enterFrame) { if (this.hitTest(_root._xmouse, _root._ymouse, 1)) { _root.popup._visible = true; // ↓変数 counter(カウンター) を 0 にする counter = 0; } else { // ↓変数 counter に 1 を加算 counter++; // ↓もし counter が 20 以上になれば if (counter>=20) { _root.popup._visible = false; } } }  

ruby1024
質問者

補足

ご回答ありがとうございます。 早速やってみようと思いますが、取り急ぎFlashのバージョンについて 記載させていただこうと思います。 制作にはFlash8を使っていて、swfのパブリッシュ設定では Flash Player 8にしています。 また、どうしても質問に書いたスクリプトでやりたいということでは 全くありませんので、他にもっといい方法がありましたら ぜひ教えていただけると助かります。 どうぞよろしくお願いいたします。