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

今日 昨日


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.