敵の弾が自分の飛行機に衝突するたびに 自分の飛行機が 光で点滅するようにしてみましょう まずは自分の飛行機を覆う光の画像データを用意しましょう

つづきです


👇


https://www.youtube.com/watch?v=X3b4vqV6vWI


solarplexuss「自分の飛行機が


1発


敵の弾にあたるだけで


自分の飛行機が消滅するのは


ちょっとハードだね


50発ぐらい


敵の弾にあたったら


自分の飛行機が消滅するようにしたら


ゲームの難易度が下がって


楽にプレイできるんじゃない?」


マックス「やっぱ


自分の飛行機に耐久力があるとないでは違いがでるだろうな😊」


ソーラー「それでは


自分の飛行機が50発


敵の弾にあたると


消滅するようにしてみましょう」


solarplexuss「それはもう



自分の飛行機と敵の弾が衝突したとき当たった自分の飛行機と敵の弾が消え

さらに

自分の飛行機が爆発するプログラムを改良したらいいんじゃない?」


👇



//👇🌞🌞🌞自分の飛行機と敵の弾が衝突したとき当たった自分の飛行機と敵の弾が消え さらに 自分の飛行機が爆発するプログラムです



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


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


if (tekinotama[i][j].life> 0)


if (jibunnohikouki.life > 0) {


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


jibunnohikouki.life = 0;


tekinotama[i][j].life = 0;


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






jibunnohikoukinobakuhatunohonoo.x = jibunnohikouki.x;


jibunnohikoukinobakuhatunohonoo.y = jibunnohikouki.y;


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


}

}


}


}


//👆🌞🌞🌞自分の飛行機と敵の弾が衝突したとき当たった自分の飛行機と敵の弾が消え自分の飛行機が爆発するプログラムです



solarplexuss「この



自分の飛行機と敵の弾が衝突したとき当たった自分の飛行機と敵の弾が消え自分の飛行機が爆発するプログラムの



jibunnohikouki.life = 0;


の部分を


jibunnohikouki.life = jibunnohikouki.life-1;



にしたらいいんじゃない


そうすれば


敵の弾が1発あたるだけで


自分の飛行機が消滅することはなく


敵の弾が1発あたるごとに


jibunnohikouki.lifeに格納される値が1減ることになるね


次に

👇



jibunnohikoukinobakuhatunohonoo.x = jibunnohikouki.x;


jibunnohikoukinobakuhatunohonoo.y = jibunnohikouki.y;


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


👆


の部分を



先頭に


if(jibunnohikouki.life == 0)をくっつけて


if(jibunnohikouki.life == 0){



jibunnohikoukinobakuhatunohonoo.x = jibunnohikouki.x;


jibunnohikoukinobakuhatunohonoo.y = jibunnohikouki.y;


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


}


に変更すればいいんじゃない?


そうすれば


条件式


jibunnohikouki.life == 0



真の値1をもつとき


つまり


jibunnohikouki.lifeに格納される値が0になったとき


自分の飛行機が爆発することになるね



あと


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>0) {


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 (jibunnohikouki.life > 0) {


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


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


jibunnohikouki.graphicnumber = jibunnohikouki.graphicnumber + 1;


}


//👆 jibunnohikouki.lifeに格納されている値が0より大きければ自分の飛行機の画像を描きます

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



に変えたらいいんじゃない?


そうすれば


敵の弾が自分の飛行機に当たったとしても


jibunnohikouki.lifeが


0より大きい値をもっているときは


自分の飛行機は


通常通り


アニメーションすることになるね


あとは新型 自分の飛行機から弾が10連射されるプログラム


👇


//👇🌞🌞🌞新型 自分の飛行機から弾が10連射されるプログラムです


//👇新たに11個目の弾jibunnotama[10]の登場です


if (jibunnohikouki.life == 1)


if (jibunnotama[10].x > 640)

if (key & PAD_INPUT_A) {


if (jibunnotama[0].life == 0 && hassyasareru_jibunnotama == 0) {


jibunnotama[0].x = jibunnohikouki.x + 10;


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


jibunnotama_tsix[0] = jibunnotama[0].x;


jibunnotama[0].life = 1;


hassyasareru_jibunnotama = 1;


jibunnotama_count[0] = 30;//👈2連射される自分の弾の最初の弾と次弾の間隔を調整することができます


}


}



👆

if (jibunnohikouki.life == 1)


の部分を


if (jibunnohikouki.life >0)


に変更すれば


jibunnohikouki.lifeに格納されている値が0以上なら


自分の弾が発射されることになるね





それでは


自分の飛行機が50発


敵の弾にあたると


消滅するプログラムはこちらです」

👇

#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 = 50;//👈🌞🌞🌞ここがポイントです🌞🌞🌞




jibunnohikouki.graphicnumber = 0;

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


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

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



struct Character tekinohikouki[1];

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


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


tekinohikouki[i].x = 605;


tekinohikouki[i].y = 200;


tekinohikouki[i].graphichandle[0] = LoadGraph("画像データ\\ルル18.bmp");


tekinohikouki[i].graphichandle[1] = LoadGraph("画像データ\\ルル18.bmp");


tekinohikouki[i].graphichandle[2] = LoadGraph("画像データ\\ルル18.bmp");


tekinohikouki[i].graphichandle[3] = LoadGraph("画像データ\\ルル18.bmp");


tekinohikouki[i].graphichandle[4] = LoadGraph("画像データ\\ルル18.bmp");


tekinohikouki[i].graphichandle[5] = LoadGraph("画像データ\\ルル18.bmp");


tekinohikouki[i].graphichandle[6] = LoadGraph("画像データ\\ルル18.bmp");




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


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


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




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




}


struct Character jibunnotama[11];//👈💖ここは大丈夫そう

//🌞👆自分の弾を11個作成しています

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


jibunnotama[i].x = 0;

jibunnotama[i].y = 0;


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


jibunnotama[i].life = 0;


}


jibunnotama[10].x = 641;

jibunnotama[10].y = 0;


//🌞🌞🌞見えない弾にするために jibunnotama[10].graphichandle[0] は初期化しません

jibunnotama[10].life = 0;


struct Character tekinotama[1][10];


//🌞👆敵の飛行機(ルル)から発射される10個の敵の弾のデータをとりあつかうために10個の構造体変数を作成しています



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


for (int j = 0; j < 10; j = j + 1) {


tekinotama[i][j].x = 1000;

tekinotama[i][j].y = 1000;


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


tekinotama[i][j].life = 0;


}


}





struct Character RuRunobakuhatunohonoo[1];//👈💖ここは大丈夫そう

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


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


RuRunobakuhatunohonoo[i].x = 0;


RuRunobakuhatunohonoo[i].y = 0;


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


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


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


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


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


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


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



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



RuRunobakuhatunohonoo[i].graphicnumber = 0; //🌞🌞🌞ルルの爆発の炎をアニメーションさせるためのgraphicnumberを用意して初期化しています


}


struct Character tekinohikoukiwooouhikari;


tekinohikoukiwooouhikari.x = 0;


tekinohikoukiwooouhikari.y = 0;


tekinohikoukiwooouhikari.graphichandle[0] = LoadGraph("画像データ\\ルルを覆う光0.1.bmp");//👈🌞🌞🌞💖画像をルルを覆う光0.1に変更しました




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 jibunnotama_tsix[11];//🌞🌞🌞jibunnotama_tsix[i]には自分の飛行機から発射される弾の最初の位置のx座標が代入されることになります tは弾、sは最初、iは位置、xはx座標を表しています//👈💖ここは大丈夫そう


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


jibunnotama_tsix[i] = 0;


}






int jibunnotama_count[11];//🌞🌞🌞ここでint型の変数jibunnotama_count[i](0<=i<11)を作製し0で初期化しました


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


jibunnotama_count[i] = 0;


}




int tekinotama_count[1][10];//👈💖ここは大丈夫そう


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


for (int j = 0; j < 10; j = j + 1) {


tekinotama_count[i][j] = 0;


}


}


int tekinotama_tsix[1][10]; //🌞🌞🌞 tekinotama_tsix[i][j]には発射される敵の弾[i][j]の発射される位置のx座標が代入されることになります tは弾、sは最初、iは位置、xはx座標を表しています//👈💖ここは大丈夫そう


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


for (int j = 0; j < 10; j = j + 1) {


tekinotama_tsix[i][j] = 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];






int hassyasareru_jibunnotama = 0;


int hassyasareru_tekinotama[1];



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


hassyasareru_tekinotama[i] = 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 > 0) {


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 (repeat > 0) {


for (int i = 0; i < 1; 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 < 1; 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はそれぞれ異なるタイミングでアニメーションすることになります


}


}



//👆🍎🍎🍎敵の飛行機であるルルの画像が描かれた後に自分の飛行機の画像が描かれることになります👇ですのでルルの画像と自機の画像が重なった時ルルの画像の上に自分の飛行機が描かれることになります


if (jibunnohikouki.life > 0) {


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


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


jibunnohikouki.graphicnumber = jibunnohikouki.graphicnumber + 1;


}


//👆 jibunnohikouki.lifeに格納されている値が0より大きければ自分の飛行機の画像を描きます

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






//🌞🌞🌞👇自分の飛行機と敵の飛行機がぶつかったとき自分の飛行機と敵の飛行機が消滅するプログラムはこちらです


if (jibunnohikouki.life > 0)


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


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


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

{


jibunnohikouki.life = 0;


tekinohikouki[i].life = 0;


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



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


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



RuRunobakuhatunohonoo[i].life = 128 + 128 * GetRand(9); //🌞🌞🌞 RuRunobakuhatunohonoo[0].lifeに0以上の値を代入しました RuRunobakuhatunohonoo[0].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 < 1; i++) {


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


if (tekinotama[i][j].life > 0)


if (jibunnohikouki.life > 0) {


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


jibunnohikouki.life = jibunnohikouki.life - 1;



tekinotama[i][j].life = 0;


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






if (jibunnohikouki.life == 0) {



jibunnohikoukinobakuhatunohonoo.x = jibunnohikouki.x;


jibunnohikoukinobakuhatunohonoo.y = jibunnohikouki.y;


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


}


}

}


}


}


//👆🌞🌞🌞自分の飛行機と敵の弾が衝突したとき当たった自分の飛行機と敵の弾が消え自分の飛行機が爆発するプログラムです







//👇🌞🌞🌞敵の飛行機と自分の弾が衝突したとき当たった自分の弾と敵の飛行機が消滅するプログラムです


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




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





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


if (jibunnotama[j].life > 0)


if ((jibunnotama[j].x < tekinohikouki[i].x + 320) && (tekinohikouki[i].x < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 240) && (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 = 3;


//👆🌞🌞🌞敵の飛行機を覆う光が表示されることになります


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


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


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


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


}

}


}

}


}



//👆🌞🌞🌞敵の飛行機と自分の弾が衝突したとき当たった自分の弾と敵の飛行機が消滅するプログラムです




if (tekinohikoukiwooouhikari.life > 0) {





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




tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;



}



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





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


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


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


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

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

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



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



}


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

//👆 RuRunobakuhatunohonoo[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なら自分の飛行機の爆発の炎の画像が描かれることはありません





//👇🌞🌞🌞新型 自分の飛行機から弾が10連射されるプログラムです


//👇新たに11個目の弾jibunnotama[10]の登場です


if (jibunnohikouki.life > 0)


if (jibunnotama[10].x > 640)

if (key & PAD_INPUT_A) {


if (jibunnotama[0].life == 0 && hassyasareru_jibunnotama == 0) {


jibunnotama[0].x = jibunnohikouki.x + 10;


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


jibunnotama_tsix[0] = jibunnotama[0].x;


jibunnotama[0].life = 1;


hassyasareru_jibunnotama = 1;


jibunnotama_count[0] = 30;//👈2連射される自分の弾の最初の弾と次弾の間隔を調整することができます


}


}




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


if (jibunnotama_count[i] > 0) { jibunnotama_count[i] = jibunnotama_count[i] - 1; }



if (jibunnotama_count[i] == 0 && hassyasareru_jibunnotama == i + 1) {


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


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


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


jibunnotama_tsix[i + 1] = jibunnotama[i + 1].x;


jibunnotama[i + 1].life = 1;


hassyasareru_jibunnotama = i + 2;


jibunnotama_count[i + 1] = 30;


}


}


}


if (jibunnotama_count[10] > 0) { jibunnotama_count[10] = jibunnotama_count[10] - 1; }




if (jibunnotama_count[10] == 0 && hassyasareru_jibunnotama == 11) {


hassyasareru_jibunnotama = 0;


}






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


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

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

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


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


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

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

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

jibunnotama[i].life = 0;


}


}


//👆🌞🌞🌞新型 自分の飛行機から弾が10連射されるプログラムです







//👇🌞🌞🌞新型 敵の飛行機1体から敵の弾が10連射されるプログラムです





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



if (tekinohikouki[i].life > 1 && GetRand(15) == 0 && tekinotama[i][0].life == 0 && hassyasareru_tekinotama[i] == 0) {


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


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


tekinotama_tsix[i][0] = tekinotama[i][0].x;


tekinotama[i][0].life = 1;


hassyasareru_tekinotama[i] = 1;


tekinotama_count[i][0] = 20 + GetRand(25);//👈🌞🌞🌞敵tekinohikouki[i]から10連射される最初の弾tekinotama[i][0]と次弾tekinotama[i][1]の間隔を調整することができます



}




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


if (tekinotama_count[i][j] > 0) { tekinotama_count[i][j] = tekinotama_count[i][j] - 1; }



if (tekinotama_count[i][j] == 0 && hassyasareru_tekinotama[i] == j + 1) {


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


tekinotama[i][j + 1].x = tekinohikouki[i].x - 5;


tekinotama[i][j + 1].y = tekinohikouki[i].y + 120;


tekinotama_tsix[i][j + 1] = tekinotama[i][j + 1].x;




tekinotama[i][j + 1].life = 1;


hassyasareru_tekinotama[i] = j + 2;


tekinotama_count[i][j + 1] = 20 + GetRand(25);//👈🌞🌞🌞敵の飛行機tekinohikouki[i]から10連射される敵の弾tekinotama[i][j + 1]と次に発射される弾tekinotama[i][j + 2]の間隔を調整することができます


}


}


}




if (tekinotama_count[i][9] > 0) { tekinotama_count[i][9] = tekinotama_count[i][9] - 1; }




if (tekinotama_count[i][9] == 0 && hassyasareru_tekinotama[i] == 10) {


hassyasareru_tekinotama[i] = 0;


}


for (int j = 0; j < 10; j = j + 1) {


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

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

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


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


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

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

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

tekinotama[i][j].life = 0;


}


}


}





ScreenFlip();


ClearDrawScreen();


};



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


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


}





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

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


👇

https://www.youtube.com/watch?v=xxyIPQYnkag




マックス「ルルから発射される敵の弾は


10発ずつまとまって発射されているから


まとまって発射される10発の敵の弾が5回分


つまり


50発 敵の弾が自分の飛行機にあたると


自分の飛行機が消滅するわけだ」



solarplexuss「ふふ


敵の弾が


ぽこぽこ


自分の飛行機に当たって面白~い」


マックス「いい感じに


自分の飛行機に耐久力がついたな


自分の飛行機が1発敵の弾にあたっただけで消滅すると


動画撮影がやりにくいんだよな~


そうだ!


ついでに


敵の弾が自分の飛行機に衝突するたびに


自分の飛行機が


光で点滅するようにしてみないか


もっと面白くなるかもしれん」


solarplexuss「自分の飛行機が光で点滅するようにするんだ!(^^)!


どうやって


そのプログラムを組もうかな?



そうだ


そもそも


自分の飛行機を覆う光の画像データがないと


敵の弾が自分の飛行機に衝突するたびに


自分の飛行機が


光で点滅するようにできないんじゃない」


ソーラー「それでは まず


自分の飛行機をおおう光の画像データを用意しましょう


CLIP STUDIOの用意はいいかな



💖ソーラーが描いた飛行機の画像データ💖


👇

https://solalion.blogspot.com/2022/04/blog-post_7.html

👆

のようになっていたね」


マックス「小さいな」


ソーラー「はは😊


💖ソーラーが描いた飛行機の画像データ💖は


幅35ドット 高さ20ドットだからね


この飛行機を覆う光の画像データを作製してみましょう


ようは


💖ソーラーが描いた飛行機の画像データ💖



白く塗りつぶしたものが


😻自分の飛行機をおおう光の画像データ😻


になります


自分の飛行機をおおう光の画像データの作製画面は以下のようになります


👇


https://solalion.blogspot.com/2022/04/blog-post_38.html


👆


みんな


この画像では


ソーラーが描いた飛行機のレイヤーの上に


レイヤー1



作製されていますね



自分の飛行機をおおう光の画像データの作製方法は以下のようになっています


まず


ソーラーが描いた飛行機のレイヤーを


CLIP STUDIOで開いて用意します



ソーラーが描いた飛行機のレイヤーの上に


レイヤー1



用意します


ソーラーが描いた飛行機のレイヤー



レイヤー1



両方に


目玉マーク(可視化マーク)のチェックをいれます


レイヤー1に


ペンマークのチェックを入れます


すると


レイヤー1に描き込みを行うことができます



レイヤー1で


ソーラーが描いた飛行機



白く塗りつぶします


そうしても


ソーラーが描いた飛行機のレイヤーの


飛行機は


白く塗りつぶされません


レイヤー1で


この塗りつぶした部分が


自分の飛行機をおおう光の画像データになります


次に


ソーラーが描いた飛行機のレイヤーに


ペンマークのチェックを入れます


すると


ソーラーが描いた飛行機のレイヤーに描き込みを行うことができます




そして


ソーラーが描いた飛行機のレイヤー

真っ黒に塗りつぶします


ここでのポイントは


色の指定を


H 0

S 0

V 0


にすることです


真っ黒といっても


H 5

S 0

V 0



H 355

S 0

V 0


などの


真っ黒が


あります


その中でも


H 0

S 0

V 0



真っ黒に設定します


ソーラーが描いた飛行機のレイヤー

真っ黒に塗りつぶすと


自分の飛行機をおおう光の画像データが浮かびあがってきますね


あとは


ファイル名は


自分の飛行機を覆う光



自分の飛行機を覆う光.bmp


のように


BMP形式で保存すれば


自分の飛行機を覆う光の画像データの完成です


私たちは


画像データフォルダの中に


自分の飛行機を覆う光.bmpファイルを保存しました


そうそう


ソーラーが描いた飛行機のレイヤー



レイヤー1



統合して保存してはいけません


ソーラーが描いた飛行機のレイヤー



レイヤー1



統合すると


ゲーム画面上で


黒い部分が透明に表示されなくなります」









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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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