


9. 沢山の弾を発射する。
弾は写真のように、計11列発射させようと思います。

弾の情報を格納するための変数は
SHOT_t PlayerShot[PLAYER_MAX_SHOT1][PLAYER_MAX_SHOT2];
で宣言しました。実質
SHOT_t PlayerShot[11][15];
という意味です。1列に15個の弾が最大で表現でき、これが11列あります。つまり、今
j を0〜14だとすると
PlayShot[0][j] は、写真の0の線の軌道にある弾を指します。
PlayShot[1][j] は、写真の1の線の軌道にある弾を指します。
・・・・・(同様)
PlayShot[10][j] は、写真の10線の軌道にある弾を指します。
どれだけアイテムをとったかで、どれくらい弾が発射できるか変更できるようにしましょう。
レベルが一番低いときは0の線上の弾だけ出るように。
次にレベルアップした時は0、1、2の線の上の弾だけ出るように。
次にレベルアップした時は、0、1、2、3、4の線の上の弾だけ出るようにしていきます。
レベルアップするごとに、2列ずつ発射できる弾が増えていきます。
このことからレベルは1から2ずつ、11まで増えるものとします。今回は最初から最大である
int ShotLevel=11; 
で、初期化しておきましょう。
プログラムの説明です。
まず、PlayerChotCalc関数から。サンプルの青い部分については次の章で説明するので流しておいてください。
次の説明をします。弾の軌道の写真をもう一度みてください。

0はまっすぐ飛びますが、1はx軸が負の方向へ少し移動します。
2は正の方向へ少し移動し、10はかなり正の方向へ移動します。
つまりそれぞれの列の弾は独自の方向へ進んでいるので11種類のx軸を変化させる数字を用意する必要があります。
yの方向へ進む速さは全て同じです。1周に-10ほど進んでいます。
0の列は1周にXが変化する値は 0
1の列は1周にXが変化する値は-1
2の列は1周にXが変化する値は+1
3の列は1周にXが変化する値は-3
4の列は1周にXが変化する値は+3
5の列は1周にXが変化する値は 0
6の列は1周にXが変化する値は 0
7の列は1周にXが変化する値は-2
8の列は1周にXが変化する値は+2
9の列は1周にXが変化する値は-5
10の列は1周にXが変化する値は+5
これを配列にしてみます。
sab[11]={0,-1,1,-3,3,0,0,-2,2,-5,5};
このsub[n]の値を任意のPlayerShot[i][j].xにたしてやることで、xがそれぞれの方向へ進んでいきます。
それを表現したのがこれです。
    int sab[11]={0,-1,1,-3,3,0,0,-2,2,-5,5};
    for(i=0;i<PLAYER_MAX_SHOT1;i++){//11列までループ
            for(j=0;j<PLAYER_MAX_SHOT2;j++){//15個までループ
                    if(PlayerShot[i][j].flag==1){//発射している弾なら
                            PlayerShot[i][j].x+=(double)sab[i];//xを作用させる
                            PlayerShot[i][j].y-=10.0;//上に進めるためにy-10をする。
                            if(PlayerShot[i][j].y<-20)//画面外なら
                                    PlayerShot[i][j].flag=0;//発射フラグを戻す
                    }
            }
    }
次にPlayShotDisp関数です。
0、5、6列の弾はimg_player_shot[0]に格納した画像を表示し
それ以外の弾はimg_player_shot[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;
} 
これで、処理ができますね。
これをまとめてサンプルを見てみましょう。
/* player.cpp */
/* 素材 ver1.00以上必要*/
#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];
                                        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;
                                }
                        }
                }
        }
}
今回はこれに加えて、追加したグローバル変数ShotLevelを加える必要があります。
注意:
GlobalVariable.h に
int ShotLevel = 11;
を追加し、
ExternGV.h に
extern int ShotLevel;
を追加してください。
実行画面
DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi 
Yamada.