[enchant.js] Safari での Sound の扱い

nobu_kichi2012-03-24


enchant.js でゲームを作る時、効果音やBGMの再生には Sound クラスを使う。音声ファイルは、Gameクラスのpreload関数を使って、ゲーム開始前にダウンロードしておく。例えばこんな感じ。


window.onload = function() {
var game = new Game( 320, 320 );
game.preload( "hoge.wav" ); //! game.assets["hoge.wav"] にSoundインスタンスが格納される

//:
game.assets["hoge.wav"].play()
//:
};

しかし、MacSafariでこのコードを動かすと、game.preload で処理が止まってしまう。Sound.load関数を使ってもうまくいかない。将来的にはSafariもしくはenchant.jsの改善で根本問題が解決するだろうけど、それまで問題を回避しつつ、問題が解決された時に最小のコード変更で対応できるようにしておきたい。Null Object パターンSafariではSoundクラスのplay()やstop()を呼び出されても何もしないようにしておく。例えばこんな感じ。

DummySound = Class.create( Object, {
initialize:function() {},
play:function() {},
pause:function() {},
stop:function() {}
} );
var noSound = new DummySound();

function isSafari() {
var strUA = navigator.userAgent.toLowerCase();
return ( (strUA.indexOf("safari") != -1) && (strUA.indexOf("chrome") == -1) );
}

function preloadSound( url ) {
if ( isSafari() ) {
game.assets[url] = noSound;
} else {
game.preload( url );
}
}

window.onload = function() {
var game = new Game( 320, 320 );
preloadSound( "hoge.wav" );

//:
game.assets["hoge.wav"].play()
//:
};

将来、問題が解決された際には preloadSound 関数の実装を書き換えるか、preloadSound関数を使っている部分をgame.preload で置換すればよい。

というわけで、2本目の enchant.js ゲームをアップロードした。数字4つを四則演算で組み合わせて10を作るゲームだ。ドラッグ&ドロップで計算式を組み立てさせるための仕様の検討と、解答例を作ることで正解のない問題を出題しないようにしたところが工夫した部分。enchant.jsを使うと作るのは楽チンだから「何を作るか?」がこれからの課題だ。次は洗脳ゲーム テキパキ のクローンでも作ろうかな。

ゲームはこちら
ソースはこちら