MTASCと戯れる その後

解説にとりあげた習作Flashの作者、id:Nabetaniさんからソースのみならず貴重なアドバイスが頂けました(http://d.hatena.ne.jp/Nabetani/20050919#p2)。嬉しい限りであります。

詳細は実際にnabetaniさんのサイトを見てもらうとして、注意点のまとめと、習作5に音を付けてみたので、ご紹介。

宣言時の初期化はクラスオブジェクト共通

なーんと、インスタンス変数の宣言時に初期化するコードを書くと、同じクラスのオブジェクトで値が共有されてしまうらしい。これはハマるところでした。ということはあれか、あのインスタンス変数の宣言だと思っていたものは、宣言ではなくて"クラス定義時に実行される実行文"だということか。そう思えばrubyとも同じでわかりやすい。なるほど。
あれでも、そうするともしかしてインスタンス変数だと思っていたものは、クラス変数相当の役割(オブジェクト間で共有される)をはたすのだろうか。調べてみないと。rubyから類推すると、インスタンス変数は"this.ivar"の形でコンストラクタに書くべきなのかなあ。

生きているムービークリップの管理

あ、そうか。確かにコードを見ると、追加したムービークリップはオーナー(?)ムービークリップのプロパティに格納されていますね。

for( i in _root ){ /*略*/ }

で取得できそうです。他に追加したプロパティがあるとそれもひっかかってくるかもしれませんが。これも試してみよう。

色生成ルーチン

ああー、そういう仕組みだったのですね。解説ありがとうございます。とても使い勝手がよさそうなので、どこかで使いまわそうと思っているのは内緒です。

そして音

音はSoundを使って出すことができました。手順は以下。

var sound = new Sound(_root);
sound.loadSound("test.mp3",false);

sound.start(0,0);

loadSoundの第一引数は音楽ファイルのURL、第二引数はストリーミングがどうかのフラグです。mp3でもOK。上二行でSoundオブジェクトの設定をしておいて、あとは音を鳴らしたいところで3行目を実行するだけ。結構簡単。でも、3行目の実行タイミングによっては鳴らない場合があるみたい。まだ謎がおおい。

"花火"に改造

効果音素材のフリー配布サイト(http://www.soundoffice.com/se/viewse.php)で花火の音を見つけたので、習作5に組みこんで、花火ぽくしてみました。マウスクリックで星がとびちる時に音がなります。上記のサイトから 打ち上げ花火単発(se-042.mp3)をダウンロードして、swfと同じ場所におき、コードを以下のように追加するだけ。

  var mc;
  var mDepth = 0;
  var mL = new Array();
  var sound;  //Soundオブジェクト用インスタンス変数

Soundオブジェクト用インスタンス変数の追加。

  function init() {
    mc.clear();
    var self = this;
    mc.onEnterFrame = function(){  self.ef(); }
    mc.onMouseDown =  function(){  self.md();  }

    sound = new Sound(mc);                //この二行を追加して
    sound.loadSound("se-042.mp3",false);  //Soundオブジェクト初期化
  }

init()にSound初期化コードをいれる。

  function md()
  {
    var WAVC = 15 + Math.floor( drand(5) );
    var v0 = Stage.width * ( 0.01 + drand(0.01/2) );
    var d0 = Math.random()*7;
    var d1 = Math.random()*7;

    sound.setVolume(v0*30);   // v0にあわせたボリュームで
    sound.start(0,0);         // 音を再生

    for( var t=0 ; t<WAVC ; ++t ){

mdの最初のほうに音を鳴らすコードをいれる。星の速度が大きいほどでかい音で鳴るようにしてみた。

これでクリックと同時に花火のどーん!という音が鳴るようになりますが、星が跳ね返ったりマウスポインタに影響されて動いたりするのが花火ぽくないので、それが嫌な人は、以下のようにefの定義の中の該当部分を変更すればOK.

      //var dv = { x : mc._xmouse - c._x, y : mc._ymouse - c._y };
      var dv = { x : 0, y : 0};

マウスの位置による速度変化をチャラにして、

      /*
      if ( ( c._x<0 && c.v.x<0 ) || ( Stage.width<c._x && 0<c.v.x ) ){
        c.v.x = -c.v.x;
      }
      if ( ( c._y<0 && c.v.y<0 ) || ( Stage.height<c._y && 0<c.v.y ) ){
        c.v.y = -c.v.y;
      }
      */

跳ね返り判定をまるごとコメントアウト

季節はもう外れてしまいましたが、連続してクリックするとそれなりに花火な気分にひたれます。