音の機能
今までビジュアル重視の機能を追いかけてきましたが、ゲームにはやはり効果音が欠かせません。
カッコいいBGMに大迫力サウンド!
やってみたいですね…そのうち。
DirectXを使えば複数の音の重ね合わせや3D空間の表現などを行なうことが出来ます。
これらの機能はEasy3Dでも利用可能です。といってもDirectXでできる事が全てできるかどうかは分かりませんが、
現状でゲームには十分なだけの機能が搭載されています。
音関連の基本的なところでは、
などの機能。3Dサウンドでは、
などの機能が用意されています。
対応ファイル形式は、*.wav, *.mid, *.sgt ファイル(3Dサウンドは、wavファイルのモノラル形式のみ)となっています。
mp3やoggへの対応がないのはちょっと気になるところです。(BGMに使うぐらいなら他のプラグインで対応できるか?)
といってもゲーム用素材ではwaveやmidiも豊富なのでさほど気にする必要はないかもしれません。
さて、カッコいいBGMに大迫力サウンド!もいいですが、とりあえず今回はステレオサウンドで音を鳴らすだけというのをやってみます。
音声の再生
音声ファイルを登録し、音を識別する番号(サウンドID)を取得します。
以降はこのサウンドIDを使っていろいろ設定したり再生したりするわけです。
いつもどおりですね。(hsidみたいな)
音声ファイルの登録
音声ファイルの登録は
E3DLoadSoundを使います。
E3DLoadSound filename, soundid, use3dflag, bufnum
use3dflagとbufnumは3Dサウンドを使わないので省略して構いません。
soundidにサウンドIDが返されます。
これで再生の準備はOKです。
音声の再生
音声の再生には
E3DPlaySoundを使います。
E3DPlaySound soundid, isprimary, boundaryflag
とりあえず、
BGMなら
isprimaryは1
効果音なら
isprimaryは0
としておけばいいようです。
boundaryflagには再生境界を設定するらしいのですが…意味がさっぱり分かりません。
実際に使ってみても違いがよく分からなかったのでとりあえず、Easy3Dのサンプルスクリプトで使ってたDMUS_SEGF_GRIDを使っておきます。
サンプル解説
サンプルではキー入力を擬似的にトリガータイプキーにしています。
押している間に何回も再生されるとまともに聞き取れませんから。
おまけ機能でFPSが表示されるようになってます。
今回は負荷がほとんどかからないので、まったくの無意味機能です。(笑)
まあ、こうすれば変動の激しいFPS値も見やすくなるというサンプルです。
記事に余裕があったので付けてみました。
これといった意味はありません。なんとなくです。
サンプル
Easy3Dのパッケージ内のMediaフォルダの中にある次の2つのwaveファイルをコピーしておいてください。
d_bang.wav、sbounce.wav
動作確認にはスピーカーやヘッドホンなどが必要です。用意しておいてください。
操作は簡単。
「Z」キーか「X」キーを押せば音が鳴ります。これだけのプログラムです。
;
; 音の再生
;
#include "e3dhsp.as"
#module
#deffunc waitbyfps int
mref p1, 0
E3DWaitbyFPS@ p1
await 0
i = p1/10 : mm = ""+stat+" FPS "
repeat i
mm += "■"
loop
title ""+mm
return
#global
;/////////////////
;
; 初期化
;
E3DInit
dim keybuf, 256 ;キー入力
dim keybuf2, 256 ;キー入力
;/////////////////
;
; サウンドの用意
;
;file のpath 用のバッファーの作成
sdim pathbuf, 2048, 4
; 音ファイルの読み込み
pathbuf.1 = curdir + "\\d_bang.wav"
pathbuf.2 = curdir + "\\sbounce.wav"
E3DLoadSound pathbuf.1, soundid1 ;音の識別番号取得
E3DLoadSound pathbuf.2, soundid2
;########################
; メインループ
*main
E3DGetKeyboardState keybuf
if keybuf.VK_ESCAPE = 1 : goto *bye ; [ESC]で終了
gosub *PlaySound
E3DBeginScene
E3DDrawText 20, 40, 1, 0,255,0, "Push key \"Z\" or \"X\""
E3DEndScene
E3DPresent
repeat 256
keybuf2.cnt = keybuf.cnt
loop
waitbyfps 60
goto *main
;########################
; サブルーチン
*bye
E3DBye
end
*PlaySound
if (keybuf2.'Z' = 0)&(keybuf.'Z' = 1) : E3DPlaySound soundid1, 0, DMUS_SEGF_GRID
if (keybuf2.'X' = 0)&(keybuf.'X' = 1) : E3DPlaySound soundid2, 0, DMUS_SEGF_GRID
return
|
GHP(仮)