• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:納得できないactionscript2.0のサンプルコード )

actionscript2.0のサンプルコードについて理解できない部分があります

このQ&Aのポイント
  • 納得できないactionscript2.0のサンプルコードについて質問です。サンプルコードには変数loopがありますが、その必要性が分かりません。
  • 変数loopに関連する記述を削除しても挙動に変化がないため、意味がないように思えます。
  • 初心者ですので、変数loopの意味や必要性について平易な解説をお願いします。

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

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

ご質問の意味の方が納得できませんが...。 > 手元にあるテキストの説明によると、「loopの値がtrueならフレーム1に戻り、 > falseならフレーム移動を行わない」とありますが、 実際にそうなるでしょう? dolls.fla の フレーム1 のスクリプトの冒頭 -------------- var target_mc:MovieClip = dolls_mc; target_mc.stop(); var loop:Boolean = true; //abcMorphムービークリップを動作の対象にするnaviObjインスタンスを作る var naviObj:NaviFrame = new NaviFrame(target_mc, loop); ~略~ -------------- この3行目 var loop:Boolean = true; をこののままにしておけばループしますし var loop:Boolean = false; に変更すればループしません。 変数 loop はちゃんと生きて動作してます。 通常,クラスファイルは使うたびにその中身をイジって使うものではなくて イジらなくて良い汎用的なファイルとしてそのまま使い回しができるように作ります。 ※例えば最初からすでに定義されてあるクラス   (例:MovieClipクラス や Mathクラス や LoadVarsクラスなど)の   クラスファイルの中など一々見ませんし作り替えないでしょう? それがクラスのメリットです(Documentクラスを除く)。 dolls.fla の var loop:Boolean の値を true や false にするだけで, 「NaviFrame.as」自体は触ることなく全くそのまま同じ物が使えますよね。 そうするためにあるのです。 「NaviFrame.as」の21行目より引用し注釈を書き直します。 ---------------------  // 次のフレームへ移動するメソッド「next」を定義  function next() {    // もし現在の登録MCのフレームが最終フレームであれば    if (mc._currentframe == mc._totalframes) {      // なおかつ変数 loop が true であるなら      if (loop) {        // 登録MCをフレーム1に戻して停止        mc.gotoAndStop(1);      }      //↑★変数 loop が false であるなら何もしない      //  ということです(フレーム移動もしないということ)。    // もし登録MCのフレームが最終フレームに達していなければ    } else {      //次のフレームへ移動させて停止      mc.nextFrame();    }  } --------------------- ↑変数 loop の存在意味は大アリです。 ただ最初から, 「ループ再生するものだけ限定としてクラスを作る」 または 「ループ再生しないものだけ限定としてクラスを作る」 というのでしたら変数 loop は不要です。 ただしその場合,ループするしないを変更しようと思うと, 「NaviFrame.as」 を作り替えるとか 「NaviFrameDoLoop」 クラスと 「NaviFrameNotLoop」 クラスのような2つを作っておかなければならないという事態になってしまいます。 つまり汎用性に欠ける出来の良くないクラスとなります。

147-so
質問者

お礼

>変数 loop が false であるなら何もしない >ということです(フレーム移動もしないということ)。 まずif構文などの基本的な部分の理解がたりなかったみたいですね。 コメント付きのスクリプトで丁寧に解説していただき、ありがとうございます。 クラスの拡張性を考慮していなかったので、 わざわざloopでの条件分岐を付け加える意味が分からなかったのですが、 ようやく理解できました。

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

その他の回答 (1)

  • cspl
  • ベストアンサー率83% (55/66)
回答No.1

結論から言うと変数loopに意味はあります。 仰る通り、ループのするしない、という仕様が最初からどちらかに決まっていて、 この先もどちらか一方しか使用しない、ということが前提であれば if(mc._currentframe == mc._totalframes) {……} この部分の条件分岐だけで事足りますね。 しかし、こういった類のクラスファイル(ここではNaviframe.as)は 後の仕様変更によっても極力いじらなくても済むように作る必要があります。 たとえば、「今は最後の画像の次に1枚目の画像を表示させてループさせているけど、後からループさせないように変更することになった」場合、クラスファイルをいじらずに、fla内に定義されている変数loopの値をfalseにするだけで、クラスファイルの中身を知らない人でも簡単に更新することができるわけです。 また、これは配布されているファイルなので、いろんな人のニーズに合うように汎用的に作らなければならない、ということもあります。 要はクラスファイルをいじることなく、外側からカスタマイズするための変数だと思っていただければいいと思います。 納得いただけましたでしょうか。

147-so
質問者

お礼

ありがとうございます。 例題のスクリプトを理解するので一杯で、 先々変更を加えたりする可能性までは考えが及んでいませんでした。 言われてみると、loop変数があったほうが変更はしやすそうですね。 自分が同じようなものを一から作ることになったとき、こういう考えができるか心配ですが。。

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

関連するQ&A

  • マウスホイールで地球儀を回転させたい

    質問です。 下記のスクリプトは地球儀をマウスで回転させるという物なのですが、 これをマウスホイールで回転させるためにframeにxmouseの値ではなくonWheelMouseの値を与えたいのですが、記述の仕方がわかりません。 知恵を貸してください。 on (press) { function run(mc) { cur = Math.floor((_xmouse - w1) / 10); pre = !pre ? (cur) : (pre); frame = cur - pre; frame = frame > 4 ? (4) : (frame); frame = frame < -4 ? (-4) : (frame); if (mc._currentframe + frame >= mc._totalframes) { mc.gotoAndStop(1); } // end if if (mc._currentframe + frame <= 1) { mc.gotoAndStop(mc._totalframes); } // end if mc._parent.b.gotoAndStop(mc._currentframe + frame); mc.gotoAndStop(mc._currentframe + frame); pre = cur; } // End of the function mm["t" + mm.OnName].WCD_Move({_alpha: 0}, {speed: 0.500000}); var w1 = this._width / 2; _parent._parent.rotate = false; intervalID = setInterval(run, 10, this); } on (release, releaseOutside){ pre = cur = false; clearInterval(intervalID); }

  • もう少しでは無いかと思うのですが・・・(長文です)

    初めまして この度Flash8で仕事を始めて行っており、 本などを拝見しながら少しずつは前進しておりましたが とうとう解らなくなり、こちらへの投稿となりました。 ****************************************************** ・現在行っている作業内容をご説明いたします。 画像が3枚・ボタンが「進む」「戻る」1つずつ ボタンを押下した際に画像が切り替わります。 画像名:1枚目「weddingA_mc」 2枚目「weddingB_mc」 3枚目「weddingC_mc」 ボタン名:「next_btn」「back_btn」 ・例えば「next_btn」を押した時に 「weddingA_mc」から「weddingB_mc」へ切り替わります。 その際に単純に画像が切り替わるのでは無く だんだん透明になって行き次の画像に変わると言う事 をしたいのですが・・・(アルファ値を35に設定してます。) ******************************************************** メインのタイムラインに記述しておりますActionScriptです。 var target_mc:MovieClip = weddingA_mc; terget_mc.stop(); var loop:boolean = true; var naviObj:NaviFrame = new NaviFrame(terget_mc, loop); next_btn.onPress = function() { naviObj.next(); }; back_btn.onPress = function() { naviObj.back(); }; ********************************************************** 次に本を参考にしたのですがカスタムクラスのNaviFrameクラス を書きました。 ActionScriptファイルを作り、先ほどのムービーファイルと 同じ階層に保存しました。 下記がそのActionScriptです。 class NaviFrame { var mc:MovieClip; var loop:Boolean; } //コンストラクタ function NaviFrame(target_mc:MovieClip,loopMode:Boolean) { mc= target_mc;  loop = loopMode; } // //次のフレームへ移動する function next() { if(mc.currentframe == mc._totalframes) { //ループするなら先頭のフレームへ戻る if (loop) { mc.gotoAndStop(1); } }else{ //次のフレームへ移動して止まる mc.nextFrame(); } } //手前のフレームへ移動 function back() {   if (mc._currentframe == 1) {     //ループするならば最終フレームへ戻る     if (loop) {       mc.gotoAndStop(mc._totalframe) ; }   }else{ //手前のフレームへ移動して止まる   mc.backFrame(); } } こちらを動かしてもぐるぐるループするだけで 何も動かず延々回っている状態です。 どなたかご意見・ご指南いただければと思っております 何卒、宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • 【ActionScript】ムービークリップ間の変数の受け渡しのやり方は?

    ムービークリップ間の変数の受け渡しがいまいちわかりません。 例えば、 ・_root.mc1 及び、 ・_root.mc1.mc2 というインスタンスがあった場合、 _root.mc1.mc2 のフレームに a = 100; と書き、 _root.mc1 のフレームに trace(_root.mc1.mc2.a); と書いても「undifined」と出るだけです。 (上層の値を下層で受けることはできるんですが、この例のように下層→上層の受け渡しはできないのです。) どうすればインスタンス間の変数の受け渡しができるのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • GUI入門書のサンプルコード

    JavaのGUIをやってみようと思い中古で本を買ってきたのですが、 その中のサンプルコードが意味がわからない上にコンパイルエラーを起こすので 誰か解説をお願いします。 OS:Win Vista、それとJDK7です。 以下がソースコードとコンパイルエラーになります。 import java.awt.*; import javax.swing.*; import java.awt.event.*;    //サンプルではActionListenerを使うのに抜けていた public class MyButton { ____JButton button; ________//※1 何故ここで宣言しているのか ____public static void main(String[] args) { ________JFrame frame = new JFrame("MyFrame"); ________Container pane = frame.getContentPane(); ________JButton button = new JButton("MyButton");________//※1 何故ここにもあるのか ________button.addActionListener(new MyActionListener()); //※2 MyActionListenerクラスはstaticでないので使用できない ________pane.add(button); ________frame.setBounds(100, 50, 300, 200); ________frame.setVisible(true); ________frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ____} ____class MyActionListener implements ActionListener { ________public void actionPerformed(ActionEvent e) ________//サンプルではpublicが抜けていた ____________if(e.getSource() == button) ________________System.out.println("button was pressed"); ________} ____} } /* MyButton.java:13: static でない 変数 this を static コンテキストから参照すること はできません。 button.addActionListener(new MyActionListener()); ^ エラー 1 個 */

    • ベストアンサー
    • Java
  • 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
  • AS3:ルートの変数とムービークリップ内の変数について

    AS3:ルートの変数とムービークリップ内の変数について ルートのタイムラインで設定した変数var RootVarがあるとして、これをあるムービークリップMCからMovieClip(root).RootVarで読み取って、MC内で何か処理をしたときMovieClip(root).RootVar++;とやってもルートのRootVarの値は変わりません。 例えば、 ■ルートのタイムライン1フレームに記述 var RootVar:uint; if(RootVar>=3){ trace("できた!!"); } ■ステージにあるムービークリップMCのタイムライン1フレームに記述 MovieClip(root).RootVar=0; var AddTimer:Timer = new Timer(1000,3); AddTimer.addEventListener(TimerEvent.TIMER,AddNum); AddTimer.start(); function AddNum(eventObject:TimerEvent):void { MovieClip(root).RootVar++; } ルートからムービークリップ、ムービークリップからルートへ変数に値を渡したり受け取ったりはできなのでしょうか? 変数の扱い方が問題なのでしょうか?よろしくお願いします。 環境:AS3、Flash CS4

    • ベストアンサー
    • Flash
  • actionscript3.0 rotationについて

    actionscript3.0 rotationについて btnを押すごとにmcを時計回りに90度減速させながら回転させたいと思っています。 しかし2回ボタンを押して180度回転させるまではうまくいくのですが 3回目に270度になると、回転がとまりません。 分岐させて、-90度回そうと思うと(当たり前ですが)逆回転してしまいます。 どのように記述すればよいでしょうか? よろしくお願いします。 以下スクリプトです。 var i:int=0; function onEnter(event:Event):void{ mc.rotation += (i-mc.rotation)*0.1; } addEventListener(Event.ENTER_FRAME, onEnter); btn.addEventListener(MouseEvent.MOUSE_DOWN, MouseLDownFunc); function MouseLDownFunc(event:MouseEvent):void{ i+=90; };

    • ベストアンサー
    • Flash
  • ActionScript2.0でインスタンス名を変数に格納することが可

    ActionScript2.0でインスタンス名を変数に格納することが可能なのかが、よくわかりません。 RPGゲームを作っているのですが、4種類のアバターから自分が冒険に使いたいアバターを選択し、そのアバターでその後の冒険をすすめていく ということをしようと考えています。 こうなると、 if(1のアバターが選択(クリック)されたら){ 変数aにアバター1_mcを代入する }else if(2のアバターが選択(クリック)されたら){ 変数aにアバター2_mcを代入する } という処理にし、後で aを表示 という呼び出し方になるのかなと思い、何度も試してみたのですが、ぜんぜん思うようにいきません。記述の仕方もわからない状態です・・・単なるAS2の勉強不足なのですが、何かこの方法でも他の方法でもいいやり方があったら教えていただきたいのですが・・・;_; よろしくお願い致します!

  • 変数の配列の使い方教えてください。(初心者)

    VBで関数を作ってるのですが、 Function kansuu as Long Dim a(50) as Long Do (処理) Loop End Function ↑こんな形になってまして、変数a(0)~a(50)にはそれぞれ値が入ってます。{a(50)まで全部使うとは限りません。} Do文を抜ける条件として、途中に「もしa(0)~a(50)の値が全て"0"ならDo文を抜ける」という処理を入れたいのですが、変数aの"配列要素全て"という文の記述方法が分かりません。どなたか教えてください

  • VBA コードについて

    MajorUnitというコードがありますがこれはどのような意味を持つのでしょうか? 調べたのですがよくわからなかったので質問させていただきます。 Dim 変数 As Seriesというコードも意味を教えていただけると助かります。