


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.