BGMを鳴らしてみよう
サンプル
コードの解説
まず、音楽を入れるディレクトリを作っておきます。jsフォルダと同階層に「rsc」という名前のディレクトリを用意しています。音のファイルも用意しています。では音を読み込んでみましょう。音を読み込む用のコードも別のファイルにしておきます。名前はresource.jsです。
/**
* リソースの読み込み
*/
tm.preload(function() {
// 音
tm.sound.SoundManager.add("bgm", "http://rawgithub.com/omatoro/tmlib.js_tutorial_TouchGame/master/EX_%E9%9F%B3%E3%82%92%E9%B3%B4%E3%82%89%E3%81%9D%E3%81%86/01_BGM/rsc/Comical01_Koya.mp3");
});
新しくresource.jsというファイルを用意しました。tm.preload()関数内に読み込みたいファイルを記述します。次は読み込んだデータの呼び出し方です。
/**
* MainScene
*/
(function(ns) {
// ラベルのリスト
var UI_DATA = {
LABELS: {
children: [{
type: "Label",
name: "label",
x: 40,
y: 80,
width: ns.SCREEN_WIDTH,
fillStyle: "red",
text: "ここはMainSceneです。",
fontSize: 30,
align: "left"
},{
type: "Label",
name: "limitTimeLabel",
x: 200,
y: 120,
width: ns.SCREEN_WIDTH,
fillStyle: "white",
text: " ",
fontSize: 40,
align: "left"
}]
}
};
var HEART_SIZE = 64;
var HEART_NUM = 10;
var HEART_PARAM = {
fillStyle: "pink",
};
var LIMIT_TIME = 300; // 10秒 x 30フレーム = 300
ns.MainScene = tm.createClass({
superClass : tm.app.Scene,
init : function() {
this.superInit();
// ラベル表示
this.fromJSON(UI_DATA.LABELS);
// たくさんハートを作る
this.heartGroup = tm.app.CanvasElement();
for (var i = 0; i < HEART_NUM; ++i) {
// 色をつくる
HEART_PARAM.fillStyle = tm.graphics.Color.createStyleHSLA(Math.rand(0, 360), 95, 75, 0.8);
// ハートを作る
var heart = tm.app.HeartShape(
HEART_SIZE,
HEART_SIZE,
HEART_PARAM);
// 表示位置
heart.position.set(
Math.rand(HEART_SIZE/2, ns.SCREEN_WIDTH - HEART_SIZE/2),
Math.rand(HEART_SIZE/2, ns.SCREEN_HEIGHT - HEART_SIZE/2));
// ハートをタッチした時の処理を作る
heart.interaction.enabled = true; // ヒット判定フラグをON
heart.interaction.boundingType = "circle"; // 円形のヒット判定を行う
heart.addEventListener("pointingend", function() {
// 消す
this.remove();
});
// 表示する
this.heartGroup.addChild(heart);
}
this.addChild(this.heartGroup);
// 制限時間
this.limitTime = LIMIT_TIME;
// BGM再生
this.bgm = tm.sound.SoundManager.get("bgm");
this.bgm.loop = true;
this.bgm.play();
},
update: function (app) {
// カウントダウンを行う
--this.limitTime;
// 制限時間を表示する
this.limitTimeLabel.text = "残り時間 : " + ((this.limitTime / 30) |0);
// 制限時間がなくなったらEndSceneに遷移する
if (this.limitTime <= 0) {
this.bgm.stop();
app.replaceScene(ns.EndScene(0));
}
// ハートが全部なくなったらEndSceneに遷移する
if (this.heartGroup.children.length <= 0) {
this.bgm.stop();
app.replaceScene(ns.EndScene(this.limitTime));
}
},
});
})(game);
tm.sound.SoundManager.get()関数を使うことで、読み込んだデータを取り出すことができます。取り出したデータをthis.bgm変数に入れ込み、ループして鳴るように設定しています。play()関数を呼べば音がなります。音を出すにはplay()関数を呼ぶだけです。簡単ですね。EndSceneに遷移する前に音を止めています。
// 制限時間がなくなったらEndSceneに遷移する
if (this.limitTime <= 0) {
this.bgm.stop();
app.replaceScene(ns.EndScene(0));
}
// ハートが全部なくなったらEndSceneに遷移する
if (this.heartGroup.children.length <= 0) {
this.bgm.stop();
app.replaceScene(ns.EndScene(this.limitTime));
}
EndSceneではまた別の音を鳴らしたい!と思ったら、同じように追加してみてくださいね。
SE(サウンドエフェクト)を鳴らしてみよう
サンプル
コードの解説
SE用の音楽データを追加し、resource.jsファイルを書き換えます。
/**
* リソースの読み込み
*/
tm.preload(function() {
// 音
tm.sound.SoundManager.add("bgm", "http://rawgithub.com/omatoro/tmlib.js_tutorial_TouchGame/master/EX_%E9%9F%B3%E3%82%92%E9%B3%B4%E3%82%89%E3%81%9D%E3%81%86/02_SE/rsc/Comical01_Koya.mp3");
tm.sound.SoundManager.add("se", "http://rawgithub.com/omatoro/tmlib.js_tutorial_TouchGame/master/EX_%E9%9F%B3%E3%82%92%E9%B3%B4%E3%82%89%E3%81%9D%E3%81%86/02_SE/rsc/%5BSystem%5DCursor03_panop.ogg");
});
次は、ハートを消した時に音がなるようにMainSceneを修正してみましょう。
/**
* MainScene
*/
(function(ns) {
// ラベルのリスト
var UI_DATA = {
LABELS: {
children: [{
type: "Label",
name: "label",
x: 40,
y: 80,
width: ns.SCREEN_WIDTH,
fillStyle: "red",
text: "ここはMainSceneです。",
fontSize: 30,
align: "left"
},{
type: "Label",
name: "limitTimeLabel",
x: 200,
y: 120,
width: ns.SCREEN_WIDTH,
fillStyle: "white",
text: " ",
fontSize: 40,
align: "left"
}]
}
};
var HEART_SIZE = 64;
var HEART_NUM = 10;
var HEART_PARAM = {
fillStyle: "pink",
};
var LIMIT_TIME = 300; // 10秒 x 30フレーム = 300
ns.MainScene = tm.createClass({
superClass : tm.app.Scene,
init : function() {
this.superInit();
// ラベル表示
this.fromJSON(UI_DATA.LABELS);
// たくさんハートを作る
this.heartGroup = tm.app.CanvasElement();
for (var i = 0; i < HEART_NUM; ++i) {
// 色をつくる
HEART_PARAM.fillStyle = tm.graphics.Color.createStyleHSLA(Math.rand(0, 360), 95, 75, 0.8);
// ハートを作る
var heart = tm.app.HeartShape(
HEART_SIZE,
HEART_SIZE,
HEART_PARAM);
// 表示位置
heart.position.set(
Math.rand(HEART_SIZE/2, ns.SCREEN_WIDTH - HEART_SIZE/2),
Math.rand(HEART_SIZE/2, ns.SCREEN_HEIGHT - HEART_SIZE/2));
// ハートをタッチした時の処理を作る
heart.interaction.enabled = true; // ヒット判定フラグをON
heart.interaction.boundingType = "circle"; // 円形のヒット判定を行う
heart.addEventListener("pointingend", function() {
// 音を出す
tm.sound.SoundManager.get("se").clone().play();
// 消す
this.remove();
});
// 表示する
this.heartGroup.addChild(heart);
}
this.addChild(this.heartGroup);
// 制限時間
this.limitTime = LIMIT_TIME;
// BGM再生
this.bgm = tm.sound.SoundManager.get("bgm");
this.bgm.loop = true;
this.bgm.play();
},
update: function (app) {
// カウントダウンを行う
--this.limitTime;
// 制限時間を表示する
this.limitTimeLabel.text = "残り時間 : " + ((this.limitTime / 30) |0);
// 制限時間がなくなったらEndSceneに遷移する
if (this.limitTime <= 0) {
this.bgm.stop();
app.replaceScene(ns.EndScene(0));
}
// ハートが全部なくなったらEndSceneに遷移する
if (this.heartGroup.children.length <= 0) {
this.bgm.stop();
app.replaceScene(ns.EndScene(this.limitTime));
}
},
});
})(game);
これで音が鳴るようになりました。本当はもっと大変なんですけど、tmlib.jsが準備してくれているおかげですね。





