


10. 沢山の弾を発射する。2
 先ほど説明しなかったサンプルの青い部分について説明します。
弾は発射する時の初期座標は全部同じではありません。(キャラの中心から発射しているわけではありません)
拡大写真を見て判るとおり、中心ほど前に、両側は外へ広がっていますね。
これがもし、全部が同じ座標から発射されると初め直線にみえてしまいます。
前節の移動するX座標のように、また個別に発射する初期座標を配列で決めましょう。
この写真で、弾の列の数字を確認してください。

0列の弾の初期X座標はプレイヤーのX座標と同じです。(+0です)
1列の弾の初期X座標はプレイヤーのX座標-10です。
2列の弾の初期X座標はプレイヤーのX座標+10です。。。。。
これを11まで配列に格納したのが
int positionx[11]={0,-10,10,-10,10,-15,15,-10,10,-10,10};
です。
0列の弾の初期Y座標はプレイヤーのY座標-15です。
1列の弾の初期Y座標はプレイヤーのY座標-2です。
2列の弾の初期Y座標はプレイヤーのY座標-2です。。。。。
これを11まで配列に格納したのが
int positiony[11]={-15,-2,-2,6,6,-6,-6,2,2,10,10};
です。
特定の列の弾の座標を初期化するときは、この値を個別にたす必要があります。
それを書いたのがこれです。
        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){//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座標を初期化
                                        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;
                                }
                        }
                }
        }
}
実行画面
DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi 
Yamada.