mieki256's diary



2010/09/26() [n年前の日記]

#2 [flash] Flashでサウンドデータを鳴らすべく実験中

これでループが途切れないBGMを鳴らすことができた、ように見える。結局、ン万円もするFlash CS*が必要になるあたりがトホホな感じもするけれど。無料で使えるFlash関連のソフトでは、mp3の頭に無音部分が入ってしまうのはどうしようもない感じ。

swfmill.xml は以下のような感じになった。
<?xml version="1.0" encoding="UTF-8" ?>
<movie width="800" height="600" framerate="30" version="7">
  <background color="#ffffff"/>
  <frame name="first">
    <library>
      <clip id="SNDRES" import="sndres.swf" />
      <clip id="IMG_BG" import="img/bg.jpg" />
    </library>
  </frame>
</movie>
ID名=SNDRES、sndres.swf というのが、Flash CS* で吐き出した、サウンドデータを内部リンケージしている swf。

ActionScript側は、以下のような感じ。
class Main 
{
    public static function main(swfRoot:MovieClip):Void 
    {
        // ----------------------------------------
        // サウンド関係初期化
        
        var sn:Number = 0; // サウンド番号管理用
        var svol:Number = 80; // サウンド音量記録用 (0-100)
        
        // サウンドデータのリンケージID名一覧
        var sndid:Array = [
            "bell_kan.wav", // 0
            "bell_kin.wav", // 1
            "bell_kon.wav", // 2
            "bgm02.wav",  // 3
            "bgm03.wav",  // 4
            "bgm05.wav"  // 5
        ];
        
        // サウンドデータを内部リンケージしたswfを呼び出す
        var sndres:MovieClip = _root.attachMovie("SNDRES", "sound_res", _root.getNextHighestDepth());
        sndres._visible = false; // 念のために非表示にしておく
        
        // Soundオブジェクト生成
        var sd:Array = new Array();
        for (var i:Number = 0; i < sndid.length; i++) {
            sd[i] = new Sound(sndres);
            sd[i].attachSound(sndid[i]);
        }
        
        // ※ 各サウンドに対して、個別に Volume や Pan 等を設定したい場合は、
        // それぞれを MovieClip として生成(?)しなければならないらしいが、
        // 今回そこまではやっていない。
        
        // サウンド関係初期化はここまで

        // ----------------------------------------
        // 表示関係の初期化
        // (省略)
        
        // ----------------------------------------
        // 各ボタンの処理
        
        // サウンドを鳴らすボタンの処理
        playbtn.onPress = function () {
            if ( (sn >= 3) && ( sn <= 5) ) {
                // BGM
                sd[sn].setVolume(svol); // (これから鳴らすサウンドの)音量を指定
                
                // ループ回数として指定できる最大数が不明なので、ひとまず大きめの値を仮で指定。
                sd[sn].start(0, 9999999);
            } else {
                // SE
                sd[sn].setVolume(svol);
                // SEはワンショットだけ鳴らせばいいはずなので、ループ回数には1を指定。
                sd[sn].start(0, 1);
            }
        }

        // サウンドを停止するボタンの処理
        stopbtn.onPress = function () {
            if ( (sn >= 3) && ( sn <= 5) ) {
                // BGM
                // stop(リンケージID名) として呼ばないと、他の音も停止してしまう。
                sd[sn].stop(sndid[sn]);
            } else {
                // SE (SEは勝手に停止するはずなので何もしない)
            }
        }

        // サウンドを全停止するボタンの処理
        stopallbtn.onPress = function () {
            // MTASC利用時は、stopAllSounds() を記述できない模様。未実装、もしくはバグかもしれず。
            // stopAllSounds();
            
            // stop() にID名を渡さずにを呼ぶことで、
            // 動的に鳴らした全てのサウンドが停止するらしいので、これで代用する。
            sd[sn].stop();
        }
        
        // サウンド番号を増減するボタンの処理
        // (省略)
        
        // 音量を設定するボタンの処理
        // (省略)
        
        // 毎フレームの処理
        _root.onEnterFrame = function () {
            // (省略)
        }
    }
}

以上です。

過去ログ表示

Prev - 2010/09 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project