1体の敵を用意しておいて自機と敵機がぶつかったら 自機と敵機が消えるようにするだけでなく さらに連射された自分の弾と敵機がぶつかったら 自分の弾と敵機が消えるようにしてみましょう

ソーラー「


今度は


一体の敵を用意しておいて


自機と敵機がぶつかったら


自機と敵機が消えるようにするだけでなく


      Ⓜ️連射された自分の弾Ⓜ️と敵機がぶつかったら


自分の弾と敵機が消えるようにしてみましょう



今回


登場する敵の数は1機


敵の飛行機


の1機とします


Zボタンを押すと1度に発射される弾は


3発にするね


(ここでは敵のデータを取り扱うために


struct Character tekinohikouki[1];


を実行して


構造体変数


tekinohikouki[1]


を作成し


自分の弾のデータを取り扱うために


struct Character jibunnotama[3];

実行して


構造体変数


jibunnotama[1]


jibunnotama[2]


jibunnotama[3]を作成します)



まず手始めに


自分の弾

自分の弾1

自分の弾2


敵の飛行機

がぶつかったときの


判定条件を


求めてみようよ


今までのエピソードで学んできたように



自分の弾

自分の弾1

自分の弾2

の画像データ



敵の飛行機の画像データ



重なっている条件は・・・




自分の弾

敵の飛行機の画像データ



重なっている条件は



jibunnotama[0].x<tekinohikouki[0].x+28

かつ

tekinohikouki[0].x+7< jibunnotama[0].x+15


かつ


jibunnotama[0].y< tekinohikouki[0].y+13

かつ

tekinohikouki[0].y+6< jibunnotama[0].y+5


次に


自分の弾1

敵の飛行機の画像データ



重なっている条件は



jibunnotama[1].x<tekinohikouki[0].x+28

かつ

tekinohikouki[0].x+7< jibunnotama[1].x+15


かつ


jibunnotama[1].y< tekinohikouki[0].y+13

かつ

tekinohikouki[0].y+6< jibunnotama[1].y+5


次に


自分の弾2

敵の飛行機の画像データ



重なっている条件は



jibunnotama[2].x<tekinohikouki[0].x+28

かつ

tekinohikouki[0].x+7< jibunnotama[2].x+15


かつ


jibunnotama[2].y< tekinohikouki[0].y+13

かつ

tekinohikouki[0].y+6< jibunnotama[2].y+5


となります


自分の弾の画像データ



敵の飛行機の画像データ


が重なったとき


すなわち


jibunnotama[0].x<tekinohikouki[0].x+28

かつ

tekinohikouki[0].x+7< jibunnotama[0].x+15


かつ


jibunnotama[0].y< tekinohikouki[0].y+13

かつ

tekinohikouki[0].y+6< jibunnotama[0].y+5


を満たしたとき


自分の弾と敵の飛行機が消えるようにすればいいわけなんだね


そして


自分の弾1の画像データ



敵の飛行機の画像データ


が重なったとき


すなわち


jibunnotama[1].x<tekinohikouki[0].x+28

かつ

tekinohikouki[0].x+7< jibunnotama[1].x+15


かつ


jibunnotama[1].y< tekinohikouki[0].y+13

かつ

tekinohikouki[0].y+6< jibunnotama[1].y+5


を満たしたとき


自分の弾1と敵の飛行機が消えるようにすればいいわけなんだね



そして


自分の弾2の画像データ



敵の飛行機の画像データ


が重なったとき


すなわち


jibunnotama[2].x<tekinohikouki[0].x+28

かつ

tekinohikouki[0].x+7< jibunnotama[2].x+15


かつ


jibunnotama[2].y< tekinohikouki[0].y+13

かつ

tekinohikouki[0].y+6< jibunnotama[2].y+5


を満たしたとき


自分の弾2と敵の飛行機が消えるようにすればいいわけなんだね




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

👇


#include "DxLib.h"


struct Character {

int x;

int y;

int graphichandle;

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関数です 裏画面に画像を描きます


struct Character jibunnohikouki;

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


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


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


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


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

//👆😋自分の飛行機😋のデータをとりあつかっています




struct Character tekinohikouki[1];

//👆🌞敵の飛行機を1体登場させるために要素数を1にして構造体変数tekinohikouki[0]を作成しています


tekinohikouki[0].x = 600;


tekinohikouki[0].y = 100;


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


//👆メモリに取り込まれた😋敵の飛行機のデータ😋に割り当てられた番号が tekinohikouki[0].graphichandle に代入されています


tekinohikouki[0].life = 1; //👈🌞🌞🌞ここがポイントです🌞🌞🌞


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

//👆😋敵の飛行機😋のデータをとりあつかっています





struct Character jibunnotama[3];

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

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


jibunnotama[j].x = 0;

jibunnotama[j].y = 0;


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


jibunnotama[j].life = 0;


}


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



int count = 0;//🌞🌞🌞ここでint型の変数countを作製し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 (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;

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

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

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




if (jibunnohikouki.life == 1) {


DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);


}


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

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


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


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


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


}


}


//👆 tekinohikouki[0].lifeに格納されている値が1なら敵の飛行機の画像を描きます

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





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


if ((jibunnohikouki.x + 7 < tekinohikouki[i].x + 28) && (tekinohikouki[i].x + 7 < jibunnohikouki.x + 27) && (jibunnohikouki.y + 7 < tekinohikouki[i].y + 13) && (tekinohikouki[i].y + 6 < jibunnohikouki.y + 13)) {


jibunnohikouki.life = 0;


tekinohikouki[i].life = 0;


}



//👆自機と敵の飛行機が重なった条件を満たせばjibunnohikouki.lifeとtekinohikouki[0].lifeには0が代入されることになります




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


if ((jibunnotama[j].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[0].life = 0;

}


}


//👆自分の弾と敵機が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[0].lifeには0が代入されることになります


//👆自分の弾1と敵機が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[0].lifeには0が代入されることになります


//👆自分の弾2と敵機が重なった条件を満たせばjibunnotama[2].lifeとtekinohikouki[0].lifeには0が代入されることになります





/*👆この部分は以下のように書き換えることができます


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


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


if ((jibunnotama[j].x < tekinohikouki[i].x + 28) && (tekinohikouki[i].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 13) && (

tekinohikouki[i].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[i].life = 0;

}


}

}


なぜこのように記述するのかの解説は後ほどですね🥰


*/



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


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


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


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


tsix = jibunnotama[j].x;


jibunnotama[j].y = jibunnohikouki.y + 20;


jibunnotama[j].life = 1;


break;


}


}


count = 10;

}



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




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


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

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


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


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



DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, 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;


}


}




ScreenFlip();


ClearDrawScreen();


};



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


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


}



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

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

👇

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



マックス「


自分の弾

自分の弾1

自分の弾2



敵の飛行機



があたっても


自分の弾

自分の弾1

自分の弾2



敵の飛行機



消えるようになった


なんか微妙い


自分の弾

自分の弾1

自分の弾2



敵の飛行機



が当たって


自分の弾

自分の弾1

自分の弾2



敵の飛行機



が消えるようになったのはいいんだが


敵の飛行機


の表示されていた場所に


連射された自分の弾を打ち込むと


その位置で自分の弾がきえてしまうじゃないか


何にも見えてないところで自分の弾が消えるのか


ぬあぜえだあ」


solarplexuss「ホントだ


そこに


敵の飛行機


がいるみたい」


ソーラー「確かに


敵機はみえなくなっただけで


その位置に


敵の飛行機


はいるからね


だからその位置に連射された自分の弾を打ち込んだら


自分の弾

自分の弾1

自分の弾2


敵の飛行機


が当たったと判定されて


自分の弾

自分の弾1

自分の弾2

が消えるんだね


だから


敵の飛行機


が消えたら


その

敵の飛行機


が消えた場所に


(見えなくなっている

敵の飛行機に)


自分の弾

自分の弾1

自分の弾2

を打ち込んでも


自分の弾

自分の弾1

自分の弾2

は消えないようにする必要があるんだね」



マックス「なんだ 簡単に解決しそうじゃないか」


ソーラー「では


自分の弾

もしくは

自分の弾1

もしくは

自分の弾2


が撃ち込まれて


見えない状態となった


敵の飛行機



新たに


自分の弾

もしくは

自分の弾1

もしくは

自分の弾2

を打ち込んでも


自分の弾

もしくは

自分の弾1

もしくは

自分の弾2


は消えないようにする


そうしたいんだけど


その前に


とりあえず


今のこのプログラムの仕組みを考察してみましょう



このプログラムでは


struct Character tekinohikouki[0];


を行い


Character型の構造体変数


tekinohikouki[0]

用意しています



敵の飛行機のデータを


Character型の構造体変数


tekinohikouki[0]


のメンバ変数を用いて取り扱っています



tekinohikouki[0].x = 600;


tekinohikouki[0].y = 100;


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


tekinohikouki[0].life=1;



の実行により


Character型の構造体変数


tekinohikouki[0]


のメンバ変数


tekinohikouki[0].x

tekinohikouki[0].y

tekinohikouki[0].graphichandle

tekinohikouki[0].life



を敵の飛行機のデータで初期化しています



そして



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


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


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


}


}



の実行に注目ですね


tekinohikouki[0].lifeに格納されている値が1なら


敵の飛行機の画像が表示され


tekinohikouki[0].lifeに格納されている値が0なら


敵の飛行機の画像は表示されません


そして


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


if((jibunnohikouki.x+7< tekinohikouki[i].x+28)&&(tekinohikouki[i].x+7 < jibunnohikouki.x+27)&& (jibunnohikouki.y+7< tekinohikouki[i].y+13)&&(tekinohikouki[i].y+6<jibunnohikouki.y+13)){


jibunnohikouki.life=0;


tekinohikouki[i].life=0;


}


の実行ですね


iは0のときの


条件式

(jibunnohikouki.x+7< tekinohikouki[0].x+28)&&(tekinohikouki[0].x+7 < jibunnohikouki.x+27)&& (jibunnohikouki.y+7< tekinohikouki[0].y+13)&&(tekinohikouki[0].y+6<jibunnohikouki.y+13)



真の値1を持つとき


すなわち


(jibunnohikouki.x+7< tekinohikouki[0].x+28)

かつ

(tekinohikouki[0].x+7 < jibunnohikouki.x+27)



かつ



(jibunnohikouki.y+7< tekinohikouki[0].y+13)

かつ

(tekinohikouki[0].y+6<jibunnohikouki.y+13)


が満たされた時


自機と敵の飛行機がぶつかったと判定されます


このとき


jibunnohikouki.life=0;


tekinohikouki[0].life=0;


が実行されて


jibunnohikouki.life

tekinohikouki[0].life



0が代入されるので


自機と敵の飛行機が表示されることはなくなります


つまり


自機と敵の飛行機は消えるというわけです



0が代入されるので


自機と敵の飛行機1が表示されることはなくなります


つまり


自機と敵の飛行機1は消えるというわけです



ここまでが


自機

敵の飛行機


が当たったとき


自機

敵の飛行機


が消える仕組みだね」


solarplexuss「はい いまさっきのお話でした」


ソーラー「


そして続いて


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


if ((jibunnotama[j].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[0].life = 0;



}

}


//👆自分の弾と敵の飛行機が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[0].lifeには0が代入されることになります



//👆自分の弾1と敵の飛行機が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[0].lifeには0が代入されることになります



//👆自分の弾2と敵の飛行機が重なった条件を満たせばjibunnotama[2].lifeとtekinohikouki[0].lifeには0が代入されることになります



の実行ですね


jは0のときの


条件式


(jibunnotama[0].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[0].x + 15) && (jibunnotama[0].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[0].y + 5)



真の値1を持つとき


自分の弾と敵の飛行機がぶつかったと判定されます


このとき


jibunnotama[0].life = 0;


tekinohikouki[0].life=0;


が実行されて


jibunnotama[0].life

tekinohikouki[0].life



0が代入されるので


自分の弾と敵の飛行機が表示されることはなくなります


つまり


自分の弾と敵の飛行機は消えるというわけです


jは1のときの


条件式


(jibunnotama[1].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[1].x + 15) && (jibunnotama[1].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[1].y + 5)



真の値1を持つとき


自分の弾1と敵の飛行機がぶつかったと判定されます


このとき


jibunnotama[1].life = 0;


tekinohikouki[0].life=0;


が実行されて


jibunnotama[1].life

tekinohikouki[0].life



0が代入されるので


自分の弾1と敵の飛行機が表示されることはなくなります


つまり


自分の弾1と敵の飛行機は消えるというわけです



jは2のときの


条件式


(jibunnotama[2].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[2].x + 15) && (jibunnotama[2].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[2].y + 5)



真の値1を持つとき


自分の弾2と敵の飛行機がぶつかったと判定されます




このとき


jibunnotama[2].life = 0;


tekinohikouki[0].life=0;


が実行されて


jibunnotama[2].life

tekinohikouki[0].life



0が代入されるので


自分の弾2と敵の飛行機が表示されることはなくなります


つまり


自分の弾2と敵の飛行機は消えるというわけです


自分の弾、自分の弾1、自分の弾2は消えたとしても


新たに何度でも自分の弾、自分の弾1、自分の弾2を発射することができるので


このままでは



😊✈️敵の飛行機✈️は自分の弾もしくは自分の弾1もしくは自分の弾2が当たってすでに消えていたとしても😊



新たに発射された自分の弾と敵の飛行機がぶつかった時の条件



(jibunnotama[0].x < tekinohikouki[0].x + 28)

かつ

(tekinohikouki[0].x + 7 < jibunnotama[0].x + 15)



かつ



(jibunnotama[0].y < tekinohikouki[0].y + 13)

かつ

(tekinohikouki[0].y + 6 < jibunnotama[0].y + 5)



もしくは


新たに発射された自分の弾1と敵の飛行機がぶつかった時の条件



(jibunnotama[1].x < tekinohikouki[0].x + 28)

かつ

(tekinohikouki[0].x + 7 < jibunnotama[1].x + 15)



かつ



(jibunnotama[1].y < tekinohikouki[0].y + 13)

かつ

(tekinohikouki[0].y + 6 < jibunnotama[1].y + 5)



もしくは


新たに発射された自分の弾2と敵の飛行機がぶつかった時の条件


(jibunnotama[2].x < tekinohikouki[0].x + 28)

かつ

(tekinohikouki[0].x + 7 < jibunnotama[2].x + 15)



かつ



(jibunnotama[2].y < tekinohikouki[0].y + 13)

かつ

(tekinohikouki[0].y + 6 < jibunnotama[2].y + 5)



が満たされて



条件式


(jibunnotama[0].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[0].x + 15) && (jibunnotama[0].y < tekinohikouki[0].y + 13) && (tekinohikouki[0].y + 6 < jibunnotama[0].y + 5)




もしくは



条件式


(jibunnotama[1].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[1].x + 15) && (jibunnotama[1].y < tekinohikouki[0].y + 13) && (tekinohikouki[0].y + 6 < jibunnotama[1].y + 5)



もしくは



条件式


(jibunnotama[2].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[2].x + 15) && (jibunnotama[2].y < tekinohikouki[0].y + 13) && (tekinohikouki[0].y + 6 < jibunnotama[2].y + 5)



真の値1を持つとき


jibunnotama[0].life = 0;


tekinohikouki[0].life=0;


もしくは


jibunnotama[1].life = 0;


tekinohikouki[0].life=0;


もしくは


jibunnotama[2].life = 0;


tekinohikouki[0].life=0;


が実行されて



 😊新たに発射された自分の弾,自分の弾1,自分の弾2😊



敵の飛行機


がぶつかったと判定された位置で消えてしまうことになります😊


そこで


tekinohikouki[0].life=0;


が実行されて


tekinohikouki[0].lifeに0が代入された場合


もう


自分の弾

自分の弾1

自分の弾2

見えない


敵の飛行機



ぶつかっても


自分の弾

自分の弾1

自分の弾2


が消えないように



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


if ((jibunnotama[j].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[0].life = 0;



}

}



が実行されないように




このプログラムの

👇

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


if ((jibunnotama[j].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[0].life = 0;



}

}


👆

の部分を変更する必要があります」


solarplexuss「・・・」



ソーラー「



それでは

👇


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


if ((jibunnotama[j].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[0].life = 0;



}

}


👆


の部分を



👇


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


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


if ((jibunnotama[j].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[0].life = 0;



}

}

}

👆


に変更したプログラムを実行してみましょう


👇


#include "DxLib.h"


struct Character {

int x;

int y;

int graphichandle;

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関数です 裏画面に画像を描きます


struct Character jibunnohikouki;

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


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


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


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


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

//👆😋自分の飛行機😋のデータをとりあつかっています




struct Character tekinohikouki[1];

//👆🌞敵の飛行機を1体登場させるために要素数を1にして構造体変数tekinohikouki[0]を作成しています


tekinohikouki[0].x = 600;


tekinohikouki[0].y = 100;


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


//👆メモリに取り込まれた😋敵の飛行機のデータ😋に割り当てられた番号が tekinohikouki[0].graphichandle に代入されています


tekinohikouki[0].life = 1; //👈🌞🌞🌞ここがポイントです🌞🌞🌞


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

//👆😋敵の飛行機😋のデータをとりあつかっています





struct Character jibunnotama[3];

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

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


jibunnotama[j].x = 0;

jibunnotama[j].y = 0;


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


jibunnotama[j].life = 0;


}


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



int count = 0;//🌞🌞🌞ここでint型の変数countを作製し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 (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;

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

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

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




if (jibunnohikouki.life == 1) {


DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);


}


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

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


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


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


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


}


}


//👆 tekinohikouki[0].lifeに格納されている値が1なら敵の飛行機の画像を描きます

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





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


if ((jibunnohikouki.x + 7 < tekinohikouki[i].x + 28) && (tekinohikouki[i].x + 7 < jibunnohikouki.x + 27) && (jibunnohikouki.y + 7 < tekinohikouki[i].y + 13) && (tekinohikouki[i].y + 6 < jibunnohikouki.y + 13)) {


jibunnohikouki.life = 0;


tekinohikouki[i].life = 0;


}



//👆自機と敵の飛行機が重なった条件を満たせばjibunnohikouki.lifeとtekinohikouki[0].lifeには0が代入されることになります


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


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


if ((jibunnotama[j].x < tekinohikouki[0].x + 28) && (tekinohikouki[0].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[0].y + 13) && (

tekinohikouki[0].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[0].life = 0;



}

}

}


//👆自分の弾と敵機が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[0].lifeには0が代入されることになります


//👆自分の弾1と敵機が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[0].lifeには0が代入されることになります


//👆自分の弾2と敵機が重なった条件を満たせばjibunnotama[2].lifeとtekinohikouki[0].lifeには0が代入されることになります





/*👆この部分は以下のように書き換えることができます


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


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


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


if ((jibunnotama[j].x < tekinohikouki[i].x + 28) && (tekinohikouki[i].x + 7 < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 13) && (

tekinohikouki[i].y + 6 < jibunnotama[j].y + 5)) {


jibunnotama[j].life = 0;


tekinohikouki[i].life = 0;



}

}

}


}


なぜこのように記述するのかの解説は後ほどですね🥰


*/



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


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


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


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


tsix = jibunnotama[j].x;


jibunnotama[j].y = jibunnohikouki.y + 20;


jibunnotama[j].life = 1;


break;


}


}


count = 10;

}



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




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


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

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


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


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



DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, 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;


}


}




ScreenFlip();


ClearDrawScreen();


};



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


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


}


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

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

👇


https://www.youtube.com/watch?v=19yevvl-vPE




solarplexuss「いやっほう~


1体の敵を用意して置いて


敵機が自分の弾に当たってゲーム画面から消えた後


敵機のいた場所に連射された自分の弾をうちこんでも


自分の弾が消える事はなくなった


すごいなあ


やったね!」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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