11. 発射音をつける。
音楽ファイルは、圧縮と、DXライブラリとの相性のいいoggファイルを使用します。
oggファイルは、普段聞きなれない音楽圧縮ファイルかもしれませんが、mp3と同等以上の性能を持っています。
mp3は音楽の再生に一瞬時間がかかるのに比べ、oggはほぼ同時に再生できます。
素材に、すでにoggファイル変換されたものが入っているので、自分で変換する必要はありませんが、
今後、自分でファイルを作るときのためにエンコードの説明をします。
oggファイルへのエンコーダはこちらから入手してください。
oggdropXPd V.1.8.9 using libVorbis v1.1.2 2006-03-31
Windows 2000, or greater required. Generic MSVC7.1 compile, P3/AMD and
P4 MSVC7.1/ICL9.0 compiles
Generic (355Kb) P3/AMD (442Kb) - P4 only (402Kb) - Source + Libraries (929Kb)
と書かれている箇所の Generic (355Kb) という部分をクリックするとダウンロード ウインドウが開きます。
ソフトは英語ですが、エンコードの方法は wav ファイルを ソフトのウインドウ上にドラッグ&ドロップするだけなので簡単です。
では、今回の実質的な処理を説明していきます。
サウンドを流すために、サウンドのハンドルを格納する変数を用意します。名前はsound_player_shotとします。
ボム音と通常ショット音の2種類を格納したいので配列で宣言します。
グローバル変数なので、GlobalVariable.hに
int sound_player_shot[2];
を追加します。
それに伴いExternGV.hにも
extern int sound_player_shot[2];
を追加します。
サウンドを読み込みたいので、img_sound_load.cpp内の関数に
sound_player_shot[0]= LoadSoundMem("Sh/sound/Player/shot.ogg");
を追加します。これで、sound_player_shot[0]が使えるようになりました。これは通常のショット音が入っています。
発射するかどうかは、この部分で判定しますね。
if(Key[KEY_INPUT_Z]==1 && counter%5==0){//Zが押されていて、処理が5回に1回なら for(i=0;i<ShotLevel;i++){//今のショットレベルまで列をループ for(j=0;j<PLAYER_MAX_SHOT2;j++){//最大15個までループ if(PlayerShot[i][j].flag==0){//発射されていない弾なら PlayerShot[i][j].flag=1;//発射する。 PlayerShot[i][j].x=Player.x+(double)positionx[i];//xの初期座標を代入 PlayerShot[i][j].y=Player.y+(double)positiony[i];//yの初期座標を代入 if(CheckSoundMem(sound_player_shot[0])==0) //現在ショット音が再生されていなければ PlaySoundMem(sound_player_shot[0],DX_PLAYTYPE_BACK); //ショット音を再生する break; } } } }
中央のif文の中に処理が入ったとき、玉が発射された瞬間です。
この時、PlaySoundMem関数によって音を出しましょう。
今、ifのCheckSoundMem関数で、音楽が流れているかどうか、わざわざ判定しているのは、連続でかぶさって再生されてしまうのを防ぐためです。
現在ショット音が再生されていなければ、ショット音を再生します。
今回から素材の必要ヴァージョンが1.10以上になっているので注意してください。
/* player.cpp */
/* 素材 ver 1.10以上必要 */
#include "DxLib.h" #include "ExternGV.h" void PlayerControl(){ if(Key[KEY_INPUT_LEFT]==1){ Player.x-=4.0f; if(Player.x<10.0) Player.x=10.0; } if(Key[KEY_INPUT_RIGHT]==1){ Player.x+=4.0f; if(Player.x>409.0) Player.x=409.0; } if(Key[KEY_INPUT_UP]){ Player.y-=4.0f; if(Player.y<15.0) Player.y=15.0; } if(Key[KEY_INPUT_DOWN]==1){ Player.y+=4.0f; if(Player.y>465.0) Player.y=465.0; } DrawGraph((int)Player.x-16,(int)Player.y-24,img_player[0],TRUE); } void PlayerShotCalc(){ int i,j; int positionx[11]={0,-10,10,-10,10,-15,15,-10,10,-10,10},positiony[11]={-15,-2,-2,6,6,-6,-6,2,2,10,10}; if(Key[KEY_INPUT_Z]==1 && counter%5==0){ for(i=0;i<ShotLevel;i++){ for(j=0;j<PLAYER_MAX_SHOT2;j++){ if(PlayerShot[i][j].flag==0){ PlayerShot[i][j].flag=1; PlayerShot[i][j].x=Player.x+(double)positionx[i]; PlayerShot[i][j].y=Player.y+(double)positiony[i]; if(CheckSoundMem(sound_player_shot[0])==0) PlaySoundMem(sound_player_shot[0],DX_PLAYTYPE_BACK); break; } } } } int sab[11]={0,-1,1,-3,3,0,0,-2,2,-5,5}; for(i=0;i<PLAYER_MAX_SHOT1;i++){ for(j=0;j<PLAYER_MAX_SHOT2;j++){ if(PlayerShot[i][j].flag==1){ PlayerShot[i][j].x+=(double)sab[i]; PlayerShot[i][j].y-=10.0; if(PlayerShot[i][j].y<-20) PlayerShot[i][j].flag=0; } } } } void PlayerShotDisp(){ int i,j; for(i=0;i<PLAYER_MAX_SHOT1;i++){ for(j=0;j<PLAYER_MAX_SHOT2;j++){ if(PlayerShot[i][j].flag==1){ switch(i){ case 0: case 5: case 6: DrawGraph((int)PlayerShot[i][j].x-10,(int)PlayerShot[i][j].y-18,img_player_shot[0],TRUE); break; default: DrawGraph((int)PlayerShot[i][j].x-8,(int)PlayerShot[i][j].y-10,img_player_shot[1],TRUE); break; } } } } }
上に変更点は書きましたが、今回他のファイルも変更しましたので、改めて、他のファイルの内容も書いておきます。
/* GlobalVariable.h */
/* 定義 */ #define PLAYER_MAX_SHOT1 11 #define PLAYER_MAX_SHOT2 15 /* グローバル宣言 */ int counter=0; int color_white; char Key[256]; //画像ファイルハンドル int img_background[2]; int img_player[4]; //玉 int img_player_shot[2]; //各種変数 int ShotLevel=11; //音声ファイルハンドル int sound_player_shot[2]; //構造体 typedef struct{ double x,y; int status,counter; } BODY_player_t; BODY_player_t Player; typedef struct{ double x,y; int flag; } SHOT_t; SHOT_t PlayerShot[PLAYER_MAX_SHOT1][PLAYER_MAX_SHOT2];
/* ExternGV.h */
/* 定義 */ #define PLAYER_MAX_SHOT1 11 #define PLAYER_MAX_SHOT2 15 /* extern 宣言 */ extern int counter; extern int color_white; extern char Key[256]; //画像ファイルハンドル extern int img_background[2]; extern int img_player[4]; //玉 extern int img_player_shot[2]; //各種変数 extern int ShotLevel; //音声ファイルハンドル extern int sound_player_shot[2]; //構造体 typedef struct{ double x,y; int status,counter; int shot [11][15]; } BODY_player_t; extern BODY_player_t Player; typedef struct{ double x,y; int flag; } SHOT_t; extern SHOT_t PlayerShot[PLAYER_MAX_SHOT1][PLAYER_MAX_SHOT2];
/* img_sound_load.cpp */
#include "DxLib.h" #include "ExternGV.h" void img_sound_load(){ //画像ハンドル取得 img_background[0] = LoadGraph("Sh/img/back/background0.png"); img_background[1] = LoadGraph("Sh/img/back/background1.png"); img_player_shot[0] = LoadGraph("Sh/img/shot/player/1.png"); img_player_shot[1] = LoadGraph("Sh/img/shot/player/2.png"); LoadDivGraph( "Sh/img/char/player.png" , 4 , 4 , 1 , 32 , 48 , img_player ) ; //音楽ハンドル取得 sound_player_shot[0]= LoadSoundMem("Sh/sound/Player/shot.ogg"); }
実行画面
DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi
Yamada.