fslashtの日記: [SDL] SDL_Mixerって楽ちんすぎ 2
日記 by
fslasht
STATUS: 故障中
ゲームのBGM・効果音をどうしようかと思ったんだけど、SDL_Mixer使ってみたらとても簡単でびっくり。
効果音の同時再生も何も考えずにサポートされる。(同時再生数は指定可能)
BGMのフェードイン・フェードアウトも簡単。コールバックを書けば独自エフェクトもかけられるみたい。
サウンド関連だけのためにSDL使ってもいいな。
【はまり中】
再生用の音楽ファイルとして、mp3とかも使えるみたいだけどよくわからなかった。mp3の読み込みにはsmpegを使えばいいみたいだけど、コンパイル済みのDLLって無いの?
● Windows + VisualC++6.0で使うときのメモ
【必要なライブラリ】
・SDL
http://www.libsdl.org/release/SDL-devel-1.2.7-VC6.zip
(http://www.libsdl.org/download-1.2.php)
・SDL_Mixer
http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-devel-1.2.5a-VC6.zip
(http://www.libsdl.org/projects/SDL_mixer/)
ドキュメント:http://jcatki.no-ip.org/SDL_mixer/SDL_mixer_frame.html
【ディレクトリ構成例】
MyProject/ このソース
sdk/SDL-1.2.7/ SDL
sdk/SDL_mixer-1.2.5/ SDL_Mixer
【リンクするライブラリの指定】
..\sdk\SDL-1.2.7\lib\SDL.lib ..\sdk\SDL_mixer-1.2.5\lib\SDL_mixer.lib
【ソース例】
※ C Magazine 2002/2 P.41のソースをパク^h^h参考にしました
#include "../sdk/SDL-1.2.7/include/SDL.h"
#include "../sdk/SDL_mixer-1.2.5/include/SDL_mixer.h"
// 以下ソースの適当なところに書く
Mix_Music *music;
Mix_Chunk *chunk,*chunk2;
SDL_Init(SDL_INIT_AUDIO ); // SDL初期化
Mix_OpenAudio(22050,AUDIO_S16,2,4096); // SDL_Mixerオープン
music = Mix_LoadMUS("music.wav"); // 曲ファイルをロード
chunk = Mix_LoadWAV("se1.wav"); // 効果音ファイル1をロード
chunk2 = Mix_LoadWAV("se2.wav"); // 効果音ファイル2をロード
Mix_AllocateChannels(16); // 同時発声数を設定
Mix_PlayMusic(music,-1); // 曲の再生スタート(無限ループ)
SDL_Delay(2000);
Mix_PlayChannel( -1,chunk,0 ); // 効果音1再生
SDL_Delay(500);
Mix_PlayChannel( -1,chunk2,0 ); // 効果音2再生 (ちゃんと音が重なる)
SDL_Delay(1000);
Mix_FadeOutMusic(4000); // フェードアウト(4000ms)
SDL_Delay(4000);
Mix_HaltMusic(); // 曲の再生停止
Mix_FreeMusic(music); // ロードした曲を開放
Mix_FreeChunk(chunk); // ロードした効果音1を開放
Mix_FreeChunk(chunk2); // ロードした効果音2を開放
Mix_CloseAudio(); // SDL_Mixerクローズ
SDL_Quit(); // SDL使用終了
ゲームのBGM・効果音をどうしようかと思ったんだけど、SDL_Mixer使ってみたらとても簡単でびっくり。
効果音の同時再生も何も考えずにサポートされる。(同時再生数は指定可能)
BGMのフェードイン・フェードアウトも簡単。コールバックを書けば独自エフェクトもかけられるみたい。
サウンド関連だけのためにSDL使ってもいいな。
【はまり中】
再生用の音楽ファイルとして、mp3とかも使えるみたいだけどよくわからなかった。mp3の読み込みにはsmpegを使えばいいみたいだけど、コンパイル済みのDLLって無いの?
● Windows + VisualC++6.0で使うときのメモ
【必要なライブラリ】
・SDL
http://www.libsdl.org/release/SDL-devel-1.2.7-VC6.zip
(http://www.libsdl.org/download-1.2.php)
・SDL_Mixer
http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-devel-1.2.5a-VC6.zip
(http://www.libsdl.org/projects/SDL_mixer/)
ドキュメント:http://jcatki.no-ip.org/SDL_mixer/SDL_mixer_frame.html
【ディレクトリ構成例】
MyProject/ このソース
sdk/SDL-1.2.7/ SDL
sdk/SDL_mixer-1.2.5/ SDL_Mixer
【リンクするライブラリの指定】
..\sdk\SDL-1.2.7\lib\SDL.lib ..\sdk\SDL_mixer-1.2.5\lib\SDL_mixer.lib
【ソース例】
※ C Magazine 2002/2 P.41のソースをパク^h^h参考にしました
#include "../sdk/SDL-1.2.7/include/SDL.h"
#include "../sdk/SDL_mixer-1.2.5/include/SDL_mixer.h"
// 以下ソースの適当なところに書く
Mix_Music *music;
Mix_Chunk *chunk,*chunk2;
SDL_Init(SDL_INIT_AUDIO ); // SDL初期化
Mix_OpenAudio(22050,AUDIO_S16,2,4096); // SDL_Mixerオープン
music = Mix_LoadMUS("music.wav"); // 曲ファイルをロード
chunk = Mix_LoadWAV("se1.wav"); // 効果音ファイル1をロード
chunk2 = Mix_LoadWAV("se2.wav"); // 効果音ファイル2をロード
Mix_AllocateChannels(16); // 同時発声数を設定
Mix_PlayMusic(music,-1); // 曲の再生スタート(無限ループ)
SDL_Delay(2000);
Mix_PlayChannel( -1,chunk,0 ); // 効果音1再生
SDL_Delay(500);
Mix_PlayChannel( -1,chunk2,0 ); // 効果音2再生 (ちゃんと音が重なる)
SDL_Delay(1000);
Mix_FadeOutMusic(4000); // フェードアウト(4000ms)
SDL_Delay(4000);
Mix_HaltMusic(); // 曲の再生停止
Mix_FreeMusic(music); // ロードした曲を開放
Mix_FreeChunk(chunk); // ロードした効果音1を開放
Mix_FreeChunk(chunk2); // ロードした効果音2を開放
Mix_CloseAudio(); // SDL_Mixerクローズ
SDL_Quit(); // SDL使用終了
激薄皮ラップなクラス化してみた(ヘッダ部) (スコア:1)
#define AFX_FTEZSDLSOUND_H__8232A97C_E7A2_4391_B5B5_5BC07CE909CA__INCLUDED_
#include "../sdk/SDL-1.2.7/include/SDL.h"
#include "../sdk/SDL_mixer-1.2.5/include/SDL_mixer.h"
class FTEzSDLSound
{
private:
CMapWordToPtr m_mapMusic;
CMapWordToPtr m_mapSound;
int m_nMusicVolume; // 0-255
int m_nSoundVolume; // 0-255
enum { VOL_MAX=255 };
bool m_fOpenAudio;
bool m_fAutoSDLQuit;
public:
// 生成・消滅
FTEzSDLSound();
virtual ~FTEzSDLSound();
public:
// 初期化・開放 (通常は直接は使用しない)
bool Init();
bool Release();
// インスタンス消滅時に自動的にSDLQuitを呼ぶ
void SetAutoSDLQuit() { m_fAutoSDLQuit = true; }
// オープン・クローズ (オープン処理は必須)
bool OpenAudio( int nFreq = 44100 , WORD wFormat=AUDIO_S16 , int nChannnel=2 , int nChunksize=4096 );
bool CloseAudio();
// 曲・サウンドのロード、開放
bool LoadMusic( WORD wID , LPCSTR lpszFilename ); // ID,ファイル名 (IDは演奏時に使用)
bool LoadSound( WORD wID , LPCSTR lpszFilename );
bool ReleaseMusic( WORD wID );
bool ReleaseSound( WORD wID );
// 曲・サウンドの音量設定(0-255)
bool SetMusicVolume( int nVolume = 255);
bool SetSoundVolume( int nVolume = 255);
// 曲の演奏、停止、演奏中チェック
bool PlayMusic( WORD wID , int nLoops = 1 );
bool FadeInMusic( WORD wID , int nLoops = 1 , int nTime = 2000);
bool FadeOutMusic( int nTime = 2000);
bool StopMusic();
bool IsPlayingMusic();
// サウンドの再生、停止、生成中チェック
bool PlaySound( WORD wID , int nLoops = 0, int nVolume = 255);
bool StopSound();
bool IsPlayingSound();
// 内部使用メソッド
Mix_Music* GetMusicPtr( WORD wID );
Mix_Chunk* GetSoundPtr( WORD wID );
// Static
static bool SDLInit( DWORD dwFlags = SDL_INIT_AUDIO );
static void SDLDelay( int nTime );
static void SDLQuit();
};
#endif
使用例 (スコア:1)
FTEzSDLSound sound;
sound.Open(); // open (必須)
sound.LoadMusic( 1 , "bmg.wav" ); // BGM曲1ロード
sound.LoadSound( 1 , "se1.wav" ); // 効果音1ロード
sound.LoadSound( 2 , "se2.wav" ); // 効果音2ロード
sound.SetMusicVolume( 200 ); // BMG音量設定(0-255)
sound.PlayMusic( 1 ); // BGM曲1再生 (第2引数で再生回数指定可能)
while ( sound.IsPlayingMusic() ) { // BGM演奏中はwhileループ
FTEzSDLSound::SDLDelay( 1000 ); // 1000msウェイト
sound.PlaySound(1); // 効果音1を再生
FTEzSDLSound::SDLDelay( 1000 ); // 1000msウェイト
sound.PlaySound(2,0,128); // 効果音2を再生 (音量Volume=128と指定)
}
sound.StopSound(); // 効果音再生を停止
FTEzSDLSound::SDLQuit(); // SDL使用を終了