tmlibの練習ブログ

自分流にtmlibを触っていきます。分かったことを解説。入門用になれば…?

デフォルトのmain.jsをいじる9,当たり判定で効果音とスコア加算

前回までで、当たり判定により消滅するようになった。

そこで今度は、.enemyを消した時に"ドカ"という効果音を鳴らすようにしたい。


http://testcording.com/?p=1367
このサイトが詳しいけど、要は

tm.preload(function() {
    tm.sound.SoundManager.add("hit_se", "hit_se.wav");
});

と書くと、音ファイルを使えるように読み込め、

tm.sound.SoundManager.get("hit_se").play();

で使える、という事だ(画像を直に使うのとほぼ同じ)


読み込みの記述は例によって初めの方、ASSETSの下のところへ置き、ヒット効果音はvisibleで消した所で使おう。

if(this.star.isHitElement(this.enemy) && this.enemy.visible == true){
	tm.sound.SoundManager.get("hit_se").play(); // #追加
	this.enemy.visible = false;
}


効果音は適当に作って、という訳にはいかないので、
ザ・マッチメイカァズ2nd 【フリー効果音素材】
の効果音をダウンロードして使わせて頂こう。
当たったぽい効果音を探して、hit_seにリネームする(.wav形式のものでないとだめ)


そして画像と同じく、index.htmlと同じフォルダに置く。
上手くいったなら、効果音が鳴って消えたと思う。

ついでなので、スコア表示もしてしまおう。

これは実は過去記事、デフォルトのmain.jsをいじる4,シーンを使わずに画像表示してみる - tmlibの練習ブログでもチラッと見ているのだけど、"Label"で行う。


tmlib.jsでシューティングゲームを作るチュートリアル その10 スコアを表示する « なんかもう実験場
ここがとても分かりやすい。


要は、Labelというのは付箋で、文字を書ける。
書いたLabelを画面に貼り付ける、といった感じ。
画像ならSprite、図形ならShape、そして文字ならLable…と。


まずLabelに書き込む物、今回はスコアを作ろう。

tm.util.DataManager.set("userData", {
    score: 0
});

を、またもASSETSの下の所に置く。
効果音がtm.sound.SoundManagerに収められるのと同じで、今回はスコアにまつわるデータを、tm.util.DataManagerに格納しておくと。


そして画像なんかと同じく、"格納したら取り出せる"。

userData = tm.util.DataManager.get("userData");

で取り出し、

alert(userData.score);

とか

userData.score += 10;

という風に、アクセスを行えるようになる。
これを使い、ラベルへ書き込む時に取得したり、星を消した時にスコア加算する。


Labelは

var titleLabel = tm.app.Label();

基本的にはこう。ただこのままではどこに表示するとか、何の文字を書くかなどが無い、のっぺらぼうなので

(引用)
var titleLabel = tm.app.Label();
titleLabel.position.set(app.width/2, app.height/2);
titleLabel.text = "Title";  // ラベルの文字列
titleLabel.width = app.width;   // フォントの横幅。文字が潰れる場合は横幅を合わせればOK
titleLabel.align = "center";    // 中央揃え。topやendで右揃え、左揃えに出来る。
titleLabel.fontSize = 64;   // フォントのサイズ
this.addChild(titleLabel);


と、設定する(設定する事が多くて大変そうに見えるが)
this.addChild(titleLabel);
がある事からも分かる通り、これは.starや.enemyを宣言している所に並べて書けばOK。


するとthis.という表記をtitleLabelの前に付ける必要が出てくる。
また、今回はLableにスコアを書き込みたいので、さきほどのスコア取得の出番だ。


最終的に

// (this.starへ代入する処理とか)

//スコアの取得
userData = tm.util.DataManager.get("userData");
//ラベルで表示
this.scoreLabel = tm.app.Label();
this.scoreLabel.position.set(SCREEN_WIDTH, 40);
this.scoreLabel.text = "score : " + userData.score;
this.scoreLabel.width = tm.app.width;
this.scoreLabel.align = "end";
this.scoreLabel.fontSize = 32;
this.addChild(this.scoreLabel);

という形になった(右上に表示したかったので、位置を変えている)


あとはスコア増のタイミング。星にぶつかって消した時がいいだろう。

if(this.star.isHitElement(this.enemy) && this.enemy.visible == true){
	tm.sound.SoundManager.get("hit_se").play();
	this.enemy.visible = false;
	// スコアを更新
	userData.score += 100; // #追加
	this.scoreLabel.text = "score : " + userData.score; // #追加
}


f:id:superchineseland:20131116153611j:plain


星にぶつかると効果音が鳴り、100点が手に入る。
という処理ができた。


ここまでのコード(main.js)
http://spchinese.s601.xrea.com/tmlib_text/main_2013_11_16.txt
効果音が入ったので、ここまでのファイル(.zip)
http://spchinese.s601.xrea.com/tmlib_text/tmlib_up_2013_11_16.zip
*バージョンは、tmlib.js 0.2.0で作成。


次回:デフォルトのmain.jsをいじる10,当たり判定に拡大を反映 - tmlibの練習ブログ