• 締切済み

onClipEvent(enterFrame)よりもフレームに書いたほうが良い?

最近Flashでfunctionの使い方を勉強しています。 そこで思ったのですが、例えばあるキーが押されたときに動作を行なわせたい場合。ムービークリップにonClipEvent(enterFrame)で記述する方法とフレームにfunctionで記述する方法の2通りあります(もしかして他にも方法あったりします?)。 素人考えでは、例えばonClipEvent(enterFrame)にtrace文を書いた場合、ずっとtrace処理が行なわれますが、フレームに書いた場合はそのフレームが読み込まれた瞬間のみtrace処理が行なわれます。一見onClipEvent(load)のようですが読み込み後、たとえフレーム移動がそこでstopになったとしても、イベントハンドラによって処理を行なわせることは可能です。そう考えると、処理の軽さ的にはフレームに記述する方法の方が優れているのでしょうか? ムービークリップにonClipEvent(enterFrame)で記述する場合とフレームにfunctionで記述する場合、両者の長所・短所も合わせて紹介していただけると助かります。 以上になります。よろしくお願いします。

  • Flash
  • 回答数2
  • ありがとう数0

みんなの回答

noname#35109
noname#35109
回答No.2

>> 例えばあるキーが押されたときに動作を行なわせたい場合。         ~ >> (もしかして他にも方法あったりします?)。 そういう単純なことでは, onClipEvent(enterFrame) や MovieClip.onEnterFrame はなるべく避けた方が良いです。 enterFrame 系は,1フレーム進む時間ごとに毎回実行されます。 毎回毎回実行されるのですから,実行命令の無駄で,CPUに負担をかけます。 キーは普通めったに押されることはありません。 enterFrame 系は簡単で良いですが, これを使いすぎるとだんだん動作が重くなります。 また enterFrame 系は,MovieClipクラス のイベントハンドラです。 あるキーが押されたときの, "あるキー" として,特定のキーをすでに決めてある場合は, ボタンシンボルのインスタンスを作成しておいて そのボタンに,  on (keyPress "a") { } を書くか,また, "あるキー" として,特定のキーをすでに決めていない場合, つまり,本当に「あるキーが押されたとき」を監視するのでしたら, Buttonクラスの,  Button.onKeyDown = function() {}   や  Button.onKeyUp = function() {} を使う方が良いです。 Flashドキュメンテーション 「onKeyUp (Button.onKeyUp ハンドラ)」 http://livedocs.macromedia.com/flash/8_jp/main/00001999.html しかし, キーイベントの監視に,わざわざボタンを作成するのも変な場合もあります。 そんなときは,Keyクラス の addListener メソッドで, Listener.onKeyDown = function () {} を使って, リスナーオブジェクトに Keyイベント を監視させる方法を使います。 Flashドキュメンテーション addListener (Key.addListener メソッド) http://livedocs.macromedia.com/flash/8_jp/main/00002295.html ------------------------------------------------------- >> 例えばonClipEvent(enterFrame)にtrace文を書いた場合、 >> ずっとtrace処理が行なわれますが、 >> フレームに書いた場合はそのフレームが読み込まれた >> 瞬間のみtrace処理が行なわれます。 はて??? どういう状況でしょう? 普通はそんなことはありませんよ。 _root.onEnterFrame = function(){ trace("traceしてます。"); } ずっと trace し続けます。 >> そう考えると、処理の軽さ的にはフレームに >> 記述する方法の方が優れているのでしょうか? 同じでしょう。 凝った MC(ムービークリップ) を作成したのでしたら, その分メモリを消費するので,わざわざムービークリップを作らなくても良いかもしれない, Movieclip.onEnterFrame = function(){} の方が若干良いとは思いますが, そのムービークリップが必要である場合は,どちらを使っても同じだと思います。 ------------------------------------- まあ,何にしても enterFrame 系 は,アニメーションと同期させて,毎時毎時同じ処理をする場合に使う物です。

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

そもそもonClipEvent(enterFrame)とフレームに記述するfunctionを比べる、ということ自体が両者に関する間違った解釈をしていると思われます 下記のような例だとすると、 ■targetMCに記述 onClipEvent(enterFrame){ //アクション } ■targetMCの上階層フレームに記述 targetMC.onEnterFrame = function(){ //アクション } 両者は同じ意味合いなので、前者は、後者のonEnterFrameイベントハンドラに使用するfunctionを定義することをonClipEvent(enterFrame)により実装しているという感じになります フレームに記述した場合はそのフレームが読み込まれた瞬間にしかアクションを実行しないので、たとえstop();と記述してhoge();のような形でfunctionを呼び出したとしても、そのフレームで止まってる以上、何度もキー押下の判定をしたい場合取得ができません そのフレームのみで押下判定を取得したいならそれで構いません enterFrameは1つの記述で、フレームレートに合わせてアクションを常時実行させたい場合に使うものです

関連するQ&A

  • Flash MX ActionScriptのEnterFrame

    Flash 初心者です。 クリップアクションの、 onClipEvent (enterFrame) { } がいまいちよくわかりません。 フレームが1フレームだけのルートのタイムラインに、 何の動きもないムービークリップオブジェクト(これも1フレームのみ)を1つ置いたとします。 そのムービークリップに、例えば、 onClipEvent (enterFrame) { _rotation+=20; } とアクションをつけたとします。 これを再生すると、回転し続けますよね。 これはルートのタイムラインが1フレームだけでも、 それがループしていると考えると、納得できるのですが、 1フレーム目に、this.stop();を記述しても、 回転し続けます。 enterframeとはどのように解釈すればいいのですか? ルートのタイムラインが再生される度に呼び出されるということでは ないのでしょうか? よろしくお願い致します。

  • 1フレーム~5フレームまで表示されなくなったのは。。。

    こんにちわ毎回お世話になっております 新しいフラッシュを作ったのですが 前回のフラッシュにしようしたロード画面を 使いまわしました。 ムービークリップ自体には onClipEvent (load) { _root.stop(); } onClipEvent (enterFrame) { if (100 == Math.floor(_root.getBytesLoaded()/_root.getBytesTotal()*100)) { _root.gotoAndPlay(5); } } onClipEvent (enterFrame) { this.gotoAndStop(Math.floor(_root.getBytesLoaded()/_root.getBytesTotal()*100)); } と前回同様記述しました。 しかし今回はロード画面がでず 白紙の画面のまま読み込みが完了し そのままフレーム5に進んでしまっています。 何回もやりなおしたのですが どうしても白紙のまま読み込んでしまいます。 これはFLA自体が破損?したのでしょうか? 非常に困っています。 なにかアドバイスがありましたらお願いいたします。 別のロードムービーを作ったものの 白紙のまま読み込みされました。。。 FLASH8 WIN XP使用です。

    • ベストアンサー
    • Flash
  • parafla 関数が呼ばれない

    onClipEvent (load) { hoge (); } - onClipEvent (enterFrame) { hoge (); } function hoge () { trace ("hoge"); } この場合、 onClipEvent (load) 内から呼び出した独自関数が呼び出されません。 onClipEvent (enterFrame) 内では正しく呼び出されます。 どうしてですか?

  • ムービークリップ再生後次のフレームへ移動しません

    アクションスクリプトを使って、テキストが下から上へ流れるようにムービークリップを再生し、テキストが流れ終わったところで次のフレームへ移動させたいのですが、フレームが移動せず困っています。 スクリプトは色々なところで調べて、やっとの事で下記のように書きました。 使用しているのはFlash MX 2004 です。 |○  □|○|  ←1.スクリプトレイヤー |●    □|  ←2.ムービークリップレイヤー |○|●→|●|  ←3.ムービークリップ後に再生したいレイヤー 1.のスクリプト(2つのキーフレームいずれとも) stop(); 2.のムービークリップのスクリプト onClipEvent (load) { spd =5; onClipEvent (enterFrame) { this._y = this._y-spd; if (this._y<=-10) { spd = 0; gotoAndPlay(2); } } 知り合いにお見舞いのメッセージをと思って作ったのですが、送ることが出来なくてとてもあせっています。 どうぞよろしくお願いします。

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

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

  • onEnterFrameで、条件を満たしたときにその処理から抜けたい。

    下のプログラムをフレームに書きました。そうすると、一応は重いどおりにうごいて、_alphaが増えていきphotoとなずけたがムービークリップが見えるという動きはできるのですが、問題は、traceさせてみるとずっと100、100と記述されます。できればこの処理から抜けて、traceで100と出てこないようにしたいです、なにか処理が重たそうなので。フレーム移動して処理抜けるのはできるかもしれませんが、できれば1フレームで終わらしたいなとおもっています。よろしくお願いいたします。バージョンはflashMX2004です。 this.onEnterFrame = function(){ if(photo._alpha >= 100){ photo._alpha = 100; trace(photo._alpha); }else{ photo._alpha += 5; } }

    • ベストアンサー
    • Flash
  • Flashでボタンをクリックするとフェードイン、フェードアウトする

    アクションスクリプト初心者なのですが、 スクリプトで、ボタンをクリックすると 現在のフレームのムービークリップがフェードアウトしながら、 次のページのムービークリップがフェードインする方法を ご存知でしたら、教えていただけないでしょうか。 ムービークリップがロードしたら、 フェードインするところまでは出来たのですが、 それだと、現在のムービークリップがフェードアウトしないので 困っています。 ムービークリップがロードしたら、 フェードインするスクリプトは、 onClipEvent (load) { _alpha = 0; } onClipEvent (enterFrame) { _alpha += 2; } と記載しております。 どうぞよろしくお願いします。

    • ベストアンサー
    • Flash
  • mcのx座標が50以上になったら次フレーム

    タイトルどおり、 mcのx座標が50以上になったら次フレーム という処理をしたく、 mcに次のアクションスクリプトを記述しました。 onClipEvent(enterFrame){ this._x += 10; } onClipEvent(load){ if(this._x >= 50){ nextFrame(); } } しかし何故か次のフレームに行ってくれません。 どこか間違っているのでしょうか。。。 nextFrame();をgotoAndPlay(2);にしても駄目でした。

    • ベストアンサー
    • Flash
  • 停止してしまうgotoAndPlay

    愛想尽かされてしまいそうなのですが 質問をさせて頂きます。 どうも、フレーム上に書くスプリクトと クリップイベントの動作制限がイマイチ分かりません。 ある、ムービークリップがステージに配置されており onClipEvent (enterFrame)で移動制御しています。 (this._x-=5てな具合です) そのムービークリップは30フレームほどで形成されており しょっぱなのフレームでstop();をかけ、ムービークリップが自動的にアニメしないように停止させています。 で、on (press) にてそのムービークリップが マウスで押されたときにthis.gotoAndPlay("ラベル名");と、 その停止されていたムービークリップがマウスダウンをきっかけに動くといったものです。 ※ ここまでは思惑通りに進行できたのですが・・・・ マウスが押されるとか押されないとかは別に 例えば時間的に又はムービークリップがある一定の場所に到達したときに 停止させてたアニメを動作させたいのです。 私なりに考え、 onClipEvent (enterFrame)の命令の中で IF文にて座標を調べ特定の場所に着たので this.gotoAndPlay("ラベル名");にて動作させようとしたら ダメでした。 画像は変化しているので、ジャンプはしているようなのですが 何故か1コマで停止しているようです。 onClipEvent (enterFrame)内で this.gotoAndPlayは無効なのでしょうか? 手引書にはそれぞれの機能説明はありますが 使用制限が記載されていないので どういう間違いを犯しているのかわかりません。 上記、宜しくお願い致します。 尚、本件は別欄でご質問させて頂いてます物とは 別扱いとなります。 (質問ばかりでスミマセン。何かお勧めの手引書でもあれば教えて下さい)

    • ベストアンサー
    • Flash
  • onClipEvent の enterFrameとloadについて

    お世話になります。 幅500pxのステージに形だけのムービークリップを作り、 それに onClipEvent (enterFrame) { if (this._x<=100) { this._x = 250; } else { this._x = 300; } } と記述しました。 ステージ上でムービークリップのx位置を100px以下に配置したところ、300pxに移動してしまいます。 onClipEvent (load)に変更すると250pxになります。 なぜですか? よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう