音の機能

 今までビジュアル重視の機能を追いかけてきましたが、ゲームにはやはり効果音が欠かせません。
カッコいい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





- HOME -

GHP(仮)