ASを使いたい
 
アクションスクリプト初級
よくある質問
AS基礎
だめな基本特殊な表記
カーソル、マウス
ボタン+
キーボード
サウンド関係
テキスト関係
文字列の操作
乱数配列変数
やりたいこと別
ムービー支援AS

 
アクションスクリプト初級
 
よくある質問
 
AS基礎
 
だめな基本
 
特殊な表記
 
カーソル、マウス
 
ボタン+
 
キーボード
 
サウンド関係
 
テキスト関係(テキスト出力)
 
文字列の操作(String型)
 
乱数
 
配列
 
変数
 
やりたいこと別
 
ムービー支援AS
 
 
よくある質問
 
ASを学ぶのにお勧めのサイトは?

 
ASって難しくない?/大変じゃない?
  • FlashのASでやりたいことがあるから覚えるわけで。
    ASが使えればよりインタラクティブな、あるいは実用的なFlashが作れる。
    ASが全く分からなくても問題ない。

  • 他のプログラム言語に比べれば気軽に打てる。
    グラフィック、アニメーションと親和性が高く、手軽に動きのあるゲームやサイトを作れる。

  • 本格的にやると難しいし、大変。
    やりたいことに向けて頑張ってみるか、無理だと諦めるか。本人次第。
    学校の授業じゃないのだし、気軽に。

 
if for while switch Array の使い方について教えて/がうまく動かない
  • そのくらいは自分で学ぶ。
    ASを使ううえで常識なので、本やwebサイトのサンプルを見ながら書いて実際に動かしてみて、慣れるしかない。

    まずは、何かをやりたいという気持ちは抑えて、とりあえずサンプルを動かしてみる。
    次にサンプルを改造して、思い通りに動かせるようにする。
    慣れてきたら、複数のサンプルを組み合わせて動かしてみる。
    そのうち、何と何を組み合わせれば、目的のことができるのか分かるようになるので、それまでは耐える。
    そういう手順が面倒ならば、金払って作ってくれるとこに依頼しれ。
     参考:ASを学ぶのにお勧めのサイトは?

 
〜の本/webにあるスクリプトのこの部分は何をしてるの?
  • そこの気になる部分をコメントアウトして、何が起こらないのか考えてみる。

  • いろいろ実験してみて、それぞれの違いを上げて、細かい違いについての質問ならば歓迎。
 
だめな基本
  •  「+=」とか「-=」って何?
    代入演算子
    hoge += 10;は
    hoge = hoge + 10;
    と、同じ意味。

  •  「++」とか「--」って何?
    インクリメントとディクリメント。
    hoge ++ならば、実行してから+1。++ hogeならば、実行する前に+1。

  •  「* .8」ってどういうこと?
    * 0.8
    整数が0の少数は、整数部分を省略できる。省略する書き方が一般的。
    hoge=0;の0は省略できない。

  •  var hoge = 0;の「var」は何?
    変数の定義をしている。主にfunctionの中で使う(ローカル変数として定義)。
    functionを抜けるとローカル変数は消えるのでメモリの節約と、誤動作の防止になる。
     発展:varをつける理由は?

  •  「;」て省略してもいいの?
    省略しても動くが、しないほうがよい。
    意味としては改行みたいなもの。
    xxです;と一行を終わらせるためのもの。
    hoge = 1;hage = 2;
    のように1行に複数のステートメントを書く場合、省略できない。

  •  hoge=0は、hoge = 0のように、半角スペースは入れなければいけないの?
    入れなくても良いが、見やすくするために入れておいたほうがよい。
    if(hoge=0&&this._x<0){
    for(var i=0;i<10;i++){f_test (i);};
    }
    よりも、
    if (hoge = 0 && this._x < 0){
    for (var i = 0; i < 10; i ++) { f_test(i); };
    }
    のほうが見やすいでしょ?

    また、
    hoge . _x = 100;
    のような表記も可能。

    他にも、
    Math.floor(Math.random()*10+1);
    を分かりやすくするために、スペースを多く入れて、
    Math.floor(     Math.random()*10 +1     );
    見やすくすることもできる。

    勿論、変数であるhogeを、ho geのように書いてはいけない。
    同様に、「++」や「>=」の間にスペースを入れてはいけない。

    また、いくら横に長くなったからといって勝手に改行を入れてはいけない。

    str_message = "とにかく、長くだらだら書きます(中略)1行じゃ収まらないので改行いれてもいいのですか?";
    のような場合に、勝手に改行を入れると、
    str_message = "とにかく、長くだらだら書きます(中略) ;
    1行じゃ収まらないので改行いれてもいいのですか?";
    のようにステートメントが終わったことになってしまう。
    このまま利用すれば、"が終わってないぞ!、日本語でAS書くなボケぇ!といった、エラーが出る。

  •  変数とパスが良く分からない/trace(変数名);すると、undefinedになってしまう
    面倒なことを覚えたくない場合は、
    全ての変数に_rootをつけて、_root上だけで変数を管理すれば簡単に取得や変更ができる。

    _root.hoge=0;
    if(_root.hoge==1){
    //条件一致したときの処理の内容〜
    }

    いいやり方ではないが、とにかく変数を使いたいだけならば、これでOK。

     発展:パスについて少し詳しく

  •  functionて何?
    命令を一まとめにして便利にするもの。

     発展:functionについてあれこれ

  •  forでループすると、予定より1回多かったりして困る

    for( i = 0; i < 10; i ++){};

    だと、 iを0から始めて、「i < 10」の間ループする、iはループにつき、1増えるという条件。
    0から9の間ループするので、10回。
    要するに、条件式(i < 10)がtrueの間はループをするということ
    1から10まででループさせたいのなら、

    for( i = 1; i <= 10; i ++){};

  •  forでアルファを変化させたけど、効果がない
    一瞬で処理が終わってしまう
    タイムラインに沿ったアクションをさせたい
    forは一瞬で終わってしまう。
    タイムラインに沿った反応は、
    enterFrameやsetIntervalを使う

    参考:毎フレーム実行/何秒後に実行(enterFrameとsetIntervalについて)

  •  hoge()とかあるのだけど、ヘルプを検索してもそんなメソッドはないよ?
    ユーザーの定義したメソッド(命令)
    どっかに、funciton hoge(){〜}という感じで、定義しているはずだから、ASの中を探してみれ。

   
特殊な表記
  •  for (var idx in obj)って何?
    objに入る、MCや配列、プロパティについてidxで順番に実行していく。
    var arr = ["a", "b", "c"];
    for(var idx in arr){
    trace("idx = " + idx + " typeof idx:" + typeof(idx) + " value:" + arr[idx]);
    }
    ※順番が降順になるのと、idxが文字列になっていることに注意。
    idx ++はできない、idx + 1は文字列の連結になってしまう。

     参考:多元配列(idx in Arrの使用例)
     参考:全てのMCを止める(idx in Arrの使用例)


  •  if(flag) って何?
    ifのあとの括弧の中身は、条件式が、(flag==true)のような場合、省略できる。

    flag = true;
    if(flag){
    trace("flagは真です");
    }

    flag=1の場合でも、結果は真になる。
    また、if(flagA && flagB)のような書き方も可能。

  •  x = flag ? 0 : 100; ってどういうこと?
    条件式

    if(flag){
    x = 0;
    } else {
    x = 100;
    }

    と同じ意味。MX以降
    無理に使う必要はない。
  •  if(hoge == 0)hoge = 10;ってどういうこと?/{}を省略
    {}の中身が、一行の場合(hoge = 10;というような1行のステートメントだけの場合)、
    {}を省略できる。

    if(hoge == 0){hoge = 10;}
    を省略すると、
    if(hoge == 0)hoge = 10;
    ※ただし、
    if(hoge == 0)
    hoge = 10;
    のように改行が入ると、別物として、hoge = 10がifに関わらずに実行されてしまう。
    上級者が自分専用で、人が絶対に見ない条件で、分かってて使う程度。
    省略できるからと楽だとか、安易な気分で使うな。むしろ、普通の人は使用禁止


  •  if(!hoge)ってどうなってるの?
    論理演算子
    結果をひっくり返す効果がある。
    hogeがtrueならば、!hogeはfalseである。

    hoge = true;
    trace( hoge );
    trace( ! hoge );

    true
    false
    が返ってくる。

    hoge = !hoge;
    と書けば中身を簡単にひっくり返せる。


  •  A,B,C = 0;てどういうこと?
    A=0;
    B=0;
    C=0;
    をまとめて代入できる。以上
  • 名前のない構造体リテラル

    a = {foo:function(){trace("foo")},bar:function(){trace("bar");}}

    は、以下と同様の意味

    a = new Object();
    a.foo = function(){trace("foo");}
    a.bar = function(){trace("bar");}


 
 
 
ASが動かない
 
スクリプトをコピペしたけど、動かない
  • 全角のスペースが入っていないか調べる。
    「 」←こんなの。インデント(見やすく整形)されてる場合、高確率で混入してる。

  • 行の最後に半角スペースが入っていないか調べる。
    webからのコピペだと基本的に入っている。
    コピペせずに、手でタイプしたほうが学習効果が高いのでお勧め。

  • MX2004のAS2.0のスクリプトを、MXや5で使っていないか。
    良く分からないものを使うな。エラーも出てるはず。
    分からない言葉を検索してみて、理解できないのならレベルが足りてないと見送る。
     参考:AS2.0について

 
エラーが出る
  • タイプミス、{}()""あたりの閉じ忘れがないか調べる。
    要するに、初歩的な間違いがあるから直せ、ということ。
    当然、エラー部分以降のスクリプトも実行されない。
    エラーを見て自分で考える。問題外

  • よくあるエラーと対策
    • シーン = シーン (中略):ステートメントは on/onClipEvent ハンドラ内でなくてはいけません。
      >>MCを選択して書くAS(シンボルアクション)は、on()かonClipEvent()で書き始めろ。ってこと
      >>this.hoge=0;とか、functionを書きたければ、onClipEvent(load)に書く。
      >>onClipEventハンドラは、MCが登場したとき、毎フレーム、消えたときなどの動作を指示する。
      >>onハンドラは、ボタンは押されたとき、カーソルを乗せたときなどに始めて実行される。
       参考:ASを書く場所

    • シーン = シーン (中略):シンタックスエラー
      シーン = シーン (中略):ステートメントブロックは '}' で終了してください。
      シーン = シーン (中略):予期しない '}' があります。
      シーン = シーン (中略):')' または ',' が必要です。

      >>大抵は、()とか{}たりねーよ。ってこと
      >>引数(Math.Pow(x,2)、の「x,2」の部分)が足りていないことがあるので探す。(Math.Pow(x)のように書いているとき)
      >>エラーで表示されている場所(行番号)とは違う部分で足りていないことが多い。大抵、それより前に問題がある。構造を見直してみる

    • 内部エラー
      >>滅多におこらないけど、一応
      >>大抵は負荷による処理能力不足などで偶然発生
      >>同じ場所で繰り返し発生するならば、バグを発見したことになるのでMacromedia社に報告する。

     参考:
     参考:エディタを使う


 
MCが動かない/反応しない
  • ちゃんとパスが通っているか?
    • 動かしたいMCにtrace(this);を書いて実行してみる。
       _level0.instance1.instance2のように表示されるなら、MC名がついていない。

      trace()すら動かない場合は、MC(インスタンス)のタイプが「グラフィック」になっている可能性がある。「ムービークリップ」にする。

    • ターゲットパスの挿入でMCの階層を確認する。
       階層がよく分からないなら、絶対パスで挿入してみて、階層の関係と書き方を覚えるといい。

    • thisをつけてみる。_rootから絶対パスで入力する。
       thisはおまじない程度。うまくいくこともある。
      慣れてきたら、なぜthisが必要だったのかを考えてみる

  • function()内に、trace("(functionの名前)、実行!")と書いて、ちゃんと命令が実行されているか確認する。
     スペルミスとか。

  • if、条件式を疑ってみる
    • 条件式のよくある間違い
      • if(hoge = 0)
         条件式の等しいは、「==」。
        >>if(hoge == 0)
      • if(hoge == HENTAI)
         hoge="HENTAI"のように文字列として代入しているのなら。
        >>if(hoge == "HENTAI")
        HENTAIという未定義の変数の値と比較してもどうしょうもない
        trace(HENTAI);してみるとよく分かる。undefinedが返ってくる。
      • if(0 <= hoge & hoge <= 100)
         両方とも真である場合(AND)は、「&&」
        >>if(0 <= hoge && hoge <= 100)
         ちなみにORは「||」(Shift押しながら¥)
        >>if(A == 0 || B == 0)

    • 動作が怪しい変数を、trace(変数名) してみる。
       undefinedが返ってきたらスペルミスの疑い
       あるいは、hoge == 1;のような代入のミスをしてる可能性がある。
       予想外の数値が返ってきたら、その変数名でスクリプトを検索してミスを探す。

    • 変数の型をtrace(typeOf(変数名))で調べる。
       数字ならNumber、文字列ならStringが帰ってくる。

  • 動かない部分をあえてコメントアウトしてみて、他所でミスがないか試す。
     どうしても原因が分からなかったら、もう一度書き直してみるとうまくいくことも。

  • 慣れてきたら、trace()を書くのが面倒になってきたら、デバッガを使う。
    使い方が分かるまで大変だが、一度覚えると快適なデバッグができるようになる。食わず嫌いはイクナイ
     参考:デバッガを使う
 
 
 
AS基礎
 
ASを書く場所
     
  • フレームアクション、クリップアクション、ボタンアクションの違い

    フレームアクション
    タイムラインがASの書いてあるフレームに来れば実行される。
    キーフレームを挿入して、タイムラインに書く。
    「▽アクション − フレーム」となっているのを確認して書くように

    特に難しいことはない。
    this.stop();とか。

    出来るだけ、AS専用のレイヤーを用意して、「Script」などの分かりやすい名前を付けて、レイヤーに何か置いたりしないように、レイヤーをロックして利用するとよい。

    クリップアクションは、
    ムービークリップの上に書くような状態。
    MCを選択してから、onClipEvent()などの中に書く。
    「▽アクション − ムービークリップ」となっているを確認して書くように

    タイムラインがないので、毎回、自分自身を実行するenterFrameで利用したりする。
    勝手にやってね、という、ある種の気楽な存在。
    その反面、実行されるタイミングや順番、MCが消えると内部の変数も消えてしまうなど、扱いが難しい面も。

    ボタンアクションは、
    そのままボタンに書く
    「▽アクション − ボタン」となっているのを確認して書くように

    on()の後に書く。
    ボタンが押されたら、何をするという使い方。
    on(press){〜}

    ボタンのthisは、一つ上のMC(インスタンス)を指す。
    ボタンに書かれたthis.stop();は、そのボタンの置いてある(大抵は_root)の、this.stop();になる。
    ボタンには、タイムラインがないことがポイント

    クリックしたら次の画面に進むものや、
    マウスを乗せると回転するなど、比較的簡単にユーザーの動きに反応するムービーを作れる。
    まずはボタンから慣れていくとよいかも。

    ※MXから、クリップアクションとボタンアクションは、まとめてシンボルアクションと呼ぶようになった

     

  • フレームアクションを使ってみる

     参考:タイムライン操作
     発展:functionについてあれこれ

     

  • クリップアクションを使ってみる

     参考:Now Loadingに一工夫する(クリップアクションの使用例)

    毎フレーム、横に10移動する

    onClipEvent(enterFrame){
    this._x += 10;
    }

    1から100までカウントする。
    消去されると、変数を消去する。

    onClipEvent(load){
    count = 0;
    }

    onClipEvent(enterFrame){
    if(count >= 100){
    count = 100;
    }else{
    count ++;
    }
    }

    onClipEvent(unload){
    delete(count);
    }

    MCにfunctionを定義、キーが押されると実行

    onClipEvent(load){
    function missileFire(){
    //処理
    }
    }
    onClipEvent(keyDown){
    this.missileFire();
    }

    複数のイベントを定義

    onClipEvent(keyPress){
    //処理 nextPage();とか
    }
    onClipEvent(MouseDown){
    //処理 nextPage();とか
    }

     

    • クリップアクションのイベント
      • load タイムラインに登場したら実行。functionもここで定義
      • enterFrame (loadの次フレから)毎フレーム実行する
      • unload タイムラインから消えた、次のフレームで実行する

      • mouseMove マウスが移動したとき
      • mouseDown マウスが(画面のどこかで)押されたら
      • mouseUp マウスが(画面のどこかで)離されたら

      • keyDown キーボードのキーが押されたら
      • keyUp キーボードのキーが離されたら

      • data loadMovie()などでデータが受信されたら
     
  • ボタンアクションを使ってみる

    最初のフレームに戻る(リプレイボタン)

    on(press){
    _root.gotoAndPlay(1);
    }

    マウスがのると、反応する
    MC1というMCを再生/停止する例

    on(rollOver){//マウスが乗ったら再生
    _root.MC1.play();
    }
    on(rollOut){//マウスが外れたら停止
    _root.MC1.stop();
    }

    ボタンのthisは、置かれているMCを指す。
    少し特殊なので注意。

    ドラッグできるようにする

    on(press){
    this.startDrag();
    }
    on(release,releaseOutside){
    this.stopDrag();
    }

     
    • ボタンアクションのイベント
        (ボタンの上で)
      • press マウスが押されたら
      • release マウスが離されたら
      • releaseOutside (ボタンの上以外で)マウスが離されたら

      • rollOver カーソルがのったら
      • rollOut カーソルが外れたら

      • dragOut ドラッグされたら
      • dragOver ドラッグされて、またボタンの上に戻ってきたら

      • keyPress"a" "a"のキーが押されたら
         関連:キーコード一覧>>ヘルプ嫁。あるいは「Flash キーコード一覧」とかで検索汁
   
名前(インスタンス名)をつける
  • ステージに置かれたMCを操作するには、名前を付けて、指示を出す
    名前がなければ、誰に指示を出すのか分からない。

    MCname.stop();

    と書く場合、MCnameという名前(インスタンス名)のMCがなければならない。
    ※インスタンス名は、ライブラリの中にあるシンボルの名前のことではない。
    ライブラリから、MC(シンボル)を配置し、その後、つけた名前のこと。

    一度名前をつければ、

    MCname._alpha = 50;

    と書けば、MCnameの透明度を50にするという効果が出る。
   
パスって何?/_rootとかthisとか_parentて何?
  • パス
    MCに名前(インスタンス名)をつけると、
    その名前で操作することができるようになる。名前のつながりがパス

    oyaというMCの中にある、koというMCを停止するには、
    oya.ko.stop();
    koというMCの中の"dance"というフレームラベルから再生するには、
    oya.ko.gotoAndPlay("dance");

     参考:MCを動かす、反応させる

  • 変数とパス
    _root.oyaのタイムラインで、hensu = 0と定義して、
    _root上でtrace(hensu)などと書いてもundefinedしか得られない。
    _root.oya.hensuとしてアクセスしなければならない。

    _rootには、hensuはない。
    定義していないのだから、あるわけない。

    oyaだけのhensuとして定義している。
    要するにthis.hensuと書くのは、そのMCのhensuという意味。
    よく分からなければ_rootから始めるフルパスで書くように

     発展:MCと変数のパス(細かい解説)

  • _root
    大元のタイムライン。
    ※trace(this);をすると、_level0になるが、_rootと同じ意味と思っておけば、とりあえずは問題なし。

  • this
    そのMC自体。

     発展:thisって省略していいの?

  • _parent
    一つ上のMC。htmlでいう、「../」

    _rootで始まる絶対パスで書いてみる。
     例:this.hoge=0;>>_root.oya.hoge=0;
     例:_root.giko.gotoAndPlay(10);

     参考:ボタンを使ってMCを反応させる(フルパスで記述した例)

    うまく行かないときは、trace(this);してパスを確認する。

     参考:MCが動かない/反応しない
     参考:trace()を使う(trace()の使い方の例あり)

    「ターゲットパスの挿入」で、パスの構造と書き方を理解する。

     発展:パスについて少し詳しく

 
MCを動かす、反応させる
  • MCを動かす
    MCに、gikoという名前(インスタンス名)をつけたら、
    giko._x = 10;
    で、gikoのxは10の位置になる。

  • MCのタイムラインを動かす
    giko.gotoAndPlay(10);
    と書けば、gikoというMCのタイムラインのフレーム10から再生する。

  • MCを消す
    MCにobakeという名前を付けたら、ボタンが押されたときなどに、
    obake._visible=false;

  • 実際に利用するには…
    ゲームなどの徐々に動く、反応するといった動作を行うには、
    enterFrameなどで毎フレーム実行して、位置を変更することで動かすことができる

     参考:毎フレーム実行/何秒後に実行

    キーボードで反応して欲しければ、上記のenterFrameに合わせて、以下を参考に。
     参考:キーを押すと反応

    あるフレーム(番号)に来たら実行して欲しければ、実行したいタイムラインにキーフレームを打って、記述する。
    ボタンで反応したければ、ボタンの動作に記述する。
     参考:AS基礎
     参考:ボタンを使ってMCを反応させる(着せ替えを作る)

    スイッチのようなことがしたければ、現在の状態を記憶する変数を用意する。
     参考:スイッチ/オンオフできるボタン(ちょっと難易度高め)

   
フレームラベル
ラベルには、2byte文字(日本語)は、使わない。(ASで飛ばす目的があるのなら)

this.gotoAndPlay("Start");

のように、""ダブルクォテーションで囲んで、文字列として指定する。

this.gotoAndPlay(Start);

だと 変数Startの値のフレームに飛ぶという意味になるので注意。
大抵は、Start = undefinedなので、
this.gotoAndPlay(???);
となってしまい、実行されなくなる。

 発展:変数などのルール(ラベルでも基本は同じ)

   
タイムライン操作
     
  • 再生、停止
    ボタンが押されたら再生する。(_root上のタイムラインを)

    on(press){
    _root.play();
    }

    再生を停止する

    _root.stop();

    _rootにある、xxxというMCを停止する

    _root.xxx.stop();

    ラベル"Start"から再生する

    _root.gotoAndPlay("Start");

     参考:フレームラベル

    シーン2のフレーム10から再生

    _root.gotoAndPlay(2,10);

     参考:パスって何?
     発展:パスについて少し詳しく

     

  • 目的のフレームから再生
    フレーム10から再生

    _root.gotoAndPlay(10);

    ボタンを押したら、フレーム1から再生

    on(press){
    _root.gotoAndPlay(1);
    }

    フレーム10で停止

    _root.gotoAndStop(10);

    1フレーム前に戻る(nowLoadingなど同じ命令を実行したいときに)

    _root.gotoAndPlay(_currentframe-1);

     発展:知らないとはまる罠  

  • コマ送り
    押すと次のフレームで停止する

    on(press){
    _root.gotoAndStop(_root.currentframe + 1);
    }

    押すと前のフレームで停止する

    on(press){
    _root.gotoAndStop(_root.currentframe - 1);
    }

 
   
毎フレーム実行/何秒後に実行
     
  • enterFrame
    シンボルアクションとして

    onClipEvent(enterFrame){
    this._x += 1;
    }

    横に移動。(毎フレーム、_xを増加する)

    イベントハンドラメソッドとして(MX以降)

    MC.onEnterFrame = function(){
    MC._x += 1;
    }

     参考:ASを書く場所(基本)
     参考:クリップアクションを使ってみる
     参考:スライドバー(onClipEvent()の使用例)
     参考:徐々に音を大きくする、小さくする(this.onEnterFrameの使用例)
     

     発展:this.onEnterFrameやthis.onPressって、
    onClipEvent(enterFrame)や、on(Press)とどう違うの?
    (それぞれの違いを解説)


     
  • setInterval
    MX以降から。

    hoge = 0;
    function siTest() = {
    trace ( hoge ++ );//テスト用。ここに実行したい処理を書く
    };
     
    siID = setInterval(siTest,1000);

    この場合、1秒(1000ミリ秒)ごとにsiTestを呼び出す。

    ただし、このままだと、ずっとsetIntervalが実行されてしまうので、

    clearInterval( siID );

    必要がなくなったら消す。
    siIDはどのsetIntervalかを区別するための変数。名前はなんでもいい。中身は、1とか2というような数値が入っている


    setIntevalの実際の使用例
    10秒後に再生する

    function siTest() = {
    play();
    clearInterval( siID );
    };
     
    siID = setInterval(siTest,10*1000);

    10秒後にsiTestを呼び出し、
    その際に、setIntervalを削除する。


    上記をさらにまとめたもの。

    siID = setInterval(
        function (){
            play();
            clearInterval( siID );
        }
    ,10*1000);


     参考:タイプライター(setIntervalの使用例)

 
   
trace()を使う
     
  • とりあえず使ってみる
    (パブリッシュプレビュー画面で)変数の値を表示する

    hoge = 0;
    trace( hoge );

    hoge="テスト"
    trace( hoge );

    _xmouseの座標を表示する(予定通りの動作をしない変数を調査するときに)

    trace( _xmouse );

    変数の型を調べる

    hoge = 0;
    trace( typeOf( hoge) );

    hoge = "テスト"
    trace( typeOf( hoge) );

     参考:文字列の操作、String型について


     
  • trace()を使う場面
     

    • デバッグ

      マウスの座標を、this._xmouseで取得しているが、うまく動作しない場合。
      MCの中のenterFrameでtrace(this._xmouse)してみると、
      _xmouseは、そのMCの中心からの座標を示していた。
      _root._xmouseと書くことで思い通りの結果が得られことが分かった。

      MCにfunction、hogeをメソッドとして定義したが、なぜか動作しない場合
      function内に、trace("funciton hoge 実行!");と書いてみると、
      実行はされていることが分かった。
      その後、変数をtrace(hensu);してみたところ、undefined。
      変数のスペルが間違っていることが分かった。修正すると、正常に動作した。

      trace(hensu);すると、ちゃんと数字が表示されるのに、
      ifの評価式でif(hensu==10)のように判定しようとしても動作しない場合

      trace(typeOf(hensu));してみると、
      Stringと返ってきた。
      hensuの代入式の中にString(文字列)が入っていることが原因だった。
      代入式を見直すか、Number()を使うことで解決できることが分かった。

       

    • 確認、理解

      moji = "aa bb cc";
      moji = moji.split(" ").join("");
      trace( moji );
      とすると、「aa bb cc」が「aabbcc」になるようだが、理由が分からないとき
       
      moji = "aa bb cc"
      moji = moji.split(" ");
      trace ( moji );
      結果は、aa,bb,cc
      splitは指定した文字を「,」に置き換えていることが分かる
      実際には配列にしているのだけど
       
      更に、
      moji = "aa bb cc"
      moji = moji.split(" ");
      moji = moji.join("");
      trace ( moji );
      結果は、aabbcc。
      joinは指定した文字でくっつけている働きをしていることが分かる。

       

      onClipEvent()とon()の混在についての確認
      クリックで先にすすむ紙芝居を作成中、
      onClipEvent (mouseDown) {
      _root.nextPage();
      }
      と記入して、クリックがされたら次のページに進むようにした。
      更に前のページに戻るボタンとして、別のボタンに以下のように書いたところ、
      on(press) {
      _root.backPage();
      }
      なぜか、効果が出ない。
       
      nextPage()とbackPage()のfunction内にtrace()を書いてみたところ、
      どうも、前のページに戻るボタンを押すと、nextPageとbackPageの順で実行されている。
      onClipEventとonの中にtrace()を書いてみたところ、
      どうも、onClipEventが優先されて実行されている事がわかった。
      クリックすると、次のページに行く、前のページに戻るを同時に行っていたために、予定通りの動作をしていないことが分かった。
       
      onClipEvent (mouseDown)の中でifを書き、ある座標の範囲でクリックされたら、戻るボタンとして判定するか、
      mouseDownそのものの使用を諦める必要があることが分かった。

       

    • 実験

      if(n > 2)とif(n >= 3)のどっちが高速か知りたいとき
      this.stop();
      startTime = getTimer();
      n=0;
      for(var i = 0;i < 100000;i++){
      if(n > 2){}
      }
      trace(getTimer()-startTime);
      と、
       
      this.stop();
      startTime = getTimer();
      n=0;
      for(var i = 0;i < 100000;i++){
      if(n >= 3){}
      }
      trace(getTimer()-startTime);
      の結果を比較する。

       

    • 簡単な計算

      光は1秒間に地球を7週半するらしい。
      地球の大きさを40000kmとすると、光の速さは?ってときに、
      trace(40000 * 7.5 + "km")


 
コメントアウト
  • 基本
    一行のコメントアウト

    //ここがコメントアウト

    複数行のコメントアウト

    /*
    ここがコメントアウト
    何行にも渡って何か書きたいとき、
    とりあえず実行されないようにしておきたいときに
    */

    コメントアウトすると、プログラムに反映されない。
    Flash上のASエディタで灰色になるので、見分けるのは簡単。

  • コメントアウトの使い方
    覚え書きをする。

    trace(hoge);//hogeのチェック。後で消す。

    hogeInit();//hogeの初期化。面クリ後は、hogeStageInitなので注意!

    //----------ここからメインのプログラム----------

    //////////////////////////////////////////////////
    //-------------大事なこととか書いておく-----------//
    //-------どんなプログラムとか、戻り値とか---------//
    ////////////////////////////////////////////////

    一時的に使わない部分を除外する。

    //trace(hoge);

    /*
    function hogeInit(){
    this._x = 0;
    this._y = 0;
    }
    */

    改造する前に、コピペして元の部分をコメントアウトして残しておく
    テストや、うまく行かなかったとき、壊れたときのために。

    /*
    function hogeInit(){
    this._x = 0;
    this._y = 0;
    }
    */
    function hogeInit(){
    this._x = 100;
    this._y = 80;
    }


 
よく使うプロパティ
  • 位置、サイズ、回転など
    _x
    _y
    上下、左右の座標
    _width
    _height
    上下、左右の幅
    _rotation回転(-180〜180)
    _xscale
    _yscale
    拡大率(%、100で元サイズ)
    ※回転させると、_x、_y、_width、_heightが変化するので注意。

    _xmouse
    _ymouse
    マウスのX、Y座標
    ※対象のMCの中心からのマウスの座標
    基本的に、_rootをつけて画面全体の座標として取得する。

    _alpha透明度(0〜100%)
    _visible表示、非表示(true/false)
    ※_alpha=0;にしても、ボタンのクリック判定は残っている。
    _visible=false;ならば、クリックできなくなる。
    また、_visibleをfalseにすると、消えている間はそのMCのASは実行されなくなる

    _nameMCの名前

  • プリローダー関係(NowLoading)
    getBytesLoaded()読み込まれたMCのサイズ(バイト)
    getBytesTotal()MCの総サイズ
    _currentframe現在のフレーム
    _totalframes総フレーム数

 
 
 
カーソル、マウス
 
カーソルを消す
  • Mouse.hide();
    以上
  • 再び表示するには、
    Mouse.show();
 
ドラッグ&ドロップ
  • 例:ドラッグできるようにする

    on (press) {
        this.startDrag ();
    }

    on (release, releaseOutside) {
        this.stopDrag ();

    }

  • 対象にドロップできるようにする

    例:着せ替えの上着部分を作る
    まず、着せ替えの上着部分をドラッグできるようにする。上記を参考に。
    次に、_root上で、上着を置ける場所を塗りつぷしてMCにする。
    uwagiAreaと名前をつける。
    見えないように、uwagiArea._visible = false;と書いておく
    ※uwagiAreaの中心の座標は、上着と一致させておく。
    以下のようにASを少し改造。

    on (release, releaseOutside) {
        this.stopDrag();
        if (eval(this._droptarget) == _root.uwagiArea) {
            this._x = uwagiArea._x;
            this._y = uwagiArea._y;
        }
    }


    意味は、ドラッグが終わったら、ドラッグ対象がuwagiAreaか判定。
    判定が一致(uwagiAreaに乗っている)なら、上着の位置に吸着させる。

     参考:eval()、this[]の使い方コツ

 
 
スライドバー
  • 例:
    適当に枠を書いて、MCにする。
    MCをダブルクリックして、編集モードに。
    レイヤーを追加して、バーのクリックする部分(スライドできる部分)を作り、MC化。
    情報から、x:0、y;0を入力。
    クリップアクションとしてバー部分に以下のASを記述。


    on (press) {//押されたら
        this.startDrag ( true, 0, 0,100, 0);//横100マスにドラッグをできるように
    }

    on (release, releaseOutside) {//離されたら、
        this.stopDrag ();//ドラッグを終了して
        _root.alphaHenkou(this._x);//alphaHenkouに現在のx座標を送る
    }

    タイムラインに、アルファを変更するalphaHenkouというfunctionを定義

    function alphaHenkou(num){
        this._alpha = num;
    }

    これで、ドラッグすると、画面全体のアルファを変更できるようになる。
    目盛りなどは、適当に背後のレイヤーに書く

  • 初期値などを設定したければ、onClipEvent(load)の中で行う。
    今回の例の場合は、初期値が0になっているので、何も見えない状態で始まってしまうので、必須。

    onClipEvent(load){
        this._x = 100;
    }

  • ドラッグしながらデータを変更したければ、onClipEvent(enterFrame)で監視する。

    onClipEvent(enterFrame){
        _root.alphaHenkou(this._x);
    }

  • 一歩発展
    横にスライドできる幅を変更する場合には、
    onClipEvent(load)内で、slideHaba=200;のようにスライドバーの幅の変数を定義
    それぞれの部分で、
    this.startDrag ( true, 0, 0,slideHaba, 0);
    _root.alphaHenkou(this._x / slideHaba * 100);と改造。
 
 
カスタムカーソル
  • 上記のカーソルを消すをしたあと、カーソルにしたいMCに、

    onClipEvent(load) {
    this.startDrag();
    //Mouse.hide();はここに書いてもよい
    }

  • 上記のものは簡単なやり方。
    本格的に作りたければ、「Flash カスタムカーソル」あたりで検索
 
右クリックメニューの編集/右クリック>再生をできないようにする
  • 右クリックメニューの項目を消す
    Stage.showMenu = false;
    ※「FlashPlayerについて」は消せない

  • MX2004以降では、項目の追加、変更ができる。
    詳しくは、ContextMenuやContextMenuItemにFlashをつけて検索汁。

    参考:MXで、MX2004のASを使う

 
 
 
ボタン+
 
ボタンを使ってMCを反応させる(着せ替えを作る)
  • ボタンを使った着せ替えの例
    uwagiというMCをつくり、フレーム1でthis.stop();
    2、3フレームにそれぞれ違う服を書いておく。
    上着を3に変更するボタン

    on(release){
        _root.uwagi.gotoAndStop(3);
    }

    次の服に変えるボタン

    on(release){
        _root.uwagi.gotoAndStop(_root.uwagi._currentFrame + 1);
    }

 
クリックすると先に進む/紙芝居を作る(コマ送りをする)
  • 手順を書いて説明
     参考:シーンの代わりにMCを使う(最後のアレンジで、紙芝居の作り方の例があり)

  • 基本
    止めたいところで、this.stop();

    ボタンに、

    on(press){
        this.gotoAndStop(this._currentframe + 1);
    }

    これで、クリックすると次のフレームに進む。
    前のフレームに戻るには、

    on(press){
        this.gotoAndStop(this._currentframe - 1);
    }

    以上。
    nextFrame()とprevFrame()を使っても同じ結果が得られるが、既にサポート外であり、後々使えなくなる可能性があるので非推奨

  • ページが終わったらクリックを待つ紙芝居の例
    (MCスクリプトとして利用)
    MCを作成し、MCの中に「次のページ」のボタンを含めておく
    MCのタイムラインに以下のAS記述。

    _root.stop();//メインのタイムラインを停止する。
    ボタン名.onRelease = function(){
        _root.play();
    }

    停止したい場面(ページ)に、キーフレームを打ち、MCを配置。
    タイムラインが止まり、次のページのボタンが表示されるようになる。

  • 自動再生(クリックしなくても先に進む)機能を紙芝居に追加する
    適当にオートプレイを判定する変数を用意。
    今回は、autoPlayとした。
    「自動再生」のようなボタンを作って、押されたら、autoPlay = !autoPlay;
    上記のスクリプトを改造

    if( _root.autoPlay ){//自動再生になっていたら
        //何もしない(再生を続ける)
    }else{
        _root.stop();
    }
    ボタン名.onRelease = function(){
        _root.play();
    }

     参考:スイッチ(ひとつ下)

    クリックして先に進むムービーは、できるだけクリックできる範囲を大きくとること。
    特に目的(ゲーム的用途など)がなく、クリックできる場所が変わったりするムービーは、最低。
    文字が表示される画面か、画面全体をクリックできるようにしておくとよい。

 
スイッチ/オンオフできるボタン
  • 準備
    (基本として、ボタンを作ることが出来るように)
    まずは、オンのボタンと、オフのボタンをそれぞれ別々に作る。
    ボタンのシンボルをライブラリで複製して、微妙にアレンジするとよい。
    (MX以降)

  • 配置とAS
    MCを別に新規作成。
    フレーム1とフレーム2に、それぞれのボタンを配置。

    スイッチのMCのフレーム1に記入。ボタンではないので注意

    this.stop();//ループしないように停止
    this.onRelease = function(){//自身が押されたら、
        this.gotoAndStop( 3-this._currentframe );//移動
        _root.bgmMute(this._currentframe);//スイッチの動作
    }

    MC自身が押されたら、フレーム移動して、現在のフレームを_root.bgmMute(flag)というようなfunctionに送る。
    サウンドをミュートにするような使い方に。
    「switch」は予約語なので使わないように

  • ちょっと難しい…
    「3-_currentframe」の部分が分かりにくいので説明。
    フレーム1のときは、3-1でフレーム2へ。
    フレーム2のときは、3-2でフレーム1へ。

    オンとオフのポタンそれぞれに、gotoAndStop()を書いても同じ事ができるので、好きなやり方で。
    書く場所が多くなると、うまくいかなかったときに面倒になるのでお勧めはしない。

 
Tabを無視する/黄色い枠が出ないようにする
  • ボタンに、

    on(keyPress"<Tab>"){hoge=0}

    以上。
    Tabキーの操作をすると、keyPressの内容が先に実行されて、ボタンに飛ばなくなる
 
ボタンの上でカーソルが指に変わらないようにする
  • ボタン名.useHandCursor = false;

    MX以降
  • 何も機能を持たない透明な、大きなボタンを背景いっぱいに置いて、全画面をクリックできるようにして隠す

  • カスタムカーソルを利用する

 
動きのある(徐々に出る、アニメする)メニュー
  • 準備
    (基本として、ボタンを作ることが出来るように)
    まずは、メニューを開くボタンを適当に作成する。

  • メニューの作成
    メニュー部分のMCは、フレーム1を空白にしておき、何も置かない。
    フレーム1は閉じた状態なので、普段はこの状態で停止させておく。

    フレーム2から開くアニメーションを作り、
    フレーム10で開いた状態にして、
    フレーム11から、15までは閉じるアニメーションにすることにした
    メニューの項目が、トウィーンで徐々に現れたり、下に伸びたりするアニメを作る。
    メニューの項目は、それぞれボタンにしておいて、押したときの動作を後で追加する
    (フレームの数は人それぞれで。ただし、あまり長くしすぎてユーザービリティを欠くことがないように。)

    AS用のScriptレイヤーを用意して、1、10にキーフレームを打つ

    フレーム1のAS

    this.stop();
    function closeMenu(){
        this.gotoAndPlay(11);
    }

    フレーム10のAS

    this.stop();

    以上。
    ボタンなどで、メニューのMC名.play();とすれば、
    フレーム10まで再生されてメニューが開く。
    もう一度押せば、閉じる。

  • 仕上げ
    ボタンと、メニューのMCを配置して、メニューに、インスタンス名をつける。
    ボタンが押されたら、play()

    メニューを開くボタンのAS例

    on(press){
        menu1.play();
    }

    メニューの項目のボタンのAS例

    on(press){
        this.closeMenu();
        _root.main.gotoAndPlay("Home");//項目のボタンで動かす指示
    }

    ボタンの代わりにMCに書く場合は、this._parent.closeMenu()になる。詳しくはココとかココ
    メニューが閉まるアニメーションの後に画面が切り替わるようにしたければ、移動先を変数に格納して、メニュー側で、閉じたアニメの後に移動の指示を出す。その際に、変数のリセットを忘れずに

  • アレンジ
    カーソルがメニューの外にでると、メニューが消える

  • ただし…
    このやり方は、とりあえず手軽に作ってみたい人向け。
    ボタンとメニューが密接に結びついているため、拡張性に乏しく、
    構造が複雑になると管理が面倒になる。
    しっかりとした利用をするには、外部読み込みファイルと
    attachMovieを使うような設計にして、カスタムしやすくする工夫が必要。

 
カーソルを乗せると反応、カーソルを離しても動きを継続させる
  • カーソルを乗せると波紋が広がる例
    まず、波紋のMCを作成。
    MCの最初のフレームは何も置かないで、this.stop();を書いておき、最初は何も見えず、勝手にループしないようにしておく

    波紋のMCの中にボタンを作り、ボタンに以下のASを記入。

    on(rollOver){
    this.play();
    }

    これで、カーソルをのせると一度波紋が広がるアニメーションがちゃんと再生される。

  • アレンジ
    波紋が広がった後で、タイムラインの再生を開始するには、
    波紋のMCの最後のフレームで、_root.play();とすればよい。
 
その他、ボタン関係、関連
 
 
 
キーボード
 
キーを押すと反応
  • on(keyPress "キーコード")を使う
    例:カーソルの左キーを押すと左に10ピクセル動く

    on(keyPress "<Left>"){
        this._x -= 10;
    }

  • Key.isDown()で判定(enterFrameで監視)
    例:上下のキーを押すと上下に移動

    onClipEvent(enterFrame){
        if (Key.isDown(Key.UP)){
            this._y -= 10;
        }else if (Key.isDown(Key.DOWN)){
            this._y += 10;
        }
    }

    ゲームなどの押したら動くという時に利用

  • onClipEvent(keyDown)で判定
    例:上下のキーを押すと、一度だけ上下に移動。押しつづけるとまた動き出す

    onClipEvent(keyDown){
        if (Key.isDown(Key.UP)){
            this._y -= 10;
        }else if (Key.isDown(Key.DOWN)){
            this._y += 10;
        }
    }

    上記のenterFrameのは、押してあれば反応して動くので、扱いやすいが、負荷が高め。
    こっちは、キーボードの操作のように、押すとしばらくしてから連続押し状態になるタイプ。
    KeyDownは、押さない限り、実行されないので、負荷が低いのが特徴。
    また、押した回数に正確に反応するので、コマンド入力のようなカーソルを順番に合わせる動作に使うと良い
    KeyUpを併用すれば、enterFrameと同等の性能で、より処理の軽いものができる。
    (負荷のことをあまり気にしすぎることも、問題なのだが)

  • addListener()でリスナーを設定する

    keyListenerObj = new Object();
    keyListenerObj.onKeyDown = function(){
        if( Key.isDown(Key.DOWN) ){
            _root.hoge.sage();
        }
    }
    Key.addListener(keyListenerObj);

    リスナーを設定する方法のメリットはオブジェクト指向ができること。
    ウィンドウが複数出てきて、アクティブな画面にだけカーソルキーの反応を送りたい場合など。
    キーボード入力そのものを、単独でまとめて管理するようなプログラミングをする必要が出てきたときに有効
    無理に使う必要は無い。

 
キーコードを取得
  • this.onEnterFrame = function(){

    nowCode = Key.getCode();

    if(nowCode != prevCode){
    trace(nowCode);
    prevCode = nowCode;
    }
    }

    大切なのは、nowCode = Key.getCode();という部分だけ。
    残りは、前と同じキーコードだったら無視するようにして、延々と数字が出力されないようにしている。

    キーコンフィグを作りたいならば、
    「上に割り当てたいキーを押してください」と表示して、何かキーが押されたら、
    keyCode_Up = Key.getCode();
    で、キーコードを取得しておき、
    if(Key.isDown(keyCode_Up)){//上を押したときの処理}
    とすれば、自由に使える。
    Key.getCode()は、最後に押されたキーを返す。押しているかの判定には使えない。
    シフト同時押しのキーコードは取得できない。Key.getAscii()で取得するとよい。


 
2つのキーの同時押しを判定
押しっぱなしで反応しないようにする
  • 同時押しの判定

    if(Key.isDown(Key.Up) && Key.isDown(Key.Down)){/*同時押しの処理*/};

    2つのキーが押されているかを判定すればよい。
    この場合は、上と下のカーソルキーが押されていたら。
    ※キーボードによっては同時押しできないキーの組み合わせがあるので、あまりやらないほうがよい。

  • 押しっぱなしで反応しないようにする

    if ( Key.isDown(Key.Up) ){
      if( keyUpFlag ){
       keyUpFlag = false;//キーを離すまで、このフラグはtrueにならない。
       this.age();//上に行くfunction ageを呼び出す。
      }
    } else {
    keyUpFlag = true;//キーが離されていたら、もう一度反応するようにフラグを開放
    }

    で、一度上を押したら、もう一度押しなおすまで反応しない。

 
NumLock、CapsLockの状態を調べる
  • NumLock

    if( Key.isToogled(Key.NUMLOCK) ){
    trace("NumLockかかってるよ");
    }

  • CapsLock

    if( Key.isToogled(Key.CAPSLOCK) ){
    trace("CapsLockオンになってるYO");
    }

 
その他、キーボード関係、関連
  • リスナー
 
 
 
サウンド
 
とにかくサウンドを鳴らす/簡単な方法でサウンドを制御する
  • 適当なMCを作り、画面外に配置する。
    適当に名前を付ける(bgmと名前をつけたことにする)
    その中でサウンドをストリーミングで鳴らす。
     
    ボタンや鳴らしたいタイミングなどで、
    bgm.play();で再生。
    bgm.stop();で停止。

    bgmの最後のフレームで、this.stop();としておけば、一回再生になる。
    bgmの最初のフレームにthis.stop();と書いておけば、最初は音を流さないようにできる。
    bgmの最初のフレームでthis.stop();して、最後のフレームでthis.gotoAndPlay(2)と書けば、最初は鳴らさないけど、一度鳴らすとループするようになる。


 
ボタンでサウンドをオンオフする
  • 準備
    上記のとにかくサウンドを鳴らすや、ボタンを作るを参考に。

  • AS
    bgmのMCのタイムラインに以下のようなASを記述。

    playing = false;
    function onOff() {
       playing = !playing;
       if (playing) { this.play(); }
       else { this.stop(); }
    }

    ボタンの中に、_root.bgm.onOff();を書いておき、押されたときに操作できるようにする。

 
サウンドをASで制御する
  • 準備

    this.createEmptyMovieClip("sound_mc", 1);
    mySound = new Sound(sound_mc);
    mySound.attachSound("bgm1");
    mySound.start();

    まず、sound_mcという名前のMCを作る。
    「,」の後の数字は階層。duplicatMovieclipなどで既に使っている、使う予定の階層に置かないように

    次に、mySoundというサウンドオブジェクトを作成して、sound_mcに割り当てる。
    要するに、mySound.〜で命令を出す
    割り当てるMC(この場合は、sound_mc)に、thisや_rootを指定してもよいが、一つの音しか流せず、_rootで指定している場合、_root上の全てのMCの音が一緒に制御されてしまう。

    bgm1は識別子。
    識別子は、ライブラリにある音声ファイルを選択して、右クリックから、「リンケージ」。「アクションスクリプトに書き出し」にチェックをいれて、設定した名前。
    これを忘れるとパブリッシュ時にサウンドがswfに入らなくなり、読み込めなくなる。
    また、この識別子はstop("bgm1")のように、個別に停止するときにも利用する。

  • サウンドを流す。(上記の方法で音を流した後で)

    mySound.start();

    これで一回再生されるようになる。
    ボタンを押したり、何かイベントが発生して音を出したいときに
    mySound.start();すれば、音が出る。

    mySound.start(0,999);と書けば999回ループ。ほぼ無限ループとして

    mySound.start(10,3);とすれば、10秒目から再生開始。3回ループとなる。

  • サウンドを止める。(上記の方法で音を流した後で)

    mySound.stop("bgm1");

    stop();の中の識別子を省略すると、Soundで鳴らしている全ての音が止まる。個別に止めたければ、識別子を入れる必要がある

  • 音量を変える。(上記の方法で音を流した後で)

    mySound.setVolume(80);

    この場合、音量は80%になる

 
音量を変える
  • 上記の「サウンドをASで制御する」をよく理解した上で、スライドバーやボタンなどに、以下のASを記入

    mySound.setVolume(hoge);

    hogeの値は、適当に設定。
     参考:スライドバー
   
徐々に音を大きくする、小さくする
  • 上記の「サウンドをASで制御する」をよく理解した上で、以下のASを記入

    this.createEmptyMovieClip("sound_mc", 1);
    mySound = new Sound(sound_mc);
    mySound.attachSound("bgm1");
    mySound.start(0,999);

    volume = 100;

    function volumeChange(num){
        var plus = num;
        this.onEnterFrame = null;//いったんenterFrameを削除
        this.onEnterFrame = function(){
            volume += plus;
            if(volume >= 100){volume = 100;this.onEnterFrame = null;}
            else if(volume <= 0){volume = 0;this.onEnterFrame = null;}
            mySound.setVolume(volume);
            //trace(volume);//確認用
        }
    }


    up、downというインスタン名のボタンを作って、音量変化させる場合

    up.onPress = function(){//up押すと+1ずつ増加
        volumeChange(1);
    }
       
    down.onPress = function(){//down押すと1ずつ減少
        volumeChange(-1);
    }

    volumeChange()に入れた数値で、徐々に音量が増減する。
    100や0を入れれば、一瞬で最大/最小音量に。
   
複数のサウンドを制御する
  • 別のサウンドとして

    this.createEmptyMovieClip("sound_mc1", 1);
    mySound1 = new Sound(sound_mc1);
    mySound1.attachSound("bgm1");
    mySound1.setVolume(80);
    mySound1.start();
     
    this.createEmptyMovieClip("sound_mc2", 2);
    mySound2 = new Sound(sound_mc2);
    mySound2.attachSound("bgm2");
    mySound2.setVolume(50);
    mySound2.start();

    少々複雑に見えるが、mySound1とmySound2にそれぞれ命令出せば良いだけ。

  • 親子になっているMCの音を同時に操作する
    例:親(oya)というMCの中に子(ko)があり、親は左右移動(Panが変わる)できて、yosiというサウンドを鳴らす。子はenというサウンドを鳴らす。

    oyaSound = new Sound(oya);
    oyaSound.attachSound("yosi");
    oyaSound.start(0,999);
     
    koSound = new Sound(oya.ko);
    koSound.attachSound("en");
    koSound.start(0,999);
     
    function oyaPan(x){//oyaのパンを設定するfunction
         oyaSound.setPan(x);
    }
     
    oya.onPress = function() {//oyaをドラッグできるようにする
         this.startDrag();
    }
     
    oya.onEnterFrame = function() {//毎フレーム親の位置を確認して、0-100の値をoyaPanに送る
         var x = Math.floor(oya._x/stage.width*100)
         oyaPan(x);
    }

    oyaが左右に移動すると、koのパン(左右の音量)も一緒に変化する。
    ゲームなどで音を出すMCそれぞれにサウンドを割り当てて位置によってPanを変更すれば、立体感を出すような利用ができる。
    親のMCのサウンドを制御すると、子も影響を受ける。
    mySound.attachSound(_root)は、ムービー全体のサウンドを一緒に制御することになるのでお勧めできない。
   
サウンド関係のメソッド/プロパティ
5から使えるもの
  • Sound.setVolume()
    ボリュームを変更

  • Sound.getVolume()
    ボリュームを調べる

  • Sound.setPan()
    パン(左右の音量)を変更

  • Sound.getPan()
    パンを調べる

  • Sound.setTransform()
    左右の音の成分を細かく設定

  • Sound.getTransform()
    左右の音の成分の情報を調べる

  • Sound.attachSound()
    音を割り当てる

  • Sound.start()
    再生する

  • Sound.stop()
    停止する

MXから使えるもの
  • Sound.onSoundComplete = funcion(){}
    サウンドの再生が終わったら

  • Sound.loadSound()
    外部のMP3サウンドを読み込む

  • Sound.getBytesLoaded()
    読み込みサウンドの読み込み量

  • Sound.getBytesTotal()
    読み込みサウンドの総データ量

  • Sound.duration
    サウンドの総再生時間(1000ミリ秒)

  • Sound.posisiton
    サウンドの現在の再生場所(1000ミリ秒)

  • Sound.onLoad
    外部サウンドの読み込みが終わったとき実行。
    サウンド読み込む前に書いておかないと、実行されないので注意

   
その他のサウンド関係、関連
 
 
 
テキスト関係
 
とにかくテキスト(変数)を表示する
  • 文字ツールで適当に文字を入力(この文字の大きさや幅が利用される)
    「ダイナミックテキスト」を選択して、変数の部分に変数名を入れる(msgとか)

  • 変数に数字や文字列を代入すると自動的に表示される。
    msg = "msgに代入してみるテスト";
    とか
    i = 123;
    msg = i;
    で表示される。

     参考:1から1000までカウントさせる(変数の表示のサンプル例)

    MX以降のユーザーは、テキストフィールドにインスタンス名をつけて、TextFieldオブジェクトとして利用することを推奨
     発展:TextFieldオブジェクト

 
変数が表示されない(変数のトラブル)
  • ダイナミックテキストになっているか?
    静止テキストは、文字通り静止していて、変化することはない

  • 変数名をちゃんとダイナミックテキストの変数の入力欄に入れたか?
    忘れていれば、当然表示されない。

  • インスタンス名ではなく、変数のボックス(入力欄)に変数名を入れたか?
    左側の入力欄はインスタンス名。ここに変数の名前を入れても表示されない(TextFieldオブジェクトになってしまう)

  • 変数の名前をスペルミスしていないか?
    trace(変数名);してみる。
    ちゃんとtraceで表示されるなら、ダイナミックテキストのほうの変数のスペルを確認する。
    undefinedが返ってきたら定義されていない。下の解答へ

  • ダイナミックテキストのあるMCの中に、表示する変数がちゃんとあるか?
    _rootで、hensu=0;と定義して、別のmcの中のテキストでhensuを表示しようとしている場合など。
     発展:MCと変数のパス

  • ダイナミックテキストの色が背景色と一緒になっていないか?
    背景と同じ色なら見えない罠

  • ダイナミックテキストに対して、マスクを使ったり、モーショントゥイーンによるアルファ変化を行っていないか?
    マスクやモーションに使わない
     参考:フォントの埋め込み(フォントの埋め込みで回避できるが非推奨)

  • ファイルサイズが必要以上に大きい
    ダイナミックテキストに表示される変数に対して、フォントの埋め込みは実用的ではない。AからZと0から9、程度までなら許容範囲。日本語を埋め込む場合は、表示されるものに限定して、使う文字だけを埋め込むこと。
 
文字をHTMLのように部分的に色を変える(HTMLを使いたい)
  • 準備
    テキストオプションで、HTMLにチェック。

  • 変数をダイナミックテキストとして出力できるようにしておいて、

    msg="ここを<B>強調</B>します";

  • A HERF,
    FONT COLOR,
    FONT FACE,
    FONT SIZE,
    B ,
    I ,
    U ,
    P
    のタグが使える。 (意味はHTMLと同じだから自分で調べれ)
    MX2004はCSSの(不完全ながら)利用が可能になった。

     発展:TextFieldオブジェクト(フォントやサイズ、色の変更が可能)

 
フォントの埋め込み
  • 手順
    テキストツールの「プロパティ」から、「文字」ボタン。
    埋め込みたい文字の種類を選ぶ

  • 埋め込む文字の種類
    カウンターなどに使うのであれば、数字のみ。
    英語表記がメインであれば、大文字小文字くらいは、埋め込んでもよい。

    「全ての文字」を選択すると、swfのファイルサイズが1.5M前後大きくなる。
    ネットで再生する目的の場合は、選択してはいけない。

    フォントの埋め込みをすれば、ダイナミックテキストなどの、マスク、モーションによる透明度変化、回転などが可能になる。上記の注意点をよく理解していて、必要ならば必要な文字を選択して埋め込む。

 
スクロールバー付きのテキストフィールド
  • とりあえず作ってみる(MX以降)
    テキストフィールドを作る
    「コンポーネントパネル」から、「Scroll Bar」を選択して、テキストフィールドにドロップ
    文字を適当に打ち込めば完成。

  • テキストフィールドの内容を変更する
    変数を(msgのように)入れる。
    msg = "0\r1\r2…"のように代入すれば、内容が変わる。

 
スクロールバー付きのテキストフィールドを自分で作る
  • とりあえず作ってみる
    msgという変数のダイナミックテキストを用意。

    msg = "0\r1\r2\r3\r4\r5\r6\r7\r8\r9\r10";

    function scrollMsg(num) {
        var nextNum = msg.scroll + num;
        msg.scroll = nextNum;
    }

    下にスクロールするボタン

    on(press){
    scrollMsg(1);
    }

    上にスクロールするボタン

    on(press){
    scrollMsg(-1);
    }

    以上

    ただし、
    これはとりあえず動くだけの書き方。
    以下のように最後までスクロールしたら、それ以上スクロールさせないような書き方にしたほうがよい。

    msg = "0\r1\r2\r3\r4\r5\r6\r7\r8\r9\r10";

    function scrollMsg(num) {
        var nextNum = msg.scroll + num;
        if( nextNum >= msg.maxscroll ){
            nextNum = msg.maxscroll;
        }else if (nextNum <= 0){
            nextNum = 0;
        }
        msg.scroll = nextNum;
    }

  • スクロールバーを作る
    MX以降は、カスタムでゼロから作りたい場合を除いて、コンポーネント使ったほうが簡単
    _root上に

    function barScrollMsg(parsent){
        var nextNum= Math.round( parsent / msg.maxscroll * 100 );
        msg.scroll = nextNum;
    }

    スライドバーの背景のMCを作り、その中に、スライドバーにするMCを作る。
    スライドバーのMCにクリップアクションとして、記述。

    on (press) {
    initHeight = 100//スクロールできる高さ
    this.startDrag (true, 0, 0, 0, initHeight);//クリックされたらドラッグ可能に
    }

    on (release, releaseOutside) {
    this.stopDrag ();//離されたらドラッグ終了
    var parsent = Math.round(this._y) / initHeight;//0から1までの間でバーの位置を取得
    _root.barScrollMsg(parsent);//バーの位置を送る
    }

    以上。
    参考:スライドバー(スライドバー作成のサンプル例も参考に)
 
テキスト入力欄を作る
  • 準備
    テキストボックスを「テキスト入力」で作成

  • Enterキーで処理を実行する(5の場合)
    テキスト入力の変数にmsgを入れて。

    function pressOk(){//決定したときに呼び出されるfunctionを定義
        trace(msg);//処理
        msg = "";//空白に
    }

    適当なMCのクリップアクションでEnterを監視する。

    on (keyPress "<Enter>") {//Enterが押されたら
        _root.pressOk();//pressOkを実行する
    }

    参考:Google検索の入力欄を作る(getURL)(入力した文字を送信するサンプル例)

 
その他、テキストエリア関係、関連
 
 
 
文字列の操作、String型について
 
「"」を表示する
  • 「"」を、「\"」に置き換える

    trace("ダブルクオテーション「\"」を表示する");

    結果は、
    ダブルクオテーション「"」を表示する

  • シングルクオテーションの中で使う

    trace('ダブルクオテーション「"」を表示する');

    結果は、
    ダブルクオテーション「"」を表示する


 
文字列を連結する(「年齢 : age歳」のようにASで表示したい)
  • age=12;
    trace("年齢 : " + age + "歳");

    結果は、
    年齢 : 12歳

    age=12;
    msg="年齢 : " + age + "歳";
    trace(msg);

    結果は、
    年齢 : 12歳


 
改行して表示する
  • trace("そろそろ改行かなと思ったら、\n改行すると見やすいよ");

    そろそろ改行かなと思ったら、
    改行すると見やすいよ

 
「\」、「"」、「'」、Tabを表示する
  • エスケープ記号である、「\」を前につけると良い

    \\、\"、\'

    trace("\\1500");

    結果は
    \1500

  • tabは\t

    pName = "牛丼";
    pPrise = 380;
    pMemo = "オーストラリア産牛";
    trace(pName + " : \t" + pPrise + "円\t 備考: \t" + pMemo);

    結果は、
    牛丼 :     380円    備考:     オーストラリア産牛
 
エスケープ記号一覧
  • \n>>改行
  • \r>>CR改行
  • \t>>タブ
  • \b>>バックスペース
  • \">>ダブルクォテーション
 
特定の文字を置き換えしたい
  • splitを使う
    「?」を「@」に置き換える例

    moji = "hoge.swf?data=123";
    moji = moji.split("?").join("@");

    「aa bb cc」を「aabbcc」に置き換える例

    moji="aa bb cc"
    moji=moji.split(" ").join("");

    この例では、「" "」(半角スペース)を「""」(何もなし)に置き換えている
 
ある文字が入っているか調べる
  • a-f以外の文字があったら、何らかの動作をさせる例

    txt="ACDFZ"
    checkMoji(txt);
    function checkMoji(txt){
        for (var i=0; i < txt.length; i++){
            moji = txt.charAt(i);
            kyoka = "ABCDEFabcdef";
            if (kyoka.indexOf(moji,0) == -1){
            //警告出すなどの何らかの処理
            trace("a-fまでの文字しか使えないです");
            return;
            }
        }
    }

 
1を001に、10を010にする
  • a=1;
    ("000" + a).substr(String(a).length)

    a=1;
    (a + 1000).toString().substr(1)

    num = 123;
    digit = 8;
    zero = "0000000000";
    num = (zero + num).substr(zero.length-(digit-num.toString().length));

    trace(num);

    function hoge(n,digit){
    zero = Math.pow(10,digit);
    num = zero + n ;
    return String(num).substr(1);
    }

    trace(hoge(1,8));

 
その他の文字列操作関係、関連
 
 
 
乱数
 
とりあえず使ってみる
  • rndNum = Math.random();
    trace( rndNum );

    とすると、
    0から0.999999999999999のどれかが返ってくる。

    このままでは利用しづらい

  • rndNum = Math.random() * 10;
    answer = Math.floor(rndNum);
    trace(answer);

    とすれば、0から9までの整数を得られる。

  • rndNum = Math.random() * 10;
    answer = Math.floor(rndNum) + 1;
    trace(answer);

    これで、1から10までの整数を得られる。

  • まとめると、

    answer = Math.floor( Math.random()*10 ) + 1;

    10の部分を6に変更すれば、サイコロになる。
    Math.round()は四捨五入なので、サイコロなどに利用すると、 最小の数と最大の数の出る割合が他の数に比べて半分になる。
    あえて、そういう偏った能力のサイコロを作る場合以外は、切捨てであるMath.floorを利用すべき

    参考:functionについて少し詳しく

 
クリックすると、フレーム11から15のどれかに飛ぶ
  • ボタンに、

    on(press){
    rndNum = Math.floor( Math.random() * 5 ) + 1;//1-5の乱数発生
    gotoNum = rndNum + 10;//乱数に+10
    gotoAndStop(gotoNum);
    }

    フレーム1でstop();
    忘れると自動的にループする

 
ランダムな位置に表示
  • 波紋のMCをランダムな位置に表示する例

    onClipEvent (load) {
        function initHamon() {//位置変更
            this._x = Math.random()*initW;
            this._y = Math.random()*initH;
            this.gotoAndPlay(1);
        }
        initW = Stage.width;
        initH = Stage.height;
        wait = 10;//最初の待ちフレーム
        this.stop();
    }
    onClipEvent (enterFrame) {
        if (wait>0) {//ウェイト処理
            wait--;
        } else {
            this.play();
        }
        if (this._currentframe>=this._totalframes) {
            initHamon();
        }
    }

    MCにクリップアクションとして記入。
    フレーム1は何も表示しない画面にしておくこと
    ASを書いたMCを画面に沢山コピーするか、duplicateMovieclipで増やして利用するとよい。
 
その他の乱数関係、関連
 
 
 
配列
 
とにかく配列を作る
  • とりあえず配列を作る

    arr[0] = "giko";
    arr[1] = "mona";
    arr[2] = "c";

    trace(arr[0]);
    trace(arr[1]);
    trace(arr[2]);

    配列のデータを変更

    arr[1] = "zonu"

  • まとめて配列に格納

    arr = ["giko","mona","c"];

    trace(arr[0]);
    trace(arr[1]);
    trace(arr[2]);

  • 構造体で配列を作る

    arr = {namae : "giko", weight : 15, saitama : false};

    trace(arr.name);
    trace(arr.weight);
    trace(arr.saitama);

    又は

    trace(arr["name"]);
    trace(arr["weight"]);
    trace(arr["saitama"]);

    追加

    arr.kigen = "good";

    ※Arrayは予約語なので変数名に使わないように

 
多元配列
  • とりあえず作成してみる

    arr = new Array();
    for(var x=0; x<10; x++){
          arr[x] = new Array();
            for(var y=0; y<20; y++){
                  arr[x][y] = 0;
            }
    }

    任意の位置に代入

    arr[5][6] = "hoge";

    多元配列の場合は、new Array()の手続きをしないで、いきなり代入というようなことはできないので注意

  • 確認してみる
    (idxは、視覚的な確認のみ。データとして使うときは直接指定で)

    for(var idx in arr){
          trace(arr[idx]);
    }

  • 確認2
    (直接指定の普通のやり方)

    for(var x=0; x<10; x++){
          var hyouji = "";
          for(var y=0; y<20; y++){
                hyouji += arr[x][y] + "\t";
          }
          trace(hyouji);
    }

  • まとめて作成&代入

    arr = [
          [1,2,3,4,5,6,7,8,9,0],
          [3,4,5,6,7],
          ["a","b","c"]
    ];

  • 確認してみる

    for(var idx in arr){
          trace(arr[idx]);
    }

 
配列の操作(メソッド)
  • 配列の最後に追加(しつつ、配列の長さを取得)

    arr.push("giko","mona");

    (複数のデータの追加が可能)
  • 配列の最後を削除(しつつ、取得)

    currentHoge = arr.pop();

  • 配列の最初に追加(しつつ、配列の長さを取得)

    arr.unsifht("fusagiko","nida");

  • 配列の最初を削除(しつつ、取得)

    nextHoge = arr.shift();

  • 配列をソート(引数にソート用の関数指定でコントロール可能)

    arr.sort();

  • 新しい配列にコピー(データを追加しつつ)

    arr2=arr.concat();

    arr2=arr.concat("afo");

  • 配列をつなげる

    arrAll=arr.concat(arr2,arr3);

  • 配列の一部を抜き出して新たな配列にする

    newArr=arr.slice(2,5);

    (この場合は2番目から5番目まで)
    (後ろの引数を省略すると最後まで)
  • 配列の中身を「,」でつないで一行にする

    nakamiStr = arr.toString();

  • 配列の中身を任意の区切り記号でつないで一行にする

    nakamiStr = arr.join("&");

  • 配列の長さを取得

    arr.length


    for(var i = 0; i < arr.length; i++){〜}

    〜しつつというのは、hoge = arr.shift();のように利用できるということ。分かりにくくなるので.shiftと.pop以外は無理に使わないほうがよい。

 
文字列を一文字づつに分解して、配列に入れる
  • i文字目を一つづつ配列に入れていく

    mojiretsu = "あいうえお";
    nagasa = mojiretsu.length - 1;
    moji = new Array();
    for (i=0; i <= nagasa; i++) {
       nukimoji = mojiretsu.charAt(i);
       moji[i] = nukimoji;
       trace(moji[i]);
    }

  • split()を使い「""」で配列に分解する

    mojiretsu = "あいうえお";
    moji = new Array();
    moji = mojiretsu.split("");
    for (i=0; i < moji.length; i++) {
        trace(moji[i]);
    }

 
配列のシャッフル
  • 最初の配列(a[0])を他のものと入れ替えることを100回繰り返す

    a = new array(1, 2, 3, 4, 5, 6, 7, 8, 9);
    for (i=0; i<100; i++) {
       r = Math.floor( Math.random() * a.length );
       work = a[0];
       a[0] = a[r];
       a[r] = work;
    }
    trace(a);

  • 後ろから順番に、どれかと交換していく

    a = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9);
    i = a.length
    while (i ) {
       r = Math.floor(Math.random()*i)
       work = a[--i]
       a[i] = a[r]
       a[r] = work
    }
    trace(a);

  • 新しい配列に押し込んでいく

    a = new array(1, 2, 3, 4, 5, 6, 7, 8, 9);
    c = new array();
    while(a[0]){
       c.push(a.splice(Math.floor(Math.random() * a.length ),1);
    }
    //while(c.length != 0)
    trace(c);

 参考リンク:配列を偏りなくランダムに並替える<<Macromedia Flash非公式テクニカルノート
 
配列の値の平均/最大最小を求める
  • 平均を求める例

    //配列作成、ランダムな数値代入
    arr = new Array();
    for (var i = 0; i<10; i++) {
        arr[i] = Math.floor(Math.random()*100);
        trace(arr[i]);
    }

    //配列を合計して長さで割る
    nagasa = arr.length;
    goukei = 0;
    for (var i = 0; i<nagasa; i++) {
        goukei += arr[i];
    }
    heikin = goukei/nagasa;
    trace("average : "+heikin);

  • 最小値、最大値を求める例

    //配列作成、ランダムな数値代入
    arr = new Array();
    for (var i = 0; i<10; i++) {
        arr[i] = Math.floor(Math.random()*100);
        trace(arr[i]);
    }

    //ソートして最大最小を求める
    arr.sort();
    min = arr[0];
    max = arr[arr.length-1];
    trace(min + " - " + max);

 
配列(構造体)の完全コピー
  • //変数設定
    var dataObj = {abc:1, def:2};
    var obj1 = {a:1, b:2, c:dataObj};
    var obj2 = cloneObj(obj1);
    obj1.a = 0;
    //データ書き換え
    trace(obj1.a);
    //出力 : 0
    trace(obj2.a);
    //出力 : 1
    //オブジェクトコピー用メソッド
    function cloneObj(_obj) {
        var obj = new Object();
        for (var data in _obj) {
            if (typeof _obj[data] == "object") {
                obj[data] = cloneObj(_obj[data]);
            } else {
                obj[data] = _obj[data];
            }
        }
        return obj;
    }

    typeofで判別して、コピーしている。
 
 
 
変数
 
tama1,tama2,tama3〜のようなインスタンス名を
「"tama"+i」のような変数で指定する
  • eval()を使う

    eval("tama" + i )._x = 0;

  • this[]を使う

    this["tama" + i]._x = 0;

    ※thisの後には、「.」がつかない
 
eval()とthis[]の違い
  • evalは「.」(ピリオド)区切りのパスを内包できる

    i = 1;
    eval("oya.ko"+i)._x = 0;

  • this[]で、複数のパスを書くときは、「[]」で繋げる

    i = 1;
    this["oya"]["ko"+i]._x = 0;

    eval("hoge"+i)=xxのように、左辺のevalのみ(eval(〜)._x=0;などは大丈夫)に値を代入しようとするとMXからエラーが出るようになった。
    this["hoge"+i]=xxという書式にしないといけない。

     参考リンク(公式):左辺にある Eval() が正常動作しない

 
eval()、this[]の使い方コツ
  • _root.oya2._xというパスの、oya2の部分を変数で指定するには、

    eval("_root.oya" + i)._x

    または、

    this["_root"]["oya" + i ]._x

    のように書くとよい。
    ×_root.eval("oya" + i)._x

  • MCのパスをifで評価する場合に、

    if(this._parent == eval("_level0.oya")){
    trace("父ちゃん!");//実際には、ここに親によって変わる動作を書く
    }

    × if(this._parent == "_level0.oya")ではfalseしか返ってこない
    ※スクリプトとして作り、色々なMCに配置されたときに、置かれている(一つ上の)MCによって動作を変えるプログラムなどに

  • oya1.ko1の数字部分を変数iで指定

    i = 1;
    this["oya" + i]["ko" + i]._visible = false;

    i = 1;
    eval("oya" + i +".ko" + i)._visible = false;

  • 変数をパスにする

    targetMC = eval("hoge" + i);
    targetMC._visible = false;

  • this[]を弄り倒す

    this["_root"]["oya"]["ko"]
    this["_level0"]["oya"]["ko"]

    _root["oya"]["ko"]
    _level0["oya"]["ko"]
    _root.oya.ko

    this._parent["oya"]["ko"]
    this["ko"]
    this.ko

 
 
 
やりたいこと別
 
塗り絵を作りたい/色を変えたい
  • setRGB
    MX以降から
    お絵かきの作成は難しい。MCとしての線が増えると処理が重くなる
 
マスクをASでかける
  • 普通にマスクを作り、マスク部分のMCを操作する
    MX以降から
    マスクのMCをドラッグできるようにする例

    MC.onPress = startDrag();

  • setMask()
    MX以降から

    MC.setMask(maskMC);

    MCに対して、maskMCでマスクをかける。
 
線を引く/描画する
  • moveTo()、lineTo()といった描画メソッドを使う
    太さ3で、赤の線で、四角を描く

    this.lineStyle(3, 0xFF0000);
    this.moveTo(100,100);
    this.lineTo(100,200);
    this.lineTo(200,200);
    this.lineTo(200,100);
    this.lineTo(100,100);

  • beginFill()とendFill()で中を塗る

    this.beginFill(0x000000);
    this.lineStyle(3, 0xFF0000);
    this.moveTo(100,100);
    this.lineTo(100,200);
    this.lineTo(200,200);
    this.lineTo(200,100);
    this.lineTo(100,100);
    this.endFill();

    lineStyle()としておけば、見えない線を引ける

    線が閉じていなかった場合は、線が追加されて塗り潰される
    beginGradientFill()でグラデの塗り。パラメータの説明は面倒なのでヘルプ嫁

  • 線や塗りを消す

    this.clear();

  • curveTo()で曲線を描く

    this.lineStyle(3, 0xFF0000);
    this.moveTo(100,100);
    this.curveTo(200,200,100,300);
     //以下、参考のための補助線
    this.lineStyle(1, 0x0000FF);
    this.moveTo(100,100);
    this.lineTo(200,200);

    curveTo(コントロールポイントx, y, 終点x, y);

  • curveTo()の実験

    this.onEnterFrame = function(){
        this.clear();
        this.x = _root._xmouse;
        this.y = _root._ymouse;
        this.lineStyle(3, 0xFF0000);
        this.moveTo(100,100);
        this.curveTo(this.x,this.y,100,300);
       
        this.lineStyle(1, 0x0000FF);
        this.moveTo(100,100);
        this.lineTo(this.x,this.y);
    }

    コントロールポイントの座標を自由に変えられるサンプル。

  • 空のMCに描画する
    描画メソッドは、既に配置されている画像などの後ろに描画されてしまう。
    このため、空のMCを作成してから描画するようにすれば、前面に描写できる。

    this.createEmptyMovieClip("emptyMC",1)//空のMCを深度1で作成。
    this.emptyMC.lineStyle(3, 0xFF0000);
    this.emptyMC.moveTo(200,0);
    this.emptyMC.lineTo(400,400);
    this.emptyMC.lineTo(0,400);
    this.emptyMC.lineTo(200,0);

 
ゲームなどのデータを(ローカルに)保存する
  • SharedObject
    MX以降から
 
同時に開いたswf同士で通信をする
  • loacalConnection
    MX以降から
 
ブラウザのサイズに関わらず画面を一定サイズにする
  • Stage.scaleMode = "noScale";
    MX以降から

    他にも、
    Stage.scaleMode = "showAll";//すべて表示(デフォルト)

    Stage.scaleMode = "noBorder";//縦横比を維持して、外が見えないように拡大表示

    Stage.scaleMode = "exactFit";//縦横に引き伸ばして全部を表示

 
☆項目
 
FlashのあるURLを調べる(簡易不正コピープロテクト)
  • swfのおいてあるURLが違ったら再生しない

    if(_url != "http://hoge.com/flash/hoge.swf"){//URLが違ったら再生しない
    this.gotoAndStop(1);
    }

    ※解析されると、簡単に回避されるので気安め程度。
    ローカルで保存して再生できないので、苦情がくる可能性もあり。
    実際に作るときは、ひとつのMCに全てムービーを入れておき、右クリックして再生、では再生できないようにする工夫と、ローカルでの再生はサポートしていないというメッセージに飛ばすなどの気遣いを忘れずに。

    小細工のプロテクトに拘るよりも、いい作品を作って多くの人に見てもらうことを考えるべき。
    勝手に転載や、改造されても、俺も有名になったなと笑い飛ばせるくらいの余裕を。

  • ローカルに保存されていたら再生しない

    if(_url.indexOf("http") < 0){//http上になかったら再生しない
    this.gotoAndStop(1);
    }

 
数秒待つ
  • stop();
    siID = setInterval(function () {
       play(); //次フレームで停止ならば、gotoAndStop(_currentframe +1);
       clearInterval(siID);
    }, 2000, this);

 
逆再生する
  • hogeというMCを逆再生する場合

    hoge.stop();
    hoge.gotoAndStop(hoge._totalframes);
    hoge.onEnterFrame = function(){
       if(this._currentframe == 1){
           hoge.stop();
          delete(hoge.onEnterFrame);
       } else {
           hoge.gotoAndStop(hoge._currentframe - 1);
       }
    }

  • タイムライン上で逆再生

    this.stop();
       this.onEnterFrame = function(){
       if (_currentframe == 1) {
           this.onEnterFrame = null;
       } else {
           gotoAndStop(_currentframe - 1);
       }
    }

 
全てのMCを止める
  • 全てのMCを止める(入れ子になっているMC全てに命令を出す)

    // 含まれる全てのMCに対して同じ関数を呼ぶ
    function broadcast(iMC, iFunctionName){
       for(var name in iMC){ // iMC の全てのプロパティでループ
           var prop = iMC[name];
           if(typeof(prop) == "movieclip"){ // プロパティがムービークリップなら
               broadcast(prop, iFunctionName); // 再帰的に呼び出し
           }
       }
       iMC[iFunctionName](); // 自分自身に対して関数を呼ぶ
    }
     
    broadcast(myMC, "stop");

 
左右反転する
  • _xscale *= -1;

 
☆項目
 
 
 
ムービー支援AS
 
画面をクリックすると次のフレームに進む
  • stop();
    this.onMouseDown = function() {
        _root.nextFrame();
    }

     発展:

 
横(縦)回転をそれらしく見せる
  • 横のスケールの拡大縮小で擬似3D回転をする
    「hoge」というMCを回転させる例。

    speed = 5;
    hoge.onEnterFrame = function() {
        if (this._xscale>100 || this._xscale<-100) {
            speed *= -1;
        }
        this._xscale += speed;
    }

  • cos使って3D回転
    MCにクリップアクションとして書く

    onClipEvent(load) {
        kakudo = 0;
    }
    onClipEvent(enterFrame) {
        nida = Math.cos(kakudo); //表示する幅。色変化にも使える
        this._xscale = nida * 100;//縦回転は_yscale
        kakudo = kakudo + 0.1; //回転速度、大きいほど早い
    }

  • 裏表のある回転
    MCのフレーム1、2に表と裏の画像を用意しておく

    onClipEvent(load) {
        kakudo = 0;
    }
    onClipEvent(enterFrame) {
        nida = Math.cos(kakudo); //表示する幅。色変化にも使える
        if(nida > 0) {
            this.gotoAndStop(1);
        }
        else {
            this.gotoAndStop(2);
            nida = -nida;
        }
        this._xscale = nida * 100;
        kakudo = kakudo + 0.1; //回転速度、大きいほど早い
    }

 
雪を降らす
  • onClipEvent (load) {
        int_self = function () {
            def_x = _x;
            a = 10;
            x_p = 3+Math.random()*3;//横揺れの速度
            y_p = 3+Math.random()*3;//落下速度
            haba = 50;//横振れの幅
            _y = -50;
        }
        int_self();
        ef = function () {
            a += x_p;
            _x = haba*Math.cos(a*Math.PI/180)+def_x;
            _y += y_p;
            if (_y>420) {
                int_self();
            }
        };
    }
    onClipEvent (enterFrame) {
        ef();
    }

 
タイプライター
  • フレームに応じて文字を出す
    テキストフィールドに、変数名をtxtで。

    moji = "123456789";
    counter = 0;
    wait = 5;//ウェイト。一文字出すのにかかるフレーム数
    this.onEnterFrame = function() {
        if (_currentframe%wait == 0) {
            txt += moji.charAt(counter++);
        }
        if (counter>moji.length) {
            delete this.onEnterFrame;
        }
    }

  • setIntervalで表示
    テキストフィールドに、変数名をtxtで

    moji = "123456789";
    sec = 0.3;//表示する秒数
    ID = setInterval( hoge, sec * 1000);

    function hoge() {
        txt = txt + moji.charAt(i);
        updeateAfterEvent();
        i ++;
        if ( i >= moji.length) {
            clearInterval(ID);
        }
    }

 
画面を揺らす
  • initX = this._x;
    initY = this._y;
    function resetYure(){
        this.onEnterFrame = undefined;
        this._x = initX;
        this._y = initY;
        quakeX = 0;
        quakeY = 0;
        quakeTime = 0;
        quakeTotal = 0;
        kaitenX = 0;
        kaitenY = 0;
    }
    function yure(X,Y,time) {
        if(this.onEnterFrame == undefined){
            resetYure();
            this.onEnterFrame = function(){quake();}
        }
        quakeX += Number(X);
        quakeY += Number(Y);
        quakeTime += Number(time);
        quakeTotal += Number(time);
    }
    function quake() {
        var quakeA = quakeTime --/ quakeTotal;
        kaitenX += quakeX*quakeA*Math.PI*(1-Math.random()*.9);
        kaitenY += quakeY*quakeA*Math.PI*(1-Math.random()*.9);
        this._x = quakeX * quakeA * Math.cos(kaitenX) + initX;
        this._y = quakeY * quakeA * Math.cos(kaitenY) + initY;
        if(quakeTime <= 0){resetYure();}
    }
    //yure(120,10,100);

    揺らしたい場面でキーフレーム打って、yure(X方向、Y方向、継続フレーム)で揺らす。
    止めたいときは、resetYure()。
 
 
 
★中題名
 
大項目
 
★項目1
 
項目2
 
項目3