敵の飛行機2体それぞれから敵の弾が2連射されるようにしてみよう

ソーラー「さっきのエピソードでは


敵の飛行機10体


敵の飛行機

敵の飛行機1

敵の飛行機2

敵の飛行機3

敵の飛行機4

敵の飛行機5

敵の飛行機6

敵の飛行機7

敵の飛行機8

敵の飛行機9


のうち


敵の飛行機だけから


敵の弾が2連射されるようにすることができたね」


そのプログラムはこちらです

👇


#include "DxLib.h"


struct Character {

double x;

double y;

int graphichandle[7];

int graphicnumber;//👈🌞メンバ変数にgraphicnumber を追加しました

int life;

};


//👆🌞Characterの構造体宣言です



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}




SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です 裏画面に画像を描きます printfDxで表示される文字も裏画面に描かれることになります



struct Character jibunnohikouki;

//👆🌞jibunnohikoukiの構造体変数宣言です


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


jibunnohikouki.graphichandle[0] = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");


jibunnohikouki.graphichandle[1] = LoadGraph("画像データ\\ソーラーが描いた飛行機1.bmp");


jibunnohikouki.graphichandle[2] = LoadGraph("画像データ\\ソーラーが描いた飛行機2.bmp");


jibunnohikouki.graphichandle[3] = LoadGraph("画像データ\\ソーラーが描いた飛行機3.bmp");


jibunnohikouki.graphichandle[4] = LoadGraph("画像データ\\ソーラーが描いた飛行機4.bmp");


jibunnohikouki.graphichandle[5] = LoadGraph("画像データ\\ソーラーが描いた飛行機5.bmp");


jibunnohikouki.graphichandle[6] = LoadGraph("画像データ\\ソーラーが描いた飛行機6.bmp");


jibunnohikouki.life = 1;//👈🌞🌞🌞ここがポイントです🌞🌞🌞




jibunnohikouki.graphicnumber = 0;

//👆 jibunnohikouki.graphicnumberは😋自分の飛行機😋のアニメーションパターンをとりあつかっています


//👆🌞構造体変数jibunnohikoukiのメンバ変数の初期化を行っています

//👆 構造体変数jibunnohikoukiは😋自分の飛行機😋のデータをとりあつかっています



struct Character tekinohikouki[10];

//👆🌞敵の飛行機を10体登場させています


for (int i = 0; i < 10; i++) {


tekinohikouki[i].x = 605;


tekinohikouki[i].y = 35 * i;


tekinohikouki[i].graphichandle[0] = LoadGraph("画像データ\\赤い敵の飛行機1.8.bmp");


tekinohikouki[i].graphichandle[1] = LoadGraph("画像データ\\赤い敵の飛行機1.3.bmp");


tekinohikouki[i].graphichandle[2] = LoadGraph("画像データ\\赤い敵の飛行機2.3.bmp");


tekinohikouki[i].graphichandle[3] = LoadGraph("画像データ\\赤い敵の飛行機3.3.bmp");


tekinohikouki[i].graphichandle[4] = LoadGraph("画像データ\\赤い敵の飛行機4.3.bmp");


tekinohikouki[i].graphichandle[5] = LoadGraph("画像データ\\赤い敵の飛行機5.3.bmp");


tekinohikouki[i].graphichandle[6] = LoadGraph("画像データ\\赤い敵の飛行機6.5.bmp");




tekinohikouki[i].graphicnumber = 128 * GetRand(6);


//👆 tekinohikouki[i].graphicnumberは😋敵の飛行機😋のアニメーションパターンをとりあつかっています


//👆ここです🌞🌞🌞ここでtekinohikouki[i].graphicnumberにランダムに0,128,256,384,512,640,768の値が代入されることになります




tekinohikouki[i].life = 100;//👈🌞🌞🌞敵の飛行機に自分の弾が100発当たると破壊されるようにしました




}



struct Character jibunnotama[2];

//🌞👆自分の弾を2つ作成しています

for (int i = 0; i < 2; i = i + 1) {


jibunnotama[i].x = 0;

jibunnotama[i].y = 0;


jibunnotama[i].graphichandle[0] = LoadGraph("画像データ\\自分の弾.bmp");


jibunnotama[i].life = 0;


}


struct Character bakuhatunohonoo[10];

//👆🌞構造体変数bakuhatuhonoo[0], bakuhatuhonoo[1]…bakuhatuhonoo[9]を作成し爆発の炎のデータを取り扱います


for (int i = 0; i < 10; i++) {


bakuhatunohonoo[i].x = 0;


bakuhatunohonoo[i].y = 0;


bakuhatunohonoo[i].graphichandle[0] = LoadGraph("画像データ\\爆発の炎.bmp");


bakuhatunohonoo[i].graphichandle[1] = LoadGraph("画像データ\\爆発の炎1.bmp");


bakuhatunohonoo[i].graphichandle[2] = LoadGraph("画像データ\\爆発の炎2.bmp");


bakuhatunohonoo[i].graphichandle[3] = LoadGraph("画像データ\\爆発の炎3.bmp");


bakuhatunohonoo[i].graphichandle[4] = LoadGraph("画像データ\\爆発の炎4.bmp");


bakuhatunohonoo[i].graphichandle[5] = LoadGraph("画像データ\\爆発の炎5.bmp");


bakuhatunohonoo[i].graphichandle[6] = LoadGraph("画像データ\\爆発の炎6.bmp");



bakuhatunohonoo[i].life = 0;//🌞🌞🌞 bakuhatunohonoo.lifeを初期化しています



bakuhatunohonoo[i].graphicnumber = 0; //🌞🌞🌞爆発の炎ごとにgraphicnumberを用意して初期化しています


}



struct Character tekinohikoukiwooouhikari;


tekinohikoukiwooouhikari.x = 0;


tekinohikoukiwooouhikari.y = 0;


tekinohikoukiwooouhikari.graphichandle[0] = LoadGraph("画像データ\\赤い敵の飛行機を覆う光.bmp");




tekinohikoukiwooouhikari.life = 0;




struct Character jibunnohikoukinobakuhatunohonoo;

//👆🌞構造体変数jibunnohikoukinobakuhatunohonooを作成し自分の飛行機の爆発の炎のデータを取り扱います




jibunnohikoukinobakuhatunohonoo.x = 0;


jibunnohikoukinobakuhatunohonoo.y = 0;


jibunnohikoukinobakuhatunohonoo.graphichandle[0] = LoadGraph("画像データ\\自分の飛行機の爆発の炎.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[1] = LoadGraph("画像データ\\自分の飛行機の爆発の炎1.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[2] = LoadGraph("画像データ\\自分の飛行機の爆発の炎2.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[3] = LoadGraph("画像データ\\自分の飛行機の爆発の炎3.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[4] = LoadGraph("画像データ\\自分の飛行機の爆発の炎4.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[5] = LoadGraph("画像データ\\自分の飛行機の爆発の炎5.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[6] = LoadGraph("画像データ\\自分の飛行機の爆発の炎6.bmp");



jibunnohikoukinobakuhatunohonoo.life = 0;//🌞🌞🌞 jibunnohikoukinobakuhatunohonoo.lifeを初期化しています



jibunnohikoukinobakuhatunohonoo.graphicnumber = 0; //🌞🌞🌞自分の飛行機の爆発の炎のgraphicnumberを用意して初期化しています



int tsix;//🌞🌞🌞tsixには発射される弾の最初の位置のx座標が代入されることになります tは弾、sは最初、iは位置、xはx座標を表しています



int count = 0;//🌞🌞🌞ここでint型の変数countを作製し0で初期化しました



int tekinotama_tsix = 0; //🌞🌞🌞 tekinotama_tsixには発射される敵の弾の最初の位置のx座標が代入されることになります tは弾、sは最初、iは位置、xはx座標を表しています


int tekinotama_count = 0;




double tekinohikoukiidoupattern[4][3] = { {20,-0.1, 0.1},{20,-0.1,-0.1},{20,-0.1, 0.1},{20,-0.1,-0.1} };//👈🌞🌞🌞🌞🌞ここです敵の飛行機の移動速度は10分の1になるかな?


int m = 0;


int repeat = tekinohikoukiidoupattern[0][0];



struct Character tekinotama[2];

//🌞👆弾が2連射されるよう敵の飛行機の弾を2つ作成しています



for (int i = 0; i < 2; i = i + 1) {


tekinotama[i].x = 0;

tekinotama[i].y = 0;


tekinotama[i].graphichandle[0] = LoadGraph("画像データ\\敵の飛行機の弾ハート.bmp");


tekinotama[i].life = 0;


}



while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {




DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);




int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);



if (jibunnohikouki.life == 1) {


if (4 <= jibunnohikouki.y && jibunnohikouki.y <= 460) {

if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;

}



if (0 <= jibunnohikouki.y && jibunnohikouki.y <= 456) {


if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;

}


if (4 <= jibunnohikouki.x && jibunnohikouki.x <= 605) {


if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;

}


if (0 <= jibunnohikouki.x && jibunnohikouki.x <= 601) {


if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;

}


}


if (jibunnohikouki.life == 1) {


DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle[(jibunnohikouki.graphicnumber / 32) % 7], TRUE);


//👆🌞🌞🌞 🌞🌞🌞 🌞🌞🌞 jibunnohikouki.graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞


jibunnohikouki.graphicnumber = jibunnohikouki.graphicnumber + 1;


}


//👆 jibunnohikouki.lifeに格納されている値が1なら自分の飛行機の画像を描きます

//👆jibunnohikouki.lifeに格納されている値が0なら自分の飛行機の画像が描かれることはありません


if (repeat > 0) {


for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


tekinohikouki[i].x = tekinohikouki[i].x + tekinohikoukiidoupattern[m][1];


tekinohikouki[i].y = tekinohikouki[i].y + tekinohikoukiidoupattern[m][2];

}



}


repeat = repeat - 1;

}


if (repeat == 0) {


if (m < 4) {


repeat = tekinohikoukiidoupattern[m][0];


m = m + 1;

}




if (m == 4) {

m = 0;

repeat = tekinohikoukiidoupattern[m][0];


}


}



for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {



DrawGraph(tekinohikouki[i].x, tekinohikouki[i].y, tekinohikouki[i].graphichandle[(tekinohikouki[i].graphicnumber) / 128 % 7], TRUE);


tekinohikouki[i].graphicnumber = tekinohikouki[i].graphicnumber + 1;


//🌞🌞🌞 (tekinohikouki[i].graphicnumber)を128で割っているので通常のアニメーション速度の128分の1の速度で画像が切り替わります

//👆🌞🌞🌞ここです すでにtekinohikouki[i].graphicnumberには0,128,256,384,512,640,768の値のうちの1つが代入されているので敵の飛行機, 敵の飛行機1・・・敵の飛行機9はそれぞれ異なるタイミングでアニメーションすることになります


}


}




for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


if ((jibunnohikouki.x < tekinohikouki[i].x + 35) && (tekinohikouki[i].x < jibunnohikouki.x + 35) && (jibunnohikouki.y + 7 < tekinohikouki[i].y + 20) && (tekinohikouki[i].y < jibunnohikouki.y + 20)) {


jibunnohikouki.life = 0;


tekinohikouki[i].life = 0;


//👆🌞自分の飛行機と敵の飛行機が衝突すると共に消滅することになります



bakuhatunohonoo[i].x = tekinohikouki[i].x;


bakuhatunohonoo[i].y = tekinohikouki[i].y;



bakuhatunohonoo[i].life = 128 + 128 * GetRand(9); //🌞🌞🌞 bakuhatunohonoo[i].lifeに0以上の値を代入しました bakuhatunohonoo[0].life, bakuhatunohonoo[1].life, bakuhatunohonoo[2].life, bakuhatunohonoo[3].life, bakuhatunohonoo[4].life, bakuhatunohonoo[5].life, bakuhatunohonoo[6].life, bakuhatunohonoo[7].life, bakuhatunohonoo[8].life, bakuhatunohonoo[9].lifeにランダムに異なる値を代入することにより爆発する時間をランダムに変化させています




jibunnohikoukinobakuhatunohonoo.x = jibunnohikouki.x;


jibunnohikoukinobakuhatunohonoo.y = jibunnohikouki.y;


jibunnohikoukinobakuhatunohonoo.life = 128 + 128 * GetRand(9); //🌞🌞🌞 jibunnohikoukinobakuhatunohonoo.lifeに0以上の値を代入しました jibunnohikoukinobakuhatunohonoo.lifeにランダムに異なる値を代入することにより自分の飛行機が爆発する時間をランダムに変化させています



}

}


}


for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


for (int j = 0; j < 2; j++) {


if ((jibunnotama[j].x < tekinohikouki[i].x + 35) && (tekinohikouki[i].x < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 20) && (tekinohikouki[i].y < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[i].life = tekinohikouki[i].life - 1;


//👆🌞自分の弾と敵の飛行機が衝突すると自分の弾は消滅しtekinohikouki[i].lifeに格納されている値は1減ることになります tekinohikouki[i].lifeに格納されている値が0になると敵の飛行機は消滅することになります



tekinohikoukiwooouhikari.x = tekinohikouki[i].x;


tekinohikoukiwooouhikari.y = tekinohikouki[i].y;


//🌞🌞🌞自分の弾と敵の飛行機がぶつかると敵の飛行機の位置座標がtekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.yに代入されます


tekinohikoukiwooouhikari.life = 1;






if (tekinohikouki[i].life == 0) {


bakuhatunohonoo[i].x = tekinohikouki[i].x;


bakuhatunohonoo[i].y = tekinohikouki[i].y;


bakuhatunohonoo[i].life = 128 + 128 * GetRand(9); //🌞🌞🌞 bakuhatunohonoo[i].lifeに0以上の値を代入しました bakuhatunohonoo[0].life, bakuhatunohonoo[1].life, bakuhatunohonoo[2].life, bakuhatunohonoo[3].life, bakuhatunohonoo[4].life, bakuhatunohonoo[5].life, bakuhatunohonoo[6].life, bakuhatunohonoo[7].life, bakuhatunohonoo[8].life, bakuhatunohonoo[9].lifeにランダムに異なる値を代入することにより爆発する時間をランダムに変化させています


}

}


}

}


}



if (tekinohikoukiwooouhikari.life > 0) {



SetDrawBlendMode(DX_BLENDMODE_ALPHA, 200);


//👆🌞🌞🌞描画ブレンドモードがアルファブレンドになっています


DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);



SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);

tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;


// 👆🌞🌞🌞描画ブレンドモードをノーブレンドにして描画ブレンドモードを解除しています

}



//👆🌞🌞🌞敵の飛行機を覆う光の画像が描かれます tekinohikoukiwooouhikari.lifeに格納されている値が0になると敵の飛行機を覆う光の画像が描かれることはありません


for (int i = 0; i < 10; i++) {


if (bakuhatunohonoo[i].life > 0) {


DrawGraph(bakuhatunohonoo[i].x, bakuhatunohonoo[i].y, bakuhatunohonoo[i].graphichandle[(bakuhatunohonoo[i].graphicnumber / 32) % 7], TRUE);


//👆🌞🌞🌞 🌞🌞🌞 🌞🌞bakuhatunohonoo[i].graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞

bakuhatunohonoo[i].graphicnumber = bakuhatunohonoo[i].graphicnumber + 1;

//👆🌞🌞🌞爆発の炎がアニメーションするよう設定が行われています



bakuhatunohonoo[i].life = bakuhatunohonoo[i].life - 1;



}


//👆 bakuhatunohonoo[i].lifeに格納されている値が1なら爆発の炎の画像を描きます

//👆 bakuhatunohonoo[i].lifeに格納されている値が0なら爆発の炎の画像が描かれることはありません


}




if (jibunnohikoukinobakuhatunohonoo.life > 0) {


DrawGraph(jibunnohikoukinobakuhatunohonoo.x, jibunnohikoukinobakuhatunohonoo.y, jibunnohikoukinobakuhatunohonoo.graphichandle[(jibunnohikoukinobakuhatunohonoo.graphicnumber / 32) % 7], TRUE);


//👆🌞🌞🌞 🌞🌞🌞 🌞🌞 jibunnohikoukinobakuhatunohonoo.graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞

jibunnohikoukinobakuhatunohonoo.graphicnumber = jibunnohikoukinobakuhatunohonoo.graphicnumber + 1;

//👆🌞🌞🌞自分の飛行機の爆発の炎がアニメーションするよう設定が行われています



jibunnohikoukinobakuhatunohonoo.life = jibunnohikoukinobakuhatunohonoo.life - 1;



}


//👆 jibunnohikoukinobakuhatunohonoo.lifeに格納されている値が1以上なら自分の飛行機の爆発の炎の画像を描きます

//👆 jibunnohikoukinobakuhatunohonoo.lifeに格納されている値が0なら自分の飛行機の爆発の炎の画像が描かれることはありません





if ((key & PAD_INPUT_A) && (count == 0)) {


for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 0) {


jibunnotama[i].x = jibunnohikouki.x + 35;


tsix = jibunnotama[i].x;


jibunnotama[i].y = jibunnohikouki.y + 10;


jibunnotama[i].life = 1;


break;


}


}


count = 10;

}



if (count > 0) { count = count - 1; }




for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることはありません

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle[0], TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10;


if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}

//👆🌞🌞🌞自分の弾が発射されるプログラムです






//👇🌞🌞🌞敵の弾が発射されるプログラムです


if (tekinotama_count == 0) {

//👆🌞🌞🌞改良点はここですね

for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 0) {


tekinotama[i].x = tekinohikouki[0].x - 10;


tekinotama[i].y = tekinohikouki[0].y + 10;


tekinotama[i].life = 1;


break;


}


}


tekinotama_count = 30;//👈2連射される敵の弾の最初の弾と次弾の間隔を調整することができます


}



if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }



for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 1) {

//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾がゲーム画面に表示されることはありません

DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);


tekinotama[i].x = tekinotama[i].x - 1;


if (tekinotama_tsix - tekinotama[i].x > 640)

//🌞🌞🌞発射された敵の弾の位置のx座標が発射されたときの最初の敵の弾の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾が発射されたときの敵の弾のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾が発射されたときの敵の弾のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります

tekinotama[i].life = 0;


}


}




ScreenFlip();


ClearDrawScreen();


};



DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します


}


デバッグなしで実行をしてから一度プログラムを終了し

生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです

👇


https://www.youtube.com/watch?v=1b4NkqASPMs




ソーラー「



今度は


敵の飛行機10体


敵の飛行機

敵の飛行機1

敵の飛行機2

敵の飛行機3

敵の飛行機4

敵の飛行機5

敵の飛行機6

敵の飛行機7

敵の飛行機8

敵の飛行機9

のうち


敵の飛行機

敵の飛行機1

から


敵の弾が2連射されるようにしてみようよ」


マックス「おお~


そんなこともできるのか?


派手になりそうだな」


solarplexuss 「


敵の飛行機


から


敵の弾が2連射されるプログラムは以下のようになってるんでしょう

👇


🌞🌞🌞敵の飛行機から敵の弾が発射されるプログラム🌞🌞🌞



if (tekinotama_count == 0) {

//👆🌞🌞🌞改良点はここですね

for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 0) {


tekinotama[i].x = tekinohikouki[0].x - 10;


tekinotama[i].y = tekinohikouki[0].y + 10;


tekinotama[i].life = 1;


break;


}


}


tekinotama_count = 30;//👈🌞🌞🌞改良点はここですね


}



if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }



for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 1) {

//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾がゲーム画面に表示されることはありません

DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);


tekinotama[i].x = tekinotama[i].x - 1;


if (tekinotama_tsix - tekinotama[i].x > 640)

//🌞🌞🌞発射された敵の弾の位置のx座標が発射されたときの最初の敵の弾の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾が発射されたときの敵の弾のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾が発射されたときの敵の弾のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります

tekinotama[i].life = 0;


}


}


👆


ということは


敵の飛行機1


から


敵の弾が2連射されるプログラムは


これと似たものになるのかな?


ううんん?」


ソーラー「この


     🌞🌞🌞敵の飛行機から敵の弾が発射されるプログラム🌞🌞🌞



敵の飛行機(1体)だけから


敵の弾が発射されるプログラムです


ということは


敵の飛行機10体


敵の飛行機

敵の飛行機1

敵の飛行機2

敵の飛行機3

敵の飛行機4

敵の飛行機5

敵の飛行機6

敵の飛行機7

敵の飛行機8

敵の飛行機9


のうち


敵の飛行機に続く


敵の飛行機1


から


敵の弾を2連射させるようにするのは



新たに

tekinotama1[2]

構造体変数宣言


struct Character tekinotama1[2];

//🌞👆弾が2連射されるよう敵の飛行機1の弾を2つ作成しています


を実行して


構造体変数

tekinotama1[0]

tekinotama1[1]


を作成し


構造体変数

tekinotama1[0]


のメンバ変数

tekinotama1[0].x

tekinotama1[0].y

tekinotama1[0].graphichandle[0]

tekinotama1[0].life



構造体変数

tekinotama1[1]

のメンバ変数

tekinotama1[1].x

tekinotama1[1].y

tekinotama1[1].graphichandle[0]

tekinotama1[1].life



for (int i = 0; i < 2; i = i + 1) {


tekinotama1[i].x = 0;

tekinotama1[i].y = 0;


tekinotama1[i].graphichandle[0] = LoadGraph("画像データ\\敵の飛行機の弾ハート.bmp");


tekinotama1[i].life = 0;


}



のように初期化すればいいね


そして


敵の飛行機1から発射される敵の弾1の最初の弾と次弾の弾の間隔を調整するために


int tekinotama_count1💖=0;


を実行して


int型の変数


tekinotama_count1💖


を用意して0で初期化し


敵の飛行機1から2連射される敵の弾1の最初の弾と次弾の最初のx座標を代入するするために


int tekinotama_tsix1 💖=0;


を実行して


int型の変数


tekinotama_tsix1 💖


を用意して0で初期化することになります


あとは


if (tekinotama_count1💖 == 0) {

//👆🌞🌞🌞改良点はここですね

for (int i = 0; i < 2; i = i + 1) {


if (tekinotama1💖[i].life == 0) {


tekinotama1💖[i].x = tekinohikouki[1].x - 10;


tekinotama1💖[i].y = tekinohikouki[1].y + 10;


tekinotama1💖[i].life = 1;


break;


}


}


tekinotama_count1💖= 30;


}



if (tekinotama_count1💖) { tekinotama_count1💖 = tekinotama_count1💖 - 1; }



for (int i = 0; i < 2; i = i + 1) {


if (tekinotama1💖[i].life == 1) {

//🌞🌞🌞tekinotama1💖.lifeに1が代入されていると敵の弾1がゲーム画面に表示されることになります tekinotama1💖.lifeに0が代入されていると敵の弾1がゲーム画面に表示されることはありません

DrawGraph(tekinotama1💖[i].x, tekinotama1💖[i].y, tekinotama1💖[i].graphichandle[0], TRUE);


tekinotama1💖[i].x = tekinotama1💖[i].x - 1;


if (tekinotama_tsix1 💖- tekinotama1[i].x > 640)

//🌞🌞🌞発射された敵の弾1の位置のx座標が発射されたときの最初の敵の弾1の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix1 💖 - tekinotama1💖[i].xは真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tekinotama_tsix1 💖には敵の弾1が発射されたときの敵の弾1のいる位置のx座標を記憶していたのでtekinotama1 💖[i].xが敵の弾1が発射されたときの敵の弾1のいる位置から640ドット離れた時、条件式tekinotama_tsix1 💖- tekinotama1 💖[i].x > 640は真の値1を持つことになります

tekinotama1 💖[i].life = 0;


}


}


を実行すれば


敵の飛行機1からも


敵の弾が2連射されることになるね


そのプログラムはこちらです

👇


#include "DxLib.h"


struct Character {

double x;

double y;

int graphichandle[7];

int graphicnumber;//👈🌞メンバ変数にgraphicnumber を追加しました

int life;

};


//👆🌞Characterの構造体宣言です



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}




SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です 裏画面に画像を描きます printfDxで表示される文字も裏画面に描かれることになります



struct Character jibunnohikouki;

//👆🌞jibunnohikoukiの構造体変数宣言です


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


jibunnohikouki.graphichandle[0] = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");


jibunnohikouki.graphichandle[1] = LoadGraph("画像データ\\ソーラーが描いた飛行機1.bmp");


jibunnohikouki.graphichandle[2] = LoadGraph("画像データ\\ソーラーが描いた飛行機2.bmp");


jibunnohikouki.graphichandle[3] = LoadGraph("画像データ\\ソーラーが描いた飛行機3.bmp");


jibunnohikouki.graphichandle[4] = LoadGraph("画像データ\\ソーラーが描いた飛行機4.bmp");


jibunnohikouki.graphichandle[5] = LoadGraph("画像データ\\ソーラーが描いた飛行機5.bmp");


jibunnohikouki.graphichandle[6] = LoadGraph("画像データ\\ソーラーが描いた飛行機6.bmp");


jibunnohikouki.life = 1;//👈🌞🌞🌞ここがポイントです🌞🌞🌞




jibunnohikouki.graphicnumber = 0;

//👆 jibunnohikouki.graphicnumberは😋自分の飛行機😋のアニメーションパターンをとりあつかっています


//👆🌞構造体変数jibunnohikoukiのメンバ変数の初期化を行っています

//👆 構造体変数jibunnohikoukiは😋自分の飛行機😋のデータをとりあつかっています



struct Character tekinohikouki[10];

//👆🌞敵の飛行機を10体登場させています


for (int i = 0; i < 10; i++) {


tekinohikouki[i].x = 605;


tekinohikouki[i].y = 35 * i;


tekinohikouki[i].graphichandle[0] = LoadGraph("画像データ\\赤い敵の飛行機1.8.bmp");


tekinohikouki[i].graphichandle[1] = LoadGraph("画像データ\\赤い敵の飛行機1.3.bmp");


tekinohikouki[i].graphichandle[2] = LoadGraph("画像データ\\赤い敵の飛行機2.3.bmp");


tekinohikouki[i].graphichandle[3] = LoadGraph("画像データ\\赤い敵の飛行機3.3.bmp");


tekinohikouki[i].graphichandle[4] = LoadGraph("画像データ\\赤い敵の飛行機4.3.bmp");


tekinohikouki[i].graphichandle[5] = LoadGraph("画像データ\\赤い敵の飛行機5.3.bmp");


tekinohikouki[i].graphichandle[6] = LoadGraph("画像データ\\赤い敵の飛行機6.5.bmp");




tekinohikouki[i].graphicnumber = 128 * GetRand(6);


//👆 tekinohikouki[i].graphicnumberは😋敵の飛行機😋のアニメーションパターンをとりあつかっています


//👆ここです🌞🌞🌞ここでtekinohikouki[i].graphicnumberにランダムに0,128,256,384,512,640,768の値が代入されることになります




tekinohikouki[i].life = 100;//👈🌞🌞🌞敵の飛行機に自分の弾が100発当たると破壊されるようにしました




}



struct Character jibunnotama[2];

//🌞👆自分の弾を2つ作成しています

for (int i = 0; i < 2; i = i + 1) {


jibunnotama[i].x = 0;

jibunnotama[i].y = 0;


jibunnotama[i].graphichandle[0] = LoadGraph("画像データ\\自分の弾.bmp");


jibunnotama[i].life = 0;


}


struct Character bakuhatunohonoo[10];

//👆🌞構造体変数bakuhatuhonoo[0], bakuhatuhonoo[1]…bakuhatuhonoo[9]を作成し爆発の炎のデータを取り扱います


for (int i = 0; i < 10; i++) {


bakuhatunohonoo[i].x = 0;


bakuhatunohonoo[i].y = 0;


bakuhatunohonoo[i].graphichandle[0] = LoadGraph("画像データ\\爆発の炎.bmp");


bakuhatunohonoo[i].graphichandle[1] = LoadGraph("画像データ\\爆発の炎1.bmp");


bakuhatunohonoo[i].graphichandle[2] = LoadGraph("画像データ\\爆発の炎2.bmp");


bakuhatunohonoo[i].graphichandle[3] = LoadGraph("画像データ\\爆発の炎3.bmp");


bakuhatunohonoo[i].graphichandle[4] = LoadGraph("画像データ\\爆発の炎4.bmp");


bakuhatunohonoo[i].graphichandle[5] = LoadGraph("画像データ\\爆発の炎5.bmp");


bakuhatunohonoo[i].graphichandle[6] = LoadGraph("画像データ\\爆発の炎6.bmp");



bakuhatunohonoo[i].life = 0;//🌞🌞🌞 bakuhatunohonoo.lifeを初期化しています



bakuhatunohonoo[i].graphicnumber = 0; //🌞🌞🌞爆発の炎ごとにgraphicnumberを用意して初期化しています


}



struct Character tekinohikoukiwooouhikari;


tekinohikoukiwooouhikari.x = 0;


tekinohikoukiwooouhikari.y = 0;


tekinohikoukiwooouhikari.graphichandle[0] = LoadGraph("画像データ\\赤い敵の飛行機を覆う光.bmp");




tekinohikoukiwooouhikari.life = 0;




struct Character jibunnohikoukinobakuhatunohonoo;

//👆🌞構造体変数jibunnohikoukinobakuhatunohonooを作成し自分の飛行機の爆発の炎のデータを取り扱います




jibunnohikoukinobakuhatunohonoo.x = 0;


jibunnohikoukinobakuhatunohonoo.y = 0;


jibunnohikoukinobakuhatunohonoo.graphichandle[0] = LoadGraph("画像データ\\自分の飛行機の爆発の炎.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[1] = LoadGraph("画像データ\\自分の飛行機の爆発の炎1.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[2] = LoadGraph("画像データ\\自分の飛行機の爆発の炎2.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[3] = LoadGraph("画像データ\\自分の飛行機の爆発の炎3.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[4] = LoadGraph("画像データ\\自分の飛行機の爆発の炎4.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[5] = LoadGraph("画像データ\\自分の飛行機の爆発の炎5.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[6] = LoadGraph("画像データ\\自分の飛行機の爆発の炎6.bmp");



jibunnohikoukinobakuhatunohonoo.life = 0;//🌞🌞🌞 jibunnohikoukinobakuhatunohonoo.lifeを初期化しています



jibunnohikoukinobakuhatunohonoo.graphicnumber = 0; //🌞🌞🌞自分の飛行機の爆発の炎のgraphicnumberを用意して初期化しています



int tsix;//🌞🌞🌞tsixには発射される弾の最初の位置のx座標が代入されることになります tは弾、sは最初、iは位置、xはx座標を表しています



int count = 0;//🌞🌞🌞ここでint型の変数countを作製し0で初期化しました



int tekinotama_tsix = 0; //🌞🌞🌞 tekinotama_tsixには発射される敵の弾の最初の位置のx座標が代入されることになります tは弾、sは最初、iは位置、xはx座標を表しています


int tekinotama_count = 0;


int tekinotama_tsix1 = 0; //🌞🌞🌞 tekinotama_tsix1には発射される敵の弾1の最初の位置のx座標が代入されることになります tは弾、sは最初、iは位置、xはx座標を表しています


int tekinotama_count1 = 0;



double tekinohikoukiidoupattern[4][3] = { {20,-0.1, 0.1},{20,-0.1,-0.1},{20,-0.1, 0.1},{20,-0.1,-0.1} };//👈🌞🌞🌞🌞🌞ここです敵の飛行機の移動速度は1ドットのときの10分の1になります


int m = 0;


int repeat = tekinohikoukiidoupattern[0][0];



struct Character tekinotama[2];

//🌞👆弾が2連射されるよう敵の飛行機の弾を2つ作成しています



for (int i = 0; i < 2; i = i + 1) {


tekinotama[i].x = 0;

tekinotama[i].y = 0;


tekinotama[i].graphichandle[0] = LoadGraph("画像データ\\敵の飛行機の弾ハート.bmp");


tekinotama[i].life = 0;


}



struct Character tekinotama1[2];

//🌞👆弾が2連射されるよう敵の飛行機1の弾を2つ作成しています



for (int i = 0; i < 2; i = i + 1) {


tekinotama1[i].x = 0;

tekinotama1[i].y = 0;


tekinotama1[i].graphichandle[0] = LoadGraph("画像データ\\敵の飛行機の弾ハート.bmp");


tekinotama1[i].life = 0;


}




while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {




DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);




int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);



if (jibunnohikouki.life == 1) {


if (4 <= jibunnohikouki.y && jibunnohikouki.y <= 460) {

if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;

}



if (0 <= jibunnohikouki.y && jibunnohikouki.y <= 456) {


if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;

}


if (4 <= jibunnohikouki.x && jibunnohikouki.x <= 605) {


if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;

}


if (0 <= jibunnohikouki.x && jibunnohikouki.x <= 601) {


if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;

}


}


if (jibunnohikouki.life == 1) {


DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle[(jibunnohikouki.graphicnumber / 32) % 7], TRUE);


//👆🌞🌞🌞 🌞🌞🌞 🌞🌞🌞 jibunnohikouki.graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞


jibunnohikouki.graphicnumber = jibunnohikouki.graphicnumber + 1;


}


//👆 jibunnohikouki.lifeに格納されている値が1なら自分の飛行機の画像を描きます

//👆jibunnohikouki.lifeに格納されている値が0なら自分の飛行機の画像が描かれることはありません


if (repeat > 0) {


for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


tekinohikouki[i].x = tekinohikouki[i].x + tekinohikoukiidoupattern[m][1];


tekinohikouki[i].y = tekinohikouki[i].y + tekinohikoukiidoupattern[m][2];

}



}


repeat = repeat - 1;

}


if (repeat == 0) {


if (m < 4) {


repeat = tekinohikoukiidoupattern[m][0];


m = m + 1;

}




if (m == 4) {

m = 0;

repeat = tekinohikoukiidoupattern[m][0];


}


}



for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {



DrawGraph(tekinohikouki[i].x, tekinohikouki[i].y, tekinohikouki[i].graphichandle[(tekinohikouki[i].graphicnumber) / 128 % 7], TRUE);


tekinohikouki[i].graphicnumber = tekinohikouki[i].graphicnumber + 1;


//🌞🌞🌞 (tekinohikouki[i].graphicnumber)を128で割っているので通常のアニメーション速度の128分の1の速度で画像が切り替わります

//👆🌞🌞🌞ここです すでにtekinohikouki[i].graphicnumberには0,128,256,384,512,640,768の値のうちの1つが代入されているので敵の飛行機, 敵の飛行機1・・・敵の飛行機9はそれぞれ異なるタイミングでアニメーションすることになります


}


}




for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


if ((jibunnohikouki.x < tekinohikouki[i].x + 35) && (tekinohikouki[i].x < jibunnohikouki.x + 35) && (jibunnohikouki.y + 7 < tekinohikouki[i].y + 20) && (tekinohikouki[i].y < jibunnohikouki.y + 20)) {


jibunnohikouki.life = 0;


tekinohikouki[i].life = 0;


//👆🌞自分の飛行機と敵の飛行機が衝突すると共に消滅することになります



bakuhatunohonoo[i].x = tekinohikouki[i].x;


bakuhatunohonoo[i].y = tekinohikouki[i].y;



bakuhatunohonoo[i].life = 128 + 128 * GetRand(9); //🌞🌞🌞 bakuhatunohonoo[i].lifeに0以上の値を代入しました bakuhatunohonoo[0].life, bakuhatunohonoo[1].life, bakuhatunohonoo[2].life, bakuhatunohonoo[3].life, bakuhatunohonoo[4].life, bakuhatunohonoo[5].life, bakuhatunohonoo[6].life, bakuhatunohonoo[7].life, bakuhatunohonoo[8].life, bakuhatunohonoo[9].lifeにランダムに異なる値を代入することにより爆発する時間をランダムに変化させています




jibunnohikoukinobakuhatunohonoo.x = jibunnohikouki.x;


jibunnohikoukinobakuhatunohonoo.y = jibunnohikouki.y;


jibunnohikoukinobakuhatunohonoo.life = 128 + 128 * GetRand(9); //🌞🌞🌞 jibunnohikoukinobakuhatunohonoo.lifeに0以上の値を代入しました jibunnohikoukinobakuhatunohonoo.lifeにランダムに異なる値を代入することにより自分の飛行機が爆発する時間をランダムに変化させています



}

}


}


for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


for (int j = 0; j < 2; j++) {


if ((jibunnotama[j].x < tekinohikouki[i].x + 35) && (tekinohikouki[i].x < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 20) && (tekinohikouki[i].y < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[i].life = tekinohikouki[i].life - 1;


//👆🌞自分の弾と敵の飛行機が衝突すると自分の弾は消滅しtekinohikouki[i].lifeに格納されている値は1減ることになります tekinohikouki[i].lifeに格納されている値が0になると敵の飛行機は消滅することになります



tekinohikoukiwooouhikari.x = tekinohikouki[i].x;


tekinohikoukiwooouhikari.y = tekinohikouki[i].y;


//🌞🌞🌞自分の弾と敵の飛行機がぶつかると敵の飛行機の位置座標がtekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.yに代入されます


tekinohikoukiwooouhikari.life = 1;






if (tekinohikouki[i].life == 0) {


bakuhatunohonoo[i].x = tekinohikouki[i].x;


bakuhatunohonoo[i].y = tekinohikouki[i].y;


bakuhatunohonoo[i].life = 128 + 128 * GetRand(9); //🌞🌞🌞 bakuhatunohonoo[i].lifeに0以上の値を代入しました bakuhatunohonoo[0].life, bakuhatunohonoo[1].life, bakuhatunohonoo[2].life, bakuhatunohonoo[3].life, bakuhatunohonoo[4].life, bakuhatunohonoo[5].life, bakuhatunohonoo[6].life, bakuhatunohonoo[7].life, bakuhatunohonoo[8].life, bakuhatunohonoo[9].lifeにランダムに異なる値を代入することにより爆発する時間をランダムに変化させています


}

}


}

}


}



if (tekinohikoukiwooouhikari.life > 0) {



SetDrawBlendMode(DX_BLENDMODE_ALPHA, 200);


//👆🌞🌞🌞描画ブレンドモードがアルファブレンドになっています


DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);



SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);

tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;


// 👆🌞🌞🌞描画ブレンドモードをノーブレンドにして描画ブレンドモードを解除しています

}



//👆🌞🌞🌞敵の飛行機を覆う光の画像が描かれます tekinohikoukiwooouhikari.lifeに格納されている値が0になると敵の飛行機を覆う光の画像が描かれることはありません


for (int i = 0; i < 10; i++) {


if (bakuhatunohonoo[i].life > 0) {


DrawGraph(bakuhatunohonoo[i].x, bakuhatunohonoo[i].y, bakuhatunohonoo[i].graphichandle[(bakuhatunohonoo[i].graphicnumber / 32) % 7], TRUE);


//👆🌞🌞🌞 🌞🌞🌞 🌞🌞bakuhatunohonoo[i].graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞

bakuhatunohonoo[i].graphicnumber = bakuhatunohonoo[i].graphicnumber + 1;

//👆🌞🌞🌞爆発の炎がアニメーションするよう設定が行われています



bakuhatunohonoo[i].life = bakuhatunohonoo[i].life - 1;



}


//👆 bakuhatunohonoo[i].lifeに格納されている値が1なら爆発の炎の画像を描きます

//👆 bakuhatunohonoo[i].lifeに格納されている値が0なら爆発の炎の画像が描かれることはありません


}




if (jibunnohikoukinobakuhatunohonoo.life > 0) {


DrawGraph(jibunnohikoukinobakuhatunohonoo.x, jibunnohikoukinobakuhatunohonoo.y, jibunnohikoukinobakuhatunohonoo.graphichandle[(jibunnohikoukinobakuhatunohonoo.graphicnumber / 32) % 7], TRUE);


//👆🌞🌞🌞 🌞🌞🌞 🌞🌞 jibunnohikoukinobakuhatunohonoo.graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞

jibunnohikoukinobakuhatunohonoo.graphicnumber = jibunnohikoukinobakuhatunohonoo.graphicnumber + 1;

//👆🌞🌞🌞自分の飛行機の爆発の炎がアニメーションするよう設定が行われています



jibunnohikoukinobakuhatunohonoo.life = jibunnohikoukinobakuhatunohonoo.life - 1;



}


//👆 jibunnohikoukinobakuhatunohonoo.lifeに格納されている値が1以上なら自分の飛行機の爆発の炎の画像を描きます

//👆 jibunnohikoukinobakuhatunohonoo.lifeに格納されている値が0なら自分の飛行機の爆発の炎の画像が描かれることはありません





if ((key & PAD_INPUT_A) && (count == 0)) {


for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 0) {


jibunnotama[i].x = jibunnohikouki.x + 35;


tsix = jibunnotama[i].x;


jibunnotama[i].y = jibunnohikouki.y + 10;


jibunnotama[i].life = 1;


break;


}


}


count = 10;

}



if (count > 0) { count = count - 1; }




for (int i = 0; i < 2; i = i + 1) {


if (jibunnotama[i].life == 1) {

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることはありません

DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle[0], TRUE);


jibunnotama[i].x = jibunnotama[i].x + 10;


if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}

//👆🌞🌞🌞自分の弾が発射されるプログラムです






//👇🌞🌞🌞敵の弾が発射されるプログラムです

if (tekinotama_count == 0) {

//👆🌞🌞🌞改良点はここですね

for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 0) {


tekinotama[i].x = tekinohikouki[0].x - 10;


tekinotama[i].y = tekinohikouki[0].y + 10;


tekinotama[i].life = 1;


break;


}


}


tekinotama_count = 30;//👈🌞🌞🌞2連射される敵の弾の最初の弾と次弾の間隔を調整することができます


}



if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }



for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 1) {

//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾がゲーム画面に表示されることはありません

DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);


tekinotama[i].x = tekinotama[i].x - 1;


if (tekinotama_tsix - tekinotama[i].x > 640)

//🌞🌞🌞発射された敵の弾の位置のx座標が発射されたときの最初の敵の弾の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾が発射されたときの敵の弾のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾が発射されたときの敵の弾のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります

tekinotama[i].life = 0;


}


}




if (tekinotama_count1 == 0) {

//👆🌞🌞🌞改良点はここですね

for (int i = 0; i < 2; i = i + 1) {


if (tekinotama1[i].life == 0) {


tekinotama1[i].x = tekinohikouki[1].x - 10;


tekinotama1[i].y = tekinohikouki[1].y + 10;


tekinotama1[i].life = 1;


break;


}


}


tekinotama_count1 = 30;//👈🌞🌞🌞2連射される敵の弾1の最初の弾と次弾の間隔を調整することができます


}



if (tekinotama_count1) { tekinotama_count1 = tekinotama_count1 - 1; }



for (int i = 0; i < 2; i = i + 1) {


if (tekinotama1[i].life == 1) {

//🌞🌞🌞tekinotama1.lifeに1が代入されていると敵の弾1がゲーム画面に表示されることになります tekinotama1.lifeに0が代入されていると敵の弾1がゲーム画面に表示されることはありません

DrawGraph(tekinotama1[i].x, tekinotama1[i].y, tekinotama1[i].graphichandle[0], TRUE);


tekinotama1[i].x = tekinotama1[i].x - 1;


if (tekinotama_tsix1 - tekinotama1[i].x > 640)

//🌞🌞🌞発射された敵の弾tekinotama1[i]の位置のx座標が発射されたときの敵の弾tekinotama1[i]の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix1 - tekinotama1[i].xは真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tekinotama_tsix1には敵の弾tekinotama1[i]が発射されたときの敵の弾tekinotama1[i]のいる位置のx座標を記憶していたのでtekinotama1[i].xが敵の弾tekinotama1[i]が発射されたときの敵の弾tekinotama1[i]のいる位置から640ドット離れた時、条件式tekinotama_tsix1 - tekinotama1[i].x > 640は真の値1を持つことになります

tekinotama1[i].life = 0;


}


}




ScreenFlip();


ClearDrawScreen();


};



DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します


}



デバッグなしで実行をしてから一度プログラムを終了し

生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです

👇


https://www.youtube.com/watch?v=4Tu7lzW55OE


マックス「いい感じに


仲良く

敵の弾(敵の飛行機から最初に発射される弾と次弾)

敵の弾1 (敵の飛行機1から最初に発射される弾と次弾)



敵の飛行機

敵の飛行機1


から


発射されているな


しかしちょっとプログラムが長くなったな


この要領で


敵の飛行機10体


敵の飛行機

敵の飛行機1

敵の飛行機2

敵の飛行機3

敵の飛行機4

敵の飛行機5

敵の飛行機6

敵の飛行機7

敵の飛行機8

敵の飛行機9


から


敵の弾 (敵の飛行機から最初に発射される弾と次弾)

敵の弾1 (敵の飛行機1から最初に発射される弾と次弾)

敵の弾2 (敵の飛行機2から最初に発射される弾と次弾)

敵の弾3 (敵の飛行機3から最初に発射される弾と次弾)

敵の弾4 (敵の飛行機4から最初に発射される弾と次弾)

敵の弾5 (敵の飛行機5から最初に発射される弾と次弾)

敵の弾6 (敵の飛行機6から最初に発射される弾と次弾)

敵の弾7 (敵の飛行機7から最初に発射される弾と次弾)

敵の弾8 (敵の飛行機8から最初に発射される弾と次弾)

敵の弾9 (敵の飛行機9から最初に発射される弾と次弾)



2連射させることができるわけだが


大分


プログラムが長くなるんじゃないか?」


ソーラー「その場合は


敵の飛行機10体


敵の飛行機

敵の飛行機1

敵の飛行機2

敵の飛行機3

敵の飛行機4

敵の飛行機5

敵の飛行機6

敵の飛行機7

敵の飛行機8

敵の飛行機9


から


敵の弾 (敵の飛行機から最初に発射される弾と次弾)

敵の弾1 (敵の飛行機1から最初に発射される弾と次弾)

敵の弾2 (敵の飛行機2から最初に発射される弾と次弾)

敵の弾3 (敵の飛行機3から最初に発射される弾と次弾)

敵の弾4 (敵の飛行機4から最初に発射される弾と次弾)

敵の弾5 (敵の飛行機5から最初に発射される弾と次弾)

敵の弾6 (敵の飛行機6から最初に発射される弾と次弾)

敵の弾7 (敵の飛行機7から最初に発射される弾と次弾)

敵の弾8 (敵の飛行機8から最初に発射される弾と次弾)

敵の弾9 (敵の飛行機9から最初に発射される弾と次弾)



2連射させることができるプログラムを配列を用いて表現することになるんだ」


  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る