効果音(1/2) |
効果音を鳴らすには、まず効果音の音声ファイルを用意する必要があります。用意できたら、それをゲームのプログラムがあるフォルダに置き、プログラム中で読み込んで「鳴らせ」と命令すれば鳴ります。
1.効果音を読み込む |
2.効果音を鳴らす |
音声ファイル
音声ファイルにはWAVE形式、MIDI形式、MP3形式など、いろいろな種類があります。普通、効果音(SE : Sound Effect)はWAVE形式、音楽(BGM : Back Ground Music)はMIDI形式を使います。どうしてどっちか片方に統一しないのかというと、それぞれの特徴によります。 MIDIというのは、音そのものを記録するのではなく、楽譜を記録している形式です。つまり、楽器の種類や音の大きさ、音符等のデータです。ですから、音楽を鳴らすのに向いています。コンピュータは、これを解釈して該当する音を鳴らします。 WAVEは音そのものを記録した形式です。つまり波形データです。 MIDIは、ファイルサイズが小さいかわりに、音を鳴らし終わってからまた鳴らすまでに少し時間が空きます。これでは効果音には向きませんね? WAVEは、間隔を空けなくていいかわりにファイルサイズがすごく大きくなります。音が長ければ長いほど、サイズも大きくなります。1分の曲で10MB程度です。効果音は短いからいいのですが、BGMには向きません。 WAVEは拡張子".wav"、MIDIは拡張子".mid"のファイルです。 |
効果音を鳴らす命令
本や講座で、HSPで音を鳴らす方法を紹介する場合、snd命令を使うのが一般的かと思いますが、ここでは使いません。snd命令では、複数の音を重ねて鳴らすことはできません。例えば、敵の爆発音が鳴っている最中に自機のショット音を鳴らすと、その時点で爆発音は途切れてしまいます。プログラマーが工夫をしなければならないので少々やっかいです。 HMM.DLLで追加されたDirectSound用の命令ですと、複数の音をいっしょに鳴らすことができます。DirectSoundは、DirectXでWAVEファイルを扱うためのコンポーネントです。 dsinit DirectSoundを初期化します。 dsloadfname ファイル名,バッファ番号 指定した名前のWAVEファイルを指定した番号のバッファに読み込みます。番号は0から1023までです。つまり、最大1024種類の効果音が使えるということになります。一般にバッファというのは「何かを溜め込んでおく所」という意味です。仮想画面を読み込んでおく所もバッファ、音を読み込んでおく所もバッファ、キー入力情報を溜め込んでおく所もバッファです。 dsplay バッファ番号 指定した番号の音を鳴らします。先ほど「snd命令は複数の音を重ねて鳴らすことはできない」と書きましたが、これは番号が違えば重ねて鳴らせます。が、同じ番号の音を立て続けに鳴らした場合、やはり前の音は途切れてしまいます。ザコの爆発音は「ツイーン」ですが、2匹連続してやっつけると「ツイツイーン」となります。ボスの爆発音「ドカーン」を立て続けに鳴らすと「ドカドカドカドカドカドカーン」となります。しかし、これはそれほど違和感がないので良しとします。 |
1.効果音を読み込む |
「プログラム起動時の初期設定」に以下を追加します。
dsinit
; SEを読み込む
dsloadfname "explodes.wav",1 ; ザコ爆発音
dsloadfname "explodem.wav",2 ; 中型敵、ボス爆発音
dsloadfname "damage.wav",3 ; 敵ダメージ音
dsloadfname "crushed.wav",4 ; 自機爆発音
dsloadfname "itemget.wav",5 ; アイテム取得音
dsloadfname "oneup.wav",6 ; ワンアップ音
dsloadfname "bomb.wav",7 ; ボム音
dsloadfname "shot.wav",8 ; 自機のショット音
2.効果音を鳴らす |
該当する箇所にdsplay命令を追加します。
(1)ザコ、中型敵、ボスの爆発音
中型敵とボスについては同じ音を使います。ただし中型敵は1回だけ、ボスは複数回鳴らします。
「敵の爆発を描画」処理で、爆煙の描き始め(爆発用カウンタeplcntが0)の時にdsplayを実行します。ボスは爆発を10回繰り返しますが、それぞれの爆発のし始め(eplcnt\15=0)の時に鳴らします。
; 敵の爆発を描画
repeat 10
if enemyf.cnt=3 {
k=enekind.cnt
if eneclass.k=0 {
if eplcnt.cnt=0 { dsplay 1 }
・
・
・
}
if eneclass.k=1 {
if eplcnt.cnt=0 { dsplay 2 }
・
・
・
}
if (eneclass.k=2)&(eplcnt.cnt<150) {
n=cnt
if eplcnt.cnt\15=0 {
dsplay 2
・
・
・
}
・
・
・
}
}
loop
(2)敵がダメージを受けた音、ワンアップ音
「敵のダメージ処理」で、enelifeを1減らしてenelifeが0だった場合爆発、そうでない場合ダメージを受けた状態ですから、その時にダメージ音を鳴らします。
またenelifeが0の時スコアを加算しますが、scoreがoneup以上になった時にワンアップ音を鳴らします。
; 敵のダメージ処理
*Enemy_Dmg
; enemyno : 敵の要素番号
enemyf.enemyno=2
dmgcnt.enemyno=0
enelife.enemyno=enelife.enemyno-1
if enelife.enemyno=0 {
・
・
・
if score>=oneup {
dsplay 6
・
・
・
}
}
else {
dsplay 3
}
return
(3)自機の爆発音
「自機と敵、敵弾の当たり判定」処理で、判定フラグfが1の時自機が爆発しますから、この時に鳴らします。
; 自機と敵、敵弾の当たり判定
if playerf=1 {
f=0
・
・
・
if f=1 {
dsplay 4
・
・
・
}
}
(4)アイテム取得音、ワンアップ音
アイテム取得音は、「自機とアイテムの当たり判定」処理で、アイテムを取った時に鳴らします。
scoreがoneup以上になった時にワンアップ音を鳴らします。
; 自機とアイテムの当たり判定
if ((playerf=1)|(playerf=2))&(itemf=1)&(playerx<=(itemx+31))
&((playerx+31)>=itemx)&(playery<=(itemy+31))&((playery+31)>=itemy) {
dsplay 5
・
・
・
if score>=oneup {
dsplay 6
・
・
・
}
・
・
・
}
(5)ボム音
「ボム爆発の描画」処理で、爆発を4回描きますが、それぞれの描き始め(bombcnt\15=0)の時に鳴らします。
; ボム爆発の描画
if bombcnt!-1 {
if bombcnt\15=0 {
dsplay 7
・
・
・
}
・
・
・
}
(6)自機のショット音
「自機弾の射出」処理で、弾を撃つ時に鳴らします。
; 自機弾の射出
if ((playerf=1)|(playerf=2))&(ckey=1) {
shotcnt=shotcnt+1
if shotcnt=4 {
shotcnt=0
repeat noption+1
i=cnt
n=-1
repeat 4
if shotf.i.cnt=0 {
n=cnt
break
}
loop
if n!-1 {
dsplay 8
・
・
・
}
loop
}
}