suzukaでActionscriptの量の限界は?

このQ&Aのポイント
  • SuzukaでフレームあたりのActionscriptの量が増えると、処理が重くなり動作が不審になる場合があります。
  • フレームごとに書くActionscriptの量を制限し、見やすいコードにすることをおすすめします。
  • 変数や関数の定義はどのフレームに書いても実行されますが、特定の処理が必要な場合は注意が必要です。
回答を見る
  • ベストアンサー

suzukaでフレームあたりのActionscriptの量の限界は?

いつもありがとうございます。 Suzuka・Flash初心者ですがよろしくお願いします。 Suzukaでルートのフレームアクションに2フレーム(コマ) あるものを現在弄っているのですが、 1フレーム目にStopがあり、そして下の方に ――――――――――――――――― // 更新データロード時の動作定義 myXML.onLoad = function() { // 次のフレームへ _root.nextFrame(); }; ――――――――――――――――― というのがあり、これで次の(メイン)フレームに行くんだなぁ、 と理解できるのですが、 この1フレームに他の機能や定義を書きすぎてしまい、 特にIf文が100個以上あって、"構文エラー"は出ないものの、 動作が不審?になってきました。 これはフレームあたりに書く量が多く、処理が重くなっているのでしょうか? {}や()の量が多くて、見栄えも悪く、別のフレームに移した所、 エラーになってしまいました。メインの2フレーム目を3フレーム目に 移してもエラーにならなかったのですが、重い1フレーム目を分解して 2フレーム目に挿入した所、急に動かなくなりました。 Suzukaがフレーム順に動いていると理解しているのですが、定義や 変数の扱いは必要になる箇所までなら、何フレーム目で行っても 一緒なのですよね?それとも私のIf文や定義文が間違って、エラーが 出ているのかも、良く判りません。。一応何をどういう風に移動したのか、書きます。 (1)stop(); (2)変数の処理 (3)―――言語処理―― var sprach = System.capabilities.language ; if(sprach="cs"||"pl"||"ru"||"tr"){ sprach = "en" ; } if (System.capabilities.hasIME) { var sprach = "ja" ;} if (sprach="es"){ ・・・・ }    *この部分が挙動不審 else if (sprach="it"){・・・・ }  *先頭にくるif文が else if (sprach="de"){・・・・ }  *変数sprachの中に勝手に else if (sprach="en"){・・・・ }  *代入される。この例は"es"。 else if (sprach="ja"){・・・・ }  *先頭を入れ替えると値も変わる。 else {・・・・} *上手くsprachが働いていないのかも・・・。 (4)―――言語処理のユーザー関数―― function converterIT(num) {・・・・ return XXX;} function converterDE(num) {・・・・ return XXX;} (5)残りの命令。 (4)だけで130行、残りの項目(1)(2)(3)(5)は250行あって、・・・等の 大部分がIF文で占められており、{}や()の数は間違えていないのの、 (3)の部分で挙動不審となり、他のフレームへ移せないのかな?と 思っています。(4)のユーザー関数は”定義”ですよね?これは切り離して 独立して1フレーム目に持ってきても良いものなのでしょうか? (3)も切り離してメインフレーム(元の2フレーム目)との間に挿入する事 はできるのでしょうか?したのですが、画面が真っ白になります。 SuzukaやFlashでの変数や定義はどこに書いても基本的に同じですよね? 上記のmyXML.onLoadの命令はロード完了前にメインフレームに行かない為の 配慮なんですよね?格フレームに一々Stop();を書く必要はありませんよね? としたら通過(する)したフレームに書かれた変数や関数の定義はFlashは絶対に 見落とさずに実行しているハズなんですよね?

  • ferra
  • お礼率70% (627/886)
  • Flash
  • 回答数1
  • ありがとう数2

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

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

何でも良いですが、if文が間違っていますよ。 【例】 if (sprach="es"){ ・・・・ }      ↓イーコールイコールに変更 if (sprach=="es"){ ・・・・ } こうでしょう。 「=」 は代入演算子で「==」が等価演算子です。 他のif文すべでも同様です。 行数は内容によりますが、 単にif文を並べるくらいなものでしたら 1000行 10000行 くらい別に大丈夫でしょう。 人間の把握能力の方がおそらく先に限界が来ます。 問題は行数ではなくて内容です。 たとえば num=1; for(i=0;i<100000000000000000;i++){ if(i%2==0){ num+=10000000*i; } } こんなのが無事に動くかどうかわかりません。 長いから他のフレームに分けるのではなく、 わかりやすいように短くするのが普通の手段です。 例えば、 すごく単純(基礎・基本的)なまとめ方だと次のようにもできます。 ------------------------------------------- // 変数 myLanguage の値が仮に ja であったとする myLanguage = "ja"; // アルファベット略国名の配列を作成 languageArr = ["cs", "da", "nl", "en", "fi", "fr", "de", "hu", "it", "ja", "ko", "no", "xu", "pl", "pt", "ru", "zh-CN", "es", "sv", "zh-TW", "tr"]; // 漢字略国名配列を作成(function名 配列と考えても良い) functionArr = ["捷", "丁", "和", "英", "芬", "仏", "独", "洪", "伊", "日", "韓", "能", "不", "波", "葡", "露", "簡", "西", "瑞", "繁", "土"]; // 配列の要素の数だけ i を加算しながらループ for (i=0; i<languageArr.length; i++) { // myLanguage の値が languageArr の要素と一致していれば if (myLanguage == languageArr[i]) { // それに対応する functionArr の要素を出力 trace(functionArr[i]); } } ------------------------------------------- さらに、 漢字略国名(function名)を技巧的に考えれば、 functionArr なども不要になる可能性もあります。 functionArr 関数名の要素を入れた場合は, 次のように配列アクセス演算子 [] を使ってその関数を実行させることができます。 ------------------------------------------- // 変数 myNum の値が仮に 2 だったとする myNum = 2; // function名 の配列を作成 functionArr = ["funcAAA","funcBBB","funcCCC"]; function funcAAA(str){ return "ああ" + str + str; } function funcBBB(str){ return "なかなか" + str + str; } function funcCCC(str){ return "まじで" + str + str; } // 変数 aaa に 関数 functionArr[2] の戻り値を取得(引数:楽しい) aaa = this[functionArr[myNum]]("楽しい"); // 変数 aaa を出力(「まじで楽しい楽しい」 が出力される) trace(aaa); ------------------------------------------- また、 function がそんなにたくさんいるのかどうかもわかりません。 こちらも考えれば短くできる可能性は大きいと思います。 例えば、 上に書いた funcAAA~funcCCC のような関数は function を実行させる説明のために3つも用意しただけで,そもそも3つも要りません。 1個または0個にできます。 --------------------------------------------- // 変数 myNum の値が仮に 2 だったとする myNum = 2; // 感嘆語の配列を作成 exclamationArr = ["ああ","なかなか","まじで"]; function funcABC(num,str){ return exclamationArr[num] + str + str; } // 変数 aaa に funcABC の戻り値を取得(引数:2,楽しい) aaa = funcABC(myNum,"楽しい"); // 変数 aaa を出力(「まじで楽しい楽しい」 が出力される) trace(aaa); --------------------------------------------- 書かれていらっしゃるもののような場合は、 フレームを分けると複雑になるだけだと思いますよ。 また分けても処理時間が短くなるわけでもありません(たいてい長くなる)。 フレームを分けるのは、 たいていの場合 「準備が整うまでステージを見せたくないとき」 と思えば良いと思います。

ferra
質問者

お礼

うわぁ!超嬉しいです、動きました。何時間の格闘が解決しました。。 いつもなのですが、本当にありがとうございました! >何でも良いですが、if文が間違っていますよ。 (爆)ホント、申し訳ないです。知りませんでした。。。(どうしよう) >「=」 は代入演算子で「==」が等価演算子です。 コピペして製作しており、かろうじて動いていたようですが、 今、全部上手くいきました~(涙)。。よかった。。。 仰るfunctionArr[i]はこういう使い方ができるんですね!スゴイ。 是非すぐ取り入れてみます。 後半部分の説明が私の理解を超えており、今全く判らないのですが、 頑張って理解してみます。 ホント、素人相手にお時間とらせて申し訳ありません。 メッチャ助かりました。ホント、訳の判らない質問をする位、(そのレベルなのですが;) 行き詰まっておりました。基本的な疑問にも丁寧にお答えして頂き、 なんとなく持っていた疑問が晴れました。後半部分はじっくり考えてみます^^; 今回も本当に(×2)アリガトウ御座いました!

関連するQ&A

  • Actionscriptでのフレーム間の移動

    // ここで実際に○を移動させる Pofmaru1(l); Pofmaru2(r); // maru1を移動させる関数Pofmaru1 function Pofmaru1(l) { if (l == 1) { gotoAndPlay("maru1",2); }else if (l == 2) { ・・・・・・ // maru2を移動させる関数Pofmaru2 function Pofmaru2(r) { if (r == 1) { gotoAndPlay("maru2",2); }else if (r == 2) { ........ maru1を移動させる処理を呼んで、gotoAndplayでmaru1レイヤーの2フレーム目へ飛び、2フレーム目が再生されたら、次にクイックソートのプログラムに戻り、関数 Pofmaru2(r); を処理するようにしたいのですが、うまくいきません。C言語であれば普通if文の処理がされたら自動でプログラムに戻ってきて、Pofmaru2(r);の処理へ移ると思うのですが....Actionscriptはそうならないのでしょうか? ネットや本などで色々調べてみたのですが解決策が見つからず行き詰ってしまって困っています。 flash mxでプログラム通りにフレーム間を移動するようにするのは無理なのでしょうか?

  • suzukaのスクリプトで

    suzukaでFlashを制作しております。 プログラムはさっぱりなので検索して出てきたactionscriptを切り貼りして試している状況です。 その1.フレームアクションにおいて、キーを押したら特定のフレームまで移動するスクリプトを入れたいので20フレーム目に以下のスクリプトを入れたのですが、どちらも使えませんでした。具体的な解決策はありますでしょうか。 ●[parse error]とエラーが出る this.stop(); on(keyPress ("a")){ _root.gotoAndPlay(21); } ●キーを押しても何も起こらない this.stop(); if(Key.isDown(Key.RIGHT)){ _root.gotoAndPlay(21); } else if(Key.isDown(Key.LEFT)){ _root.gotoAndPlay(31); } その2.フレームアクションの10フレーム目に this.stop(); buttonA.onPress=function(){ _root.gotoAndPlay(11); }; とボタンのスクリプトを入れると、 どこのフレームまで移動しようが 同じボタンへの命令で上書きするまで このボタンへの効果が持続されてしまうのですが、 押した瞬間に後に命令を引き継がせないスクリプトの記述はありますか?

    • ベストアンサー
    • Flash
  • flashのActionscriptでのムービーとのタイミング処理

    スクリプトの途中だけの部分ですが 再帰の中で // ここで実際に○を移動させる Pofmaru1(l); Pofmaru2(r); 再帰の外で // maru1を移動させる関数Pofmaru1 function Pofmaru1(l) { if (l == 1) { gotoAndPlay("maru1",2); }else if (l == 2) { ・・・・・・ // maru2を移動させる関数Pofmaru2 function Pofmaru2(r) { if (r == 1) { gotoAndPlay("maru2",2); }else if (r == 2) { ........ として、移動先のフレームにmaru1,maru2を目的の場所へ移動するムービーを呼び出して再生するようにしたいと思いました。 しかし、最後のムービーだけしか表示さえれない状態です。if文で指定のフレームへ移動してそのムービーが再生されてから、次のプログラムの動きへ移るようにしたいと思いました。そこでタイミング処理をすればいいのではないかと思ったのですが、いろいろ調べてみたのですが、プログラムがあまり得意では無く、再帰の中でフレーム移動の関数を呼び出しているので、どうしたらいいのかわからず行き詰ってしまい困っています。Actionscriptとムービー再生のタイミング処理はどうしたらいいのでしょうか? アドバイスください。お願いします。

  • suzukaでの携帯flash作成

    suzukaで携帯のメニューアイコンを作っているのですが、swf6ではfscommandが反応しないのでswf4で作ることにしました。 ですが、for文がエラーになるので、 for(i=0;i<12;i++){ if(_root["mc"+i]._y>651){ _root["mc"+i]._y-=1116; } } を if(/mc0._y>651){ /mc0._y-=1116; }else if(/mc1._y>651){ /mc1._y-=1116; }else if(/mc2._y>651){ /mc2._y-=1116; }else if(/mc3._y>651){ /mc3._y-=1116; }else if(/mc4._y>651){ /mc4._y-=1116; }else if(/mc5._y>651){ /mc5._y-=1116; }else if(/mc6._y>651){ /mc6._y-=1116; }else if(/mc7._y>651){ /mc7._y-=1116; }else if(/mc8._y>651){ /mc8._y-=1116; }else if(/mc9._y>651){ /mc9._y-=1116; }else if(/mc10._y>651){ /mc10._y-=1116; }else if(/mc11._y>651){ /mc11._y-=1116; } に変えたのですがうまく動作しません。 どこか間違いはありますか? またswf6でfscommandを使う方法はないんでしょうか? 長文失礼しました。 回答よろしくお願いします。

  • このソースで、仕組みについて教えてください。

    現在、スクリプトを勉強しているんですが、XMLから画像URLを呼び込むソースで調べ方が分からない箇所がありますので、どなたか解説して頂けないでしょうか? ●下記はどういった式になるのでしょうか? _root.total = this.childNodes[0].childNodes.length; ※totalの時 = このチルドノード[0]の子ノードを調べる? (自分の解釈です。この[0]はなんなのでしょうか?) ●例えばトータルの最後尾から逆再生させるにはどんな式が必要でしょうか? ※mainasu = cnt-1; (間違ってるとはおもいますが、内容をまだ反映できないので確認ができません) ●初期値 // ストップ stop(); // カウント用変数 cnt の初期値を設定 cnt = -1; // XMLインスタンスの作成 myXML = new XML(); // 余分な空白などを削除 myXML.ignoreWhite = true; // XMLデータロード時の動作定義 myXML.onLoad = function() { // 変数 total にノードのトータル数を取得 _root.total = this.childNodes[0].childNodes.length; // フレーム2でストップ _root.gotoAndStop(2); }; // 外部 XML ファイルのロード myXML.load("my_data.xml"); ●2フレーム // カウント用変数がノード数-1より小さいとき if (cnt<total-1) { // カウントを 1 加算 cnt++; } else { // それ以外は 0 に戻す cnt = 0; } // テキストフィールド 「number_txt」に 番号を表示 _root.number_txt.text = myXML.childNodes[0].childNodes[cnt].firstChild.nodeValue; // MovieClipLoaderクラスのインスタンスを作成 myMCL = new MovieClipLoader(); // ロード監視用のインスタンスを作成 myObj = new Object(); // JPEG ロード完了時 myObj.onLoadInit = function(target_mc) { // load_mc にリンクを設定 target_mc.onRelease = function() { getURL(myXML.childNodes[0].childNodes[cnt].attributes.linkURL, "_blank"); }; // 再生開始 _root.play(); }; // myMCL のリスナーとして myObj を登録 myMCL.addListener(myObj); // JPEG をロード myMCL.loadClip(myXML.childNodes[0].childNodes[cnt].attributes.jpegURL, load_mc);

    • ベストアンサー
    • Flash
  • ActionScript3.0でエラーがでる

    初めまして、今非常に困っていましてどなたかお力を貸してください。 ActionScript3.0を使ってフルフラッシュサイトを作っているところなのですが、タイムラインの1フレーム目でローダーでrootを読み込み、終わったら2フレーム目(gotoAndStop(2)で)へ移動という形にしているのですが、ムービープレビューすると「Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。at Main()」 と出てしまいます。Mainはドキュメントクラスで外部asファイルに記述しています。 こんな感じで書いています↓ 『1フレーム目のタイムラインスクリプト』 stop(); ~中略~ if(info.bytesLoaded==info.bytesTotal){ if(load_mc.nowScene=="finish"){ Object(root).gotoAndStop(2); } } 『外部Main.asファイル』 package{ ~中略~ public class Main extends MovieClip{ ~中略~ public function Main() { addEventListener(Event.ENTER_FRAME, checkHandler); } function checkHandler(ev:Event):void { if (Object(root).currentFrame==1) {//フレームが1なのかを判別 return; } removeEventListener(Event.ENTER_FRAME, checkHandler); init(); } function init(){ ~中略~ } } } すみません、ホントはもっとあるのですがスクリプトが長過ぎて書ききれないのでざっくりですが、こんな感じです。 checkHandler()は、エラーが出ないように2フレーム目に来たらMain.asを参照できるようにしています。ほかになにかやり方があれば教えてほしいです。。。←なんとなくこれが怪しい気もするので。 一応こんな感じでも順調に作業出来ていたのですが、なぜか急にエラーが出始めました。 ムービープレビューすると先ほど書いたエラーメッセージがでて、画面がチカチカなり、1フレーム目と2フレーム目を繰り返しているような現象です。 いまMain.asファイルは2フレーム目にあるインスタンスを参照しているので、ドキュメントクラスを2フレーム目にきたら読み込ませる方法とかあるのでしょうか? すみませんホントに誰かご教授お願いします!!!

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

  • suzukaで携帯の待受時計を…

    suzukaで携帯の待受時計をFLASHで作成しているのですが、action scriptで、どうしても構文エラーになる箇所があります。 時間取得でhourが一桁の場合、十の位に0を追加したいのですが、 hr = fscommand2("GetTimeHours"); if (hr<10) {hr = "0" add hr;} ではおかしいでしょうか。 サイトで調べた結果、このような構文で処理可能となっていたのですが、どうしてもエラーがかかってしまいます。suzukaではそこまで出来ないのでしょうか・・・。お力添えお願い致します。

    • ベストアンサー
    • Flash
  • onClipEvent(enterFrame)よりもフレームに書いたほうが良い?

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

  • if文の分岐をelseにする事ができません。

    以下のような定義の構造体があります。 この構造体のメンバであるchar型配列Cが、 【実行】にあるようにif文で使われている時にelseの処理2を実行する事ができませんでした。 char型の変数だと、'\0'が入っていればelseとなるのですが、 配列となっているCにstrcpyで'\0'や0,NULLを設定してみてもelseにはなりませんでした。 この様なif文でelseの処理2を実行するにはどうすれば良いのでしょうか? 初歩的な質問かも知れませんが、回答頂けると幸いです。 【定義】 typedef struct { struct { char C[100]; }B }A 【実行】 static A* hoge; hoge = (A*)malloc(sizeof(A)); if(A->B.C) { 処理1 }else{ 処理2 }

専門家に質問してみよう