


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.