スクリプト制御でナイアガラの滝の動きをスムーズにする方法

このQ&Aのポイント
  • スクリプト制御しているが、ナイアガラの滝の動きが遅くなっている
  • トゥイーンで作成している場合は、少ないフレーム数で制御することができるが、ASで制御したいためにそうはいかない
  • ASでグラフィックを動かしている場合にもっとスムーズに動かす方法はあるか
回答を見る
  • ベストアンサー

スクリプト制御しているが、数が増えるにつれて動きが遅くなる

先日「【急ぎ】setIntervalを使って各インスタンスごとに表示するタイミングを変える」にて質問した者です。 http://oshiete1.goo.ne.jp/qa4025645.html BlurFiltan様から教えていただいた、ナイアガラの滝のMCについて質問させてください。 ナイアガラのみをswfで再生させている時は、あまり気にならなかったのですが、他のFlash(画像やアニメーション)と一緒に再生させるとナイアガラの本数が多くなるにつれて、動きが遅くなりカクカクしてしまいます。 トゥイーンで作成している場合は、使用するフレームを少なくすれば、多少はスムーズになるのでは?と思うのですが、ASで制御したいのでそういうわけにもいきません。 ASでグラフィックを動かしている場合にもう少しスムーズに動かす方法はないでしょうか? 分かりにくい質問かと思いますが、よろしくお願いします。

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

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

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

> ナイアガラのみをswfで再生させている時は、あまり気にならなかったのですが、 そうですか。 CPUは色々なのでその辺は色々だと思います。 私は最初から,気になって気になって... という状態でした。 特に#1の方は, 「一応ロースペックなPCでも動作確認済み」とは書いていますが, CPU500MHzくらいではほぼ限界です。 すでにカクカクになっているのを,耐えられる限界までのスクリプトにしています。 CPU200MHz以下だと1コマ(1フレーム)1秒くらいになるかもしれません。 > ASでグラフィックを動かしている場合に > もう少しスムーズに動かす方法はないでしょうか? 無駄(PC的に大きな処理)を省くことです。 それも 「描画処理の無駄」 です。 いちばんの無駄は拡大です。 あと,ランダムのゆらぎも省略させた方が良いかもしれません。 本当はアルファやブラーや加算を使うともっと面白いことはできるのですが, その辺は使わないようにかなり気を使ってはいるのです。 つまりアルファやブラーや加算という無駄は書いている状態ですでに省略しているのです。 その辺(拡大させないくらい)が AS で動きを軽くする限界でしょう。 すごい AS を使えば使うほど,良い物はできるのですが, 理想と現実は違うのでいかに誤魔化すかという部分ですね。 というか,AS 以前に根本をどうするかを考える部分が大切です。 AS以外になると, ベクトルデータはモニタ上に描画するだけでかなりなCPUを使いますから, アルファ抜きビットマップ画像を用意して, それをムービークリップに変換して attachMovie する方が良いです。 質問者さんが再度質問(補足)されているように, ActionScriptでベクタデータを描画するより,attachMovie した方が良いのです。 しかし AS のみで至急ということなので, 色々説明するのは時間がかかると思い, #1 では苦肉の策で全てASで回答しているだけです。 attachMovie するのでしたら, ベクタよりもビットマップの方が良いです。 つまりだんだん AS などというものから離れて行くのです。 (結局 AS は1つの手段であって,  肝心なのは工夫と発想と地道な作業です。  ASなんてどうでもいいものだと私は思います。  ASより良いものがあれば当然そちらを選ぶべきです。) 上で書いたように, ◎拡大をさせない ◎ビットマップ画像を使う というのでしたら,最初から方向は変わります。 ランダムな位置に火の粉が描いてある大きな画像を上下に連結して, 無限ループさせればものすごくCPUの負担は軽減されます(1/100~1/1000くらいになる)。 つまり,次のような火の粉(あ~と)の画像を用意します。  あ   い う     え    お    か き   く   け  こ  さ し   す   せ      そ      た ち つ    て と これを縦に二重連結します。  あ   い う     え    お    か き   く   け  こ  さ し   す   せ      そ      た ち つ    て と  あ   い う     え    お    か き   く   け  こ  さ し   す   せ      そ      た ち つ    て と これを折り返すように ActionScript で動かすと無限ループな火の粉ができます。 わかりにくいかもしれませんがこんな感じです↓。 Green Village http://acchan.s55.xrea.com/flash.html →スクロールメニュー (FLASH4)   http://acchan.s55.xrea.com/flash/scroll_menu/scroll_menu.html これだと, onEnterFrame で動かす画像は1つで済みます。 火の粉が見える上下の限界でマスクをかけても良いですし, 四角くくり抜いたシェイプの下レイヤーに火の粉を置いても良いです。 (マスクは使わない方がCPCの負担は少なくなります。) 上に書いたことはモーショントゥイーンは使っていません。 基本的にASで動かしています。 しかし,ぜんぜん違う発想のものです。 実は,私は最初こちらの方法を考えていたのですが, これは決して「至急」な方法ではない(ASだけでちゃらちゃらと誤魔化せるものではない)。 全てASでするのならいっそのこと, 火の粉の動きはバラバラの方が良いかもしれないので,バラバラのMCにしよう。 バラバラだったら大きさも変えられるなあ。 もっと色々したいけどCPUを考えるとこの辺が限界かなぁ。 などと考えて前回の回答を書いたのです。 「何を優先するか」 によって方法は変わります。 またASもぜんぜん違う物に変わります。 色々考えてやってみるのが一番だと思います。

関連するQ&A

  • 【急ぎ】setIntervalを使って各インスタンスごとに表示するタイミングを変える

    先ほどの書き込みと被ってしまいすみません。 現在、花火の「ナイアガラの滝」をFlashで表現しようとしています。 その際にトゥイーンではなくすべてASにて制御したいのです。 そして、時間差で画面の両端から真ん中に向かって花火がつくようにしたいと思っています。 現時点では、花火の火の粉を表すMCを作成してこのMCに対して以下のようなAS(指定位置から真下に落ちる)を記述しています。 ///////////////////////////////////////////////////// onClipEvent (enterFrame) { this._y = this._y+12; if (this._y>140) { this._y = 38.5; } } ////////////////////////////////////////////////////// このMCと同じ階層に上のMCを複製したものを数個配置しており、scriptレイヤーの1フレーム目には以下のようなASを記述しています。 ////////////////////////////////////////////////////// stop(); myID = setInterval(function () { gotoAndstop(2); clearInterval(myID); }, 3000); ////////////////////////////////////////////////////// はじめに説明した火の粉のMCは1つずつレイヤー分けして2フレーム目に配置しているので、上のASのままでは、全てが同時に再生されてしまい、花火のナイアガラっぽくありません。 より、リアルにする為に時間差で花火をつけたいです。 火の粉のMCにはa、b、c、dといった感じでインスタンス名をつけています。 1フレーム目に記述している「gotoAndstop(2);」をインスタンス名で指定すればいいのでは…と思い「gotoAndstop(a);」と、指定してみたのですが、何も表示されなくなってしまいます。 まだまだ、ASについて詳しくないので、分かり易く説明していただけると助かります。 急ぎなので、分かる方返信お願いします。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • as3.0でのフレーム移動制御のスクリプト

    当方、FLASH cs4、as3.0で製作をしております、まだ初心者です。 以下のタイムラインを動作させようとしているのですが、どうにも行き詰まってしまいこちらに参りました。 どなたかご教授頂けないかと願っております。 どうぞ宜しくお願い致します。 flaステージ上に(A_btn)、(B_btn)、(C_btn)、(D_btn)、(C_btn)という5個のボタンインスタンスを配置しています。 オープニングと同時にA_mcの前半を再生してA_stopラベルのフレームで停止します。 (9フレーム目のasには stop(); 記述済み) その状態で(C_btn)や(D_btn)をクリックした時に、A_stopラベルのフレームからA_closeラベルのフレームに移動して A_mcの後半を再生して、A_mcが終了する(17フレーム目)と同時にB_mcを飛び越えてC_startやD_startラベルのフレームに移動しムービーを再生するには、どのフレームにどんなラベルを追加したり、スクリプトを記述すれば良いか具体的にお教え願えませんでしょうか。 同様にB_mcからC、Dを飛び越えてE_mcに移動したり、E_mcからAやBにも移動させたいです。 また、上記はタイムラインアニメですが各々のmcをswfとしてロードする場合も合わせてご教授頂けると幸いです。

  • 外部テキストファイルからの制御

    はじめまして、いつも勉強させていただいております。 一応、過去ログなども見てみたのですが見つけられなかったので質問させていただきます。 最終的に行いたい事は、表題通り外部テキストファイルから、swfを制御させたいと思っています。具体的には、例えばテキストファイルに『03』と書いてあったら『03.swf』を再生する…テキストファイルに『10』と書いてあったら『10.swf』を再生するといったような事です。 初心者ながら色々と調べながら失敗を繰り返したりしているのですが… data.txt(テキストファイル)の中に『&myData1=01&』と記入。 同階層にindex.swf(親swf)『gamen』という名の空インスタンスMC 同じく同階層に01.swf(子swf)… index.swfに書いたASはこんな感じです。 myLV = new LoadVars(); if (myLV.myData1 = "01") { loadMovie("01.swf", _parent.gamen); } myLV.load("data.txt"); 完全に初心者ですので、根本的に大間違いをしているかとは思いますが、救いの手をお願いいたします。 WIN-XP FLASH8です。

  • ステージにある複数のインスタンスを制御したいです

    ステージに配置してある複数のインスタンスをアクションスクリプトで制御したいです。 インスタンスには「mc0」~「mc9」の連番で名前をつけています。 例えば、それぞれのインスタンスのタイムラインを再生させる指示を与えるとすると、 mc0.gotoAndPlay("main"); mc1.gotoAndPlay("main"); mc2.gotoAndPlay("main"); mc3.gotoAndPlay("main"); ・ ・ ・ mc9.gotoAndPlay("main"); となると思いますが、もっとスマートに書くとするとどんな書き方があるでしょうか? 数がもっと増える可能性があるので、もっと合理的な方法を知りたいです。 アクションスクリプトで生成したインスタンスを動かすには、 for(var i:int=0;i<10;i++){ var mc:MovieClip=new McMC(); addChild(mc); mc.name="mc"+i; mc.x=200+i*50; mc.y=200; mc.gotoAndPlay("main"); } のような感じで動かすのはやったことがあるので 既にステージに直接配置されているインスタンスもfor文で同じように制御できると思い 以下のように試してみましたが… for(var i:int=0;i<10;i++){ var mc:MovieClip; mc.name="mc"+i; mc.x=200+i*50; mc.y=200; mc.gotoAndPlay("main"); } 未定義となってしまいます。 やはり地道に書くしかないのでしょうか? ご教授を宜しくお願い致します。 ※FlashCS4、AS3で作業しています。

    • ベストアンサー
    • Flash
  • AS3.0 配置したインスタンスにswfの読み込み

    初歩的なご質問です。 AS3.0にて、ステージ上に配置したムービークリップ(インスタンス名:mc)に外部swf(test.swf)を読み込みたいのですが、、どうもうまくいきません。 わかりやすく申しますと、AS2.0形式では mc.loadMovie("test.swf"); となっているスクリプトをAS3.0で行いたいです。 拙い文章で恐縮ですが、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 画面遷移を等間隔にしたい 

    たびたびの質問ですがよろしくお願いします。win・cs3・as2で作成中です。 http://www.tokyo-eden.com/ このtopページのような、マスクを使った画面が切り替わるflashを作成しております。 それを4パターン(top_01.swf、top_02.swf、top_03.swf、top_04.swf)作って、親のswf(parent.swf)に読み込む形にしています。 ●top_01~04.swfは、レイヤーが6つに分かれており、順番に レイヤー6:AS レイヤー5:画像1のマスク レイヤー4:画像1 レイヤー3:画像2のマスク レイヤー2:画像2 レイヤー1:画像1(onloadで読み込まれるもの) といった感じです。(※image1、実際にはもっとフレーム数が多くなってしまっていますが、わかりやすく短くした画像をのせました) ●parent.swfは、レイヤーを5つに分けており、順番に レイヤー5:AS レイヤー4:top_01.swfを読み込むMC(インスタンス名:mc_01) レイヤー3:top_02.swfを読み込むMC(インスタンス名:mc_02) レイヤー2:top_03.swfを読み込むMC(インスタンス名:mc_03) レイヤー1:top_04.swfを読み込むMC(インスタンス名:mc_04) となっています。(※image2) ★質問 (1)top_01~04.swfの作成の仕方なのですが、レイヤーの順番や配置はもっと効率的な方法がありますか? (2)parent.swfでは、 onLoad = function(){ mc_01.loadMovie("top_01.swf"); mc_02.loadMovie("top_02.swf"); mc_03.loadMovie("top_03.swf"); mc_04.loadMovie("top_04.swf"); } このようなスクリプトしか書けていません。 今回作成したいのは、 1、top_01~04.swfがそれぞれ10フレーム程度の間隔でフェードイン 2、その後、top_01~04.swfが順番に等間隔でマスクによる画面遷移を繰り返す なのですが、1も2も、top_01~04.swf(子)で間隔を調整すると、ものすごいフレーム数になるうえ、だんだん間隔がずれてきてしまいます。 これを、なんとかparentで等間隔に制御する方法はありますか? 以上、わかりにくい質問で申し訳ないですが、よろしくお願いいたします。

  • AS3にて、次へボタンとSWFの制御について

    初めて質問をさせて頂きます。AS3については、初めて勉強に取り組んでいます。 質問内容が、大まか過ぎて理解できない場合があるかと思いますが、 何卒、よろしくお願い致します。 アドビーフラッシュCS4のAS3を使って、紙芝居ゲームを作成するのが目的です。 スタートボタンをクリックすると 画面上(背景)にswfデータをフォルダーから特定swfデータを呼び出して、再生し、 次へボタンをクリックすると、「あらすじのセリフ」が背景のswfに表示されている画面上に 表示させて、見た目上同じ次へボタンにて、セリフや背景swfを切り替えていきたいです。 設計の方法から組み立てないといけないと思っていますので、参考になる記事やURLを 教えて頂けませんでしょうか。 当方、色々調べたのですが、タイムライン上にセリフアニメーションを並べて管理した方 がいいのか?、シーン別に作成して、シーンを切り替えて制御した方がいいのか、 よくわかりません。(AS3の概念を理解できていません。すいません) 同じ機能をもったゲームの作り方があれば、きっと何かひらめくかもしれません。 何卒、ご指導のほど、よろしくお願い致します。

    • ベストアンサー
    • Flash
  • 外部SWFの制御、プロパティにアクセスについて

    制作環境:Flash CS5、ActionScript3 外部SWFのプロパティ、フレームの制御について悩んでいます。 まず、外部SWFを読み込むSWF:parent.swf、読み込まれるSWF:child.swfがあるとします。 parent.swfはタイムライン1フレームだけで以下を記述しています。 var swfUrlReq:URLRequest=new URLRequest("./child.swf"); var fileLoader:Loader=new Loader(); var mc:MovieClip=new MovieClip(); fileLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeSwf); fileLoader.load(swfUrlReq); function completeSwf(eventObject:Event):void { mc=fileLoader.content as MovieClip; mc.stop(); addChild(mc); trace(mc.word); } child.swfでは総フレーム55くらいで、添付の画像のように左から右に移動して終わるだけのムービーです。1フレーム目にはvar word:String="読めた!!"; 最後の55フレームにはstop();を記述しています。 でいざパブリッシュしてみるとmc.stop();が効かず勝手にムービーが再生され、おまけに以下の「Error #1069: _01_fla.MainTimeline__Preloader__ にプロパティ word が見つからず、デフォルト値もありません。」のエラーでてしまいます。 どうやったらフレームを制御でき、child.swf内部に設定した変数wordを読めるでしょうか?ネットでいろいろ検索引っかかったのですがどれも解決にはなりませんでした、どなたか教えてください、よろしくお願いします。

    • ベストアンサー
    • Flash
  • クロスドメインによるswf読み込みと相互制御

    環境:as2.0 Flash8 winXPです。よろしくお願いします。 本サイトhttp://www.aaa.com下にある親swf【aaa.swf】から mcLoader.loadClip("http://www.bbb.com/bbb.swf", yomikomi_mc); で別ドメインhttp://www.bbb.com下にある子swf【bbb.swf】を読み込み 相互制御したいと考えています。 それぞれに 親swf System.security.allowDomain("bbb.com"); 子swf System.security.allowDomain("aaa.com"); と書いています。 読み込みと、親swfから子swfへの制御は出来るのですが yomikomi_mc.gotoAndStop(2);//などは問題なく動く 子swfから親swfへの制御ができません。 同じドメイン下にある時には制御できるのですが、クロスドメインから読み込むと、 制御できません。 制御できない部分を詳しく記述させて頂きますと、子swfは lockroot = true; としていますので親swfへのパス、 _root._parent._root=gotoAndStop(3); やグローバル変数(親swfで指定_global.hensuu=5;) trace(hensuu); などがundifinedとなってしまいます。 親swfファイルへの制御許可の記述が System.security.allowDomain("aaa.com"); ということではないのでしょうか?記述の仕方が問題でしょうか? 親swfへのパスが変わってしまうのかとも思い色々試してみたのですがうまくいきません。 ご教授頂ければ幸いです。よろしくお願いいたします。

  • AS3.0による外部swfの制御

    AS3.0による外部swfの制御 質問させていただきます。 やりたいと事は、メインとなるswfのボタンを押して、 読み込んだ外部swf(stopしている)を再生(play)したいと考えております。 メインのswfはAS3.0、読み込む外部swfはAS2.0になります。 環境はFlash CS3です。 以下がスクリプトになります。 //swf読み込み配置 var loader_obj : Loader = new Loader(); var url : URLRequest = new URLRequest("test.swf"); MovieClip(root).loader_obj.load(url); loader_obj.y = 3 loader_obj.x = 392 stage.addChild(loader_obj); //swfボタン制御 btn.addEventListener(MouseEvent.ROLL_OVER,btn_play); function btn_play(event:MouseEvent):void {MovieClip(root).photo.gotoAndPlay(2);//メインswfのムービーリップも動かす <--ここに外部swfを参照するスクリプトが入ると思うのですが・・・-->gotoAndPlay(2);//外部swfの2フレーム目から再生 } 肝心の所のスクリプトはわかりません・・・ 宜しくお願い致します。

    • ベストアンサー
    • Flash

専門家に質問してみよう