シューティングゲームの館

今日 昨日


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.