そこで私はロード作業を簡単に実行できるようにしました。
ついでに関数ひとつで「音声のループ再生」「音声のフェードアウト」を行うことができるようにしました。
これで、ゲーム制作をスムーズに進めることができそうです!
↓以下ソースコード(ご自由にお使いください)
► スポイラーを表示
Main.as(使用例)
MyLoader.as(ロード処理を簡易化)
MySound.as(音声のループ再生,音声のフェードアウトを関数ひとつで可能にする)
package
{
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
/**
* ...
* @author DefaultUser (Tools -> Custom Arguments...)
*/
public class Main extends Sprite
{
public var graphic:Bitmap = new Bitmap();
public var music:MySound = new MySound();
public function comp(event:Event):void
{
//全読み込みが完了した後の処理
addChild(graphic); //画像を表示
music.loop(); //音声をループ再生(今回はすぐに停止するのでループの意味はない)
music.stop(5000); //フェードアウトしながら5秒後に音声の再生を停止する
}
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var ml:MyLoader = new MyLoader(); //MyLoaderをインスタンス化
ml.fLoadGraph("damy.png", graphic); //画像の読み込みをリクエスト
ml.fLoadSound("minutes.mp3", music); //音声の読み込みをリクエスト
ml.fAddEventListener(comp); //全読み込み完了後に実行する関数を指定
ml.fStart(); //読み込み開始
}
}
}
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.media.Sound;
import flash.net.URLRequest;
/**
* ...
* @author DefaultUser (Tools -> Custom Arguments...)
*/
public class MyLoader
{
private var eveDis:EventDispatcher = new EventDispatcher();
private var acNum:int = 0;
private var loadedNum:int = 0; //読み込みが完了した数を示す
private var reqGraNum:int = 0; //読み込むべき数を示す
private var reqGraNames:Array = new Array(); //読み込む画像名を記録
private var graLoader:Loader = new Loader(); //これを使いまわして画像の読み込みを行う
private var reqBitmaps:Array = new Array(); //ここに格納すべきBitmapの参照を与え、そこにデータを入れる
private var loadedSouNum:int = 0; //ダウンロードされた数を示す
private var reqSouNum:int = 0; //ダウンロードされるべき個数の上限を示す
private var reqRealNum:int = 0; //ダウンロードされるべき個数を示す
public function fLoadedSound(event:Event):void
{
loadedSouNum++;
if(loadedSouNum==reqRealNum && loadedNum==reqGraNum) eveDis.dispatchEvent(new Event(Event.COMPLETE) );
}
public function fLoadedGraph(event:Event):void
{
reqBitmaps[loadedNum].bitmapData = (graLoader.content as Bitmap).bitmapData;
loadedNum++;
if (loadedNum 0) {
graLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, fLoadedGraph);
graLoader.load(new URLRequest(reqGraNames[0]) );
}
reqRealNum = reqSouNum;
}
public function fLoadGraph(name:String, bmp:Bitmap):void
{
reqGraNames.push(name);
reqBitmaps.push(bmp);
reqGraNum++;
}
public function fLoadSound(name:String, snd:Sound):void
{
snd.addEventListener(Event.COMPLETE, fLoadedSound);
snd.load(new URLRequest(name) );
reqSouNum++;
}
public function fAddEventListener(func:Function):void
{
eveDis.addEventListener(Event.COMPLETE, func);
}
}
}
package
{
import flash.events.Event;
import flash.events.TimerEvent;
import flash.media.Sound;
import flash.events.EventDispatcher;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import flash.utils.Timer;
/**
* ...
* @author DefaultUser (Tools -> Custom Arguments...)
*/
public class MySound extends Sound
{
private var sndCh:SoundChannel;
private var timer:Timer;
private var feedMSec:int;
private function looped(e:Event):void
{
sndCh = play();
sndCh.addEventListener(Event.SOUND_COMPLETE, looped);
}
public function loop():void
{
sndCh = play();
sndCh.addEventListener(Event.SOUND_COMPLETE, looped);
}
private function feed(e:Event):void
{
var trans:SoundTransform = sndCh.soundTransform;
trans.volume -= 30 / feedMSec;
if (trans.volume < 0)
{
sndCh.stop();
timer.stop();
trans.volume = 0;
}
sndCh.soundTransform = trans;
}
public function stop(msec:int):void
{
if (msec < 30) sndCh.stop();
else
{
feedMSec = msec;
timer = new Timer(30);
timer.addEventListener(TimerEvent.TIMER, feed);
timer.start();
}
}
}
}