さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
最終段階 複数の敵を用意しておいて自機と敵機がぶつかったら 自機と敵機が消えるようにするだけでなく さらに 連射された自分の弾と敵機がぶつかったら 自分の弾と敵機が消えるようにしてみましょう
最終段階 複数の敵を用意しておいて自機と敵機がぶつかったら 自機と敵機が消えるようにするだけでなく さらに 連射された自分の弾と敵機がぶつかったら 自分の弾と敵機が消えるようにしてみましょう
ソーラー「いよいよ最終段階です
今度は
複数の敵を用意しておいて
自機と敵機がぶつかったら
自機と敵機が消えるようにするだけでなく
Ⓜ️連射された自分の弾Ⓜ️と敵機がぶつかったら
自分の弾と敵機が消えるようにもしてみましょう
今回
登場する敵の数は3機
敵の飛行機
敵の飛行機1
敵の飛行機2
の3機とします
Zボタンを押すと1度に発射される弾は
自分の弾
自分の弾1
の
2発にするね
(ここでは敵のデータを取り扱うために
struct Character tekinohikouki[3];
を実行して
構造体変数
tekinohikouki[1]
tekinohikouki[2]
tekinohikouki[3]
を作成し
自分の弾のデータを取り扱うために
struct Character jibunnotama[2];
を
実行して
構造体変数
jibunnotama[0]
jibunnotama[1]
を作成します)
まず手始めに
自分の弾
と
敵の飛行機
敵の飛行機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[0].x<tekinohikouki[1].x+28
かつ
tekinohikouki[1].x+7< jibunnotama[0].x+15
かつ
jibunnotama[0].y< tekinohikouki[1].y+13
かつ
tekinohikouki[1].y+6< jibunnotama[0].y+5
自分の弾
と
敵の飛行機2の画像データ
が
重なっている条件は
jibunnotama[0].x<tekinohikouki[2].x+28
かつ
tekinohikouki[2].x+7< jibunnotama[0].x+15
かつ
jibunnotama[0].y< tekinohikouki[2].y+13
かつ
tekinohikouki[2].y+6< jibunnotama[0].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[0].x<tekinohikouki[1].x+28
かつ
tekinohikouki[1].x+7< jibunnotama[0].x+15
かつ
jibunnotama[0].y< tekinohikouki[1].y+13
かつ
tekinohikouki[1].y+6< jibunnotama[0].y+5
を満たしたとき
自分の弾と敵の飛行機1が消えるようにすればいいわけなんだね
そして
自分の弾の画像データ
と
敵の飛行機2の画像データ
が重なったとき
すなわち
jibunnotama[0].x<tekinohikouki[2].x+28
かつ
tekinohikouki[2].x+7< jibunnotama[0].x+15
かつ
jibunnotama[0].y< tekinohikouki[2].y+13
かつ
tekinohikouki[2].y+6< jibunnotama[0].y+5
を満たしたとき
自分の弾と敵の飛行機2が消えるようにすればいいわけなんだね
さらに
自分の弾1
と
敵の飛行機
敵の飛行機1
敵の飛行機2
がぶつかったときの
判定条件を
求めてみようよ
今までのエピソードで学んできたように
自分の弾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].x<tekinohikouki[1].x+28
かつ
tekinohikouki[1].x+7< jibunnotama[1].x+15
かつ
jibunnotama[1].y< tekinohikouki[1].y+13
かつ
tekinohikouki[1].y+6< jibunnotama[1].y+5
自分の弾1
と
敵の飛行機2の画像データ
が
重なっている条件は
jibunnotama[1].x<tekinohikouki[2].x+28
かつ
tekinohikouki[2].x+7< jibunnotama[1].x+15
かつ
jibunnotama[1].y< tekinohikouki[2].y+13
かつ
tekinohikouki[2].y+6< jibunnotama[1].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と敵の飛行機が消えるようにすればいいわけなんだね
そして
自分の弾1の画像データ
と
敵の飛行機1の画像データ
が重なったとき
すなわち
jibunnotama[1].x<tekinohikouki[1].x+28
かつ
tekinohikouki[1].x+7< jibunnotama[1].x+15
かつ
jibunnotama[1].y< tekinohikouki[1].y+13
かつ
tekinohikouki[1].y+6< jibunnotama[1].y+5
を満たしたとき
自分の弾1と敵の飛行機1が消えるようにすればいいわけなんだね
そして
自分の弾1の画像データ
と
敵の飛行機2の画像データ
が重なったとき
すなわち
jibunnotama[1].x<tekinohikouki[2].x+28
かつ
tekinohikouki[2].x+7< jibunnotama[1].x+15
かつ
jibunnotama[1].y< tekinohikouki[2].y+13
かつ
tekinohikouki[2].y+6< jibunnotama[1].y+5
を満たしたとき
自分の弾1と敵の飛行機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[3];
//👆🌞敵の飛行機を3体登場させるために要素数を3にして構造体変数tekinohikouki[0]、tekinohikouki[1]、tekinohikouki[2]を作成しています
tekinohikouki[0].x = 600;
tekinohikouki[0].y = 100;
tekinohikouki[0].graphichandle = LoadGraph("画像データ\\敵の飛行機.bmp");
//👆メモリに取り込まれた😋敵の飛行機のデータ😋に割り当てられた番号が tekinohikouki[0].graphichandle に代入されています
tekinohikouki[0].life = 1; //👈🌞🌞🌞ここがポイントです🌞🌞🌞
//👆🌞構造体変数tekinohikouki[0]のメンバ変数の初期化を行っています
//👆😋敵の飛行機😋のデータをとりあつかっています
tekinohikouki[1].x = 600;
tekinohikouki[1].y = 200;
tekinohikouki[1].graphichandle = LoadGraph("画像データ\\敵の飛行機.bmp");
//👆メモリに取り込まれた😋敵の飛行機のデータ😋に割り当てられた番号が tekinohikouki[1].graphichandle に代入されています
tekinohikouki[1].life = 1; //👈🌞🌞🌞ここがポイントです🌞🌞🌞
//👆🌞構造体変数tekinohikouki[1]のメンバ変数の初期化を行っています
//👆😋敵の飛行機1😋のデータをとりあつかっています
tekinohikouki[2].x = 600;
tekinohikouki[2].y = 300;
tekinohikouki[2].graphichandle = LoadGraph("画像データ\\敵の飛行機.bmp");
//👆メモリに取り込まれた😋敵の飛行機2のデータ😋に割り当てられた番号が tekinohikouki[2].graphichandle に代入されています
tekinohikouki[2].life = 1; //👈🌞🌞🌞ここがポイントです🌞🌞🌞
//👆🌞構造体変数tekinohikouki[2]のメンバ変数の初期化を行っています
//👆😋敵の飛行機2😋のデータをとりあつかっています
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 = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[i].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 < 3; 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なら敵の飛行機の画像が描かれることはありません
//👆 tekinohikouki[1].lifeに格納されている値が1なら敵の飛行機1の画像を描きます
//👆 tekinohikouki[1].lifeに格納されている値が0なら敵の飛行機1の画像が描かれることはありません
//👆 tekinohikouki[2].lifeに格納されている値が1なら敵の飛行機2の画像を描きます
//👆 tekinohikouki[2].lifeに格納されている値が0なら敵の飛行機2の画像が描かれることはありません
for (int i = 0; i < 3; i++) {
if(tekinohikouki[i]==1){
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が代入されることになります
//👆自機と敵の飛行機1が重なった条件を満たせばjibunnohikouki.lifeとtekinohikouki[1].lifeには0が代入されることになります
//👆自機と敵の飛行機2が重なった条件を満たせばjibunnohikouki.lifeとtekinohikouki[2].lifeには0が代入されることになります
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
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;
}
}
}
//👆自分の弾と敵の飛行機が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[0].lifeには0が代入されることになります
//👆自分の弾と敵の飛行機1が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[1].lifeには0が代入されることになります
//👆自分の弾と敵の飛行機2が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[2].lifeには0が代入されることになります
//👆自分の弾1と敵の飛行機が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[0].lifeには0が代入されることになります
//👆自分の弾1と敵の飛行機1が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[1].lifeには0が代入されることになります
//👆自分の弾1と敵の飛行機2が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[2].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 + 20;
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, 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=53TX5gzrMas
マックス「自分の弾
と
敵の飛行機
敵の飛行機1
敵の飛行機2
があたっても
自分の弾
と
敵の飛行機
敵の飛行機1
敵の飛行機2
が消えるようになった!
自分の弾1
と
敵の飛行機
敵の飛行機1
敵の飛行機2
があたっても
自分の弾1
と
敵の飛行機
敵の飛行機1
敵の飛行機2
が消えるようになった!
が
なんか微妙い
自分の弾
と
敵の飛行機
敵の飛行機1
敵の飛行機2
が当たって
自分の弾
と
敵の飛行機
敵の飛行機1
敵の飛行機2
が消えるようになり
自分の弾1
と
敵の飛行機
敵の飛行機1
敵の飛行機2
が当たって
自分の弾1
と
敵の飛行機
敵の飛行機1
敵の飛行機2
が消えるようになったのはいいんだが
敵の飛行機
敵の飛行機1
敵の飛行機2
の表示されていた場所に
新たな
自分の弾
自分の弾1
を打ち込むと
その位置で
自分の弾
自分の弾1
がきえてしまうじゃないか
何にも見えてないところで
自分の弾
自分の弾1
が消えるのか
まあ もう予測はつくがなああ」
solarplexuss「ホントだ
そこに
敵の飛行機
敵の飛行機1
敵の飛行機2
がいるみたい」
ソーラー「確かに
敵機はみえなくなっただけで
その位置に
敵の飛行機
敵の飛行機1
敵の飛行機2
はいるからね
だからその位置に
自分の弾を打ち込んだら
自分の弾
と
敵の飛行機
敵の飛行機1
敵の飛行機2
が当たったと判定されて
自分の弾が消えるんだね
自分の弾1を打ち込んだら
自分の弾1
と
敵の飛行機
敵の飛行機1
敵の飛行機2
が当たったと判定されて
自分の弾1が消えるんだね
だから
敵の飛行機
敵の飛行機1
敵の飛行機2
が消えたら
新たに
その
敵の飛行機
敵の飛行機1
敵の飛行機2
が消えた場所に
(見えなくなっている
敵の飛行機
敵の飛行機1
敵の飛行機2に)
自分の弾
自分の弾1
を打ち込んでも
自分の弾
自分の弾1
は消えないようにする必要があるんだね
自分の弾と敵の飛行機がぶつかったと判定されたとき
tekinohikouki[0].life = 0;
が実行されるので
(このとき敵の飛行機が消えることになります)
tekinohikouki[0].lifeに0が代入されたときは
自分の弾は消えないようすればいいんだね
自分の弾と敵の飛行機1がぶつかったと判定されたとき
tekinohikouki[1].life = 0;
が実行されるので
(このとき敵の飛行機1が消えることになります)
tekinohikouki[1].lifeに0が代入されたときは
自分の弾は消えないようすればいいんだね
自分の弾と敵の飛行機2がぶつかったと判定されたとき
tekinohikouki[2].life = 0;
が実行されるので
(このとき敵の飛行機2が消えることになります)
tekinohikouki[2].lifeに0が代入されたときは
自分の弾は消えないようすればいいんだね
さらに
自分の弾1と敵の飛行機がぶつかったと判定されたとき
tekinohikouki[0].life = 0;
が実行されるので
(このとき敵の飛行機が消えることになります)
tekinohikouki[0].lifeに0が代入されたときは
自分の弾1は消えないようすればいいんだね
自分の弾1と敵の飛行機1がぶつかったと判定されたとき
tekinohikouki[1].life = 0;
が実行されるので
(このとき敵の飛行機1が消えることになります)
tekinohikouki[1].lifeに0が代入されたときは
自分の弾1は消えないようすればいいんだね
自分の弾1と敵の飛行機2がぶつかったと判定されたとき
tekinohikouki[2].life = 0;
が実行されるので
(このとき敵の飛行機2が消えることになります)
tekinohikouki[2].lifeに0が代入されたときは
自分の弾1は消えないようすればいいんだね」
マックス「なんだ 簡単に解決しそうじゃないか」
ソーラー「では
自分の弾
もしくは
自分の弾1
が撃ち込まれて
見えない状態となった
敵の飛行機
敵の飛行機1
敵の飛行機2
に
新たに
自分の弾
自分の弾1
を打ち込んでも
自分の弾
自分の弾1
は消えないようにする
そうしたいんだけど
その前に
とりあえず
今のこのプログラムの仕組みを考察してみましょう
このプログラムでは
struct Character tekinohikouki[3];
を行い
Character型の構造体変数
tekinohikouki[0]
tekinohikouki[1]
tekinohikouki[2]
を
用意しています
敵の飛行機のデータを
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
を敵の飛行機のデータで初期化しています
敵の飛行機1のデータを
Character型の構造体変数
tekinohikouki[1]
のメンバ変数を用いて取り扱っています
tekinohikouki[1].x = 600;
tekinohikouki[1].y = 200;
tekinohikouki[1].graphichandle = LoadGraph("画像データ\\敵の飛行機.bmp");
tekinohikouki[1].life=1;
の実行により
Character型の構造体変数
tekinohikouki[1]
のメンバ変数
tekinohikouki[1].x
tekinohikouki[1].y
tekinohikouki[1].graphichandle
tekinohikouki[1].life
を敵の飛行機1のデータで初期化しています
敵の飛行機2のデータを
Character型の構造体変数
tekinohikouki[2]
のメンバ変数を用いて取り扱っています
tekinohikouki[2].x = 600;
tekinohikouki[2].y = 100;
tekinohikouki[2].graphichandle = LoadGraph("画像データ\\敵の飛行機.bmp");
tekinohikouki[2].life=1;
の実行により
Character型の構造体変数
tekinohikouki[2]
のメンバ変数
tekinohikouki[2].x
tekinohikouki[2].y
tekinohikouki[2].graphichandle
tekinohikouki[2].life
を敵の飛行機2のデータで初期化しています
そして
for(int i=0;i<3;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なら
敵の飛行機の画像は表示されません
tekinohikouki[1].lifeに格納されている値が1なら
敵の飛行機の画像が表示され
tekinohikouki[1].lifeに格納されている値が0なら
敵の飛行機の画像は表示されません
tekinohikouki[2].lifeに格納されている値が1なら
敵の飛行機の画像が表示され
tekinohikouki[2].lifeに格納されている値が0なら
敵の飛行機の画像は表示されません
そして
for(int i=0;i<3;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が代入されるので
自機と敵の飛行機が表示されることはなくなります
つまり
自機と敵の飛行機は消えるというわけです
iは1のときの
条件式
(jibunnohikouki.x+7< tekinohikouki[1].x+28)&&(tekinohikouki[1].x+7 < jibunnohikouki.x+27)&& (jibunnohikouki.y+7< tekinohikouki[1].y+13)&&(tekinohikouki[1].y+6<jibunnohikouki.y+13)
が
真の値1を持つとき
すなわち
(jibunnohikouki.x+7< tekinohikouki[1].x+28)
かつ
(tekinohikouki[1].x+7 < jibunnohikouki.x+27)
かつ
(jibunnohikouki.y+7< tekinohikouki[1].y+13)
かつ
(tekinohikouki[1].y+6<jibunnohikouki.y+13)
が満たされた時
自機と敵の飛行機1がぶつかったと判定されます
このとき
jibunnohikouki.life=0;
tekinohikouki[1].life=0;
が実行されて
jibunnohikouki.life
と
tekinohikouki[1].life
に
0が代入されるので
自機と敵の飛行機1が表示されることはなくなります
つまり
自機と敵の飛行機1は消えるというわけです
iは2のときの
条件式
(jibunnohikouki.x+7< tekinohikouki[2].x+28)&&(tekinohikouki[2].x+7 < jibunnohikouki.x+27)&& (jibunnohikouki.y+7< tekinohikouki[2].y+13)&&(tekinohikouki[2].y+6<jibunnohikouki.y+13)
が
真の値1を持つとき
すなわち
(jibunnohikouki.x+7< tekinohikouki[2].x+28)
かつ
(tekinohikouki[2].x+7 < jibunnohikouki.x+27)
かつ
(jibunnohikouki.y+7< tekinohikouki[2].y+13)
かつ
(tekinohikouki[2].y+6<jibunnohikouki.y+13)
が満たされた時
自機と敵の飛行機2がぶつかったと判定されます
このとき
jibunnohikouki.life=0;
tekinohikouki[2].life=0;
が実行されて
jibunnohikouki.life
と
tekinohikouki[2].life
に
0が代入されるので
自機と敵の飛行機2が表示されることはなくなります
つまり
自機と敵の飛行機2は消えるというわけです
ここまでが
自機
と
敵の飛行機
自機
と
敵の飛行機1
自機
と
敵の飛行機2
が当たったとき
自機
と
敵の飛行機
自機
と
敵の飛行機1
自機
と
敵の飛行機2
が消える仕組みだね」
solarplexuss「はい ごく最近のお話でした」
ソーラー「
そして続いて
for (int i = 0; i < 3; i = i + 1) {
for (int j= 0; j< 2; i = i + 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;
}
}
}
//👆自分の弾と敵の飛行機が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[0].lifeには0が代入されることになります
//👆自分の弾と敵の飛行機1が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[1].lifeには0が代入されることになります
//👆自分の弾と敵の飛行機2が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[2].lifeには0が代入されることになります
//👆自分の弾1と敵の飛行機が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[0].lifeには0が代入されることになります
//👆自分の弾1と敵の飛行機1が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[1].lifeには0が代入されることになります
//👆自分の弾1と敵の飛行機2が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[2].lifeには0が代入されることになります
の実行ですね
jは0
iは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は0
iは1のときの
条件式
(jibunnotama[0].x < tekinohikouki[1].x + 28) && (tekinohikouki[1].x + 7 < jibunnotama[0].x + 15) && (jibunnotama[0].y < tekinohikouki[1].y + 13) && (
tekinohikouki[1].y + 6 < jibunnotama[0].y + 5)
が
真の値1を持つとき
自分の弾と敵の飛行機1がぶつかったと判定されます
このとき
jibunnotama[0].life = 0;
tekinohikouki[1].life=0;
が実行されて
jibunnotama[0].life
と
tekinohikouki[1].life
に
0が代入されるので
自分の弾と敵の飛行機1が表示されることはなくなります
つまり
自分の弾と敵の飛行機1は消えるというわけです
jは0
iは2のときの
条件式
(jibunnotama[0].x < tekinohikouki[2].x + 28) && (tekinohikouki[2].x + 7 < jibunnotama[0].x + 15) && (jibunnotama[0].y < tekinohikouki[2].y + 13) && (
tekinohikouki[2].y + 6 < jibunnotama[0].y + 5)
が
真の値1を持つとき
自分の弾と敵の飛行機2がぶつかったと判定されます
このとき
jibunnotama[0].life = 0;
tekinohikouki[2].life=0;
が実行されて
jibunnotama[0].life
と
tekinohikouki[2].life
に
0が代入されるので
自分の弾と敵の飛行機2が表示されることはなくなります
つまり
自分の弾と敵の飛行機2は消えるというわけです
jは1
iは0のときの
条件式
(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が代入されるので
自分の弾と敵の飛行機が表示されることはなくなります
つまり
自分の弾と敵の飛行機は消えるというわけです
jは1
iは1のときの
条件式
(jibunnotama[1].x < tekinohikouki[1].x + 28) && (tekinohikouki[1].x + 7 < jibunnotama[1].x + 15) && (jibunnotama[1].y < tekinohikouki[1].y + 13) && (
tekinohikouki[1].y + 6 < jibunnotama[1].y + 5)
が
真の値1を持つとき
自分の弾1と敵の飛行機1がぶつかったと判定されます
このとき
jibunnotama[1].life = 0;
tekinohikouki[1].life=0;
が実行されて
jibunnotama[1].life
と
tekinohikouki[1].life
に
0が代入されるので
自分の弾1と敵の飛行機1が表示されることはなくなります
つまり
自分の弾1と敵の飛行機1は消えるというわけです
jは1
iは2のときの
条件式
(jibunnotama[1].x < tekinohikouki[2].x + 28) && (tekinohikouki[2].x + 7 < jibunnotama[1].x + 15) && (jibunnotama[1].y < tekinohikouki[2].y + 13) && (
tekinohikouki[2].y + 6 < jibunnotama[1].y + 5)
が
真の値1を持つとき
自分の弾1と敵の飛行機2がぶつかったと判定されます
このとき
jibunnotama[1].life = 0;
tekinohikouki[2].life=0;
が実行されて
jibunnotama[1].life
と
tekinohikouki[2].life
に
0が代入されるので
自分の弾1と敵の飛行機2が表示されることはなくなります
つまり
自分の弾1と敵の飛行機2は消えるというわけです
自分の弾
自分の弾1
は消えたとしても新たに何度でも
自分の弾
自分の弾1を発射することができるので
このままでは
😊✈️敵の飛行機✈️もしくは ✈️敵の飛行機1✈️もしくは ✈️敵の飛行機2✈️は😊
😊自分の弾もしくは自分の弾1😊
が当たってすでに消えていたとしても
新たに発射された自分の弾と敵の飛行機がぶつかった時の条件
(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].x < tekinohikouki[1].x + 28)
かつ
(tekinohikouki[1].x + 7 < jibunnotama[0].x + 15)
かつ
(jibunnotama[0].y < tekinohikouki[1].y + 13)
かつ
(tekinohikouki[1].y + 6 < jibunnotama[0].y + 5)
もしくは
新たに発射された自分の弾と敵の飛行機2がぶつかった時の条件
(jibunnotama[0].x < tekinohikouki[2].x + 28)
かつ
(tekinohikouki[2].x + 7 < jibunnotama[0].x + 15)
かつ
(jibunnotama[0].y < tekinohikouki[2].y + 13)
かつ
(tekinohikouki[2].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と敵の飛行機1がぶつかった時の条件
(jibunnotama[1].x < tekinohikouki[1].x + 28)
かつ
(tekinohikouki[1].x + 7 < jibunnotama[1].x + 15)
かつ
(jibunnotama[1].y < tekinohikouki[1].y + 13)
かつ
(tekinohikouki[1].y + 6 < jibunnotama[1].y + 5)
もしくは
新たに発射された自分の弾1と敵の飛行機2がぶつかった時の条件
(jibunnotama[1].x < tekinohikouki[2].x + 28)
かつ
(tekinohikouki[2].x + 7 < jibunnotama[1].x + 15)
かつ
(jibunnotama[1].y < tekinohikouki[2].y + 13)
かつ
(tekinohikouki[2].y + 6 < jibunnotama[1].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[0].x < tekinohikouki[1].x + 28) && (tekinohikouki[1].x + 7 < jibunnotama[0].x + 15) && (jibunnotama[0].y < tekinohikouki[1].y + 13) && (tekinohikouki[1].y + 6 < jibunnotama[0].y + 5)
もしくは
条件式
(jibunnotama[0].x < tekinohikouki[2].x + 28) && (tekinohikouki[2].x + 7 < jibunnotama[0].x + 15) && (jibunnotama[0].y < tekinohikouki[2].y + 13) && (tekinohikouki[2].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[1].x < tekinohikouki[1].x + 28) && (tekinohikouki[1].x + 7 < jibunnotama[1].x + 15) && (jibunnotama[1].y < tekinohikouki[1].y + 13) && (tekinohikouki[1].y + 6 < jibunnotama[1].y + 5)
もしくは
条件式
(jibunnotama[1].x < tekinohikouki[2].x + 28) && (tekinohikouki[2].x + 7 < jibunnotama[1].x + 15) && (jibunnotama[1].y < tekinohikouki[2].y + 13) && (tekinohikouki[2].y + 6 < jibunnotama[1].y + 5)
が
真の値1を持つとき
jibunnotama[0].life = 0;
tekinohikouki[0].life=0;
もしくは
jibunnotama[0].life = 0;
tekinohikouki[1].life=0;
もしくは
jibunnotama[0].life = 0;
tekinohikouki[2].life=0;
もしくは
jibunnotama[1].life = 0;
tekinohikouki[0].life=0;
もしくは
jibunnotama[1].life = 0;
tekinohikouki[1].life=0;
もしくは
jibunnotama[1].life = 0;
tekinohikouki[2].life=0;
が実行されて
😊新たに発射された
自分の弾
自分の弾1
が
敵の飛行機
もしくは
敵の飛行機1
もしくは
敵の飛行機2
とぶつかったと判定された位置で消えてしまうことになります😊
そこで
tekinohikouki[0].life=0;
が実行されて
tekinohikouki[0].lifeに0が代入された場合
もう
自分の弾
と
見えない
敵の飛行機
が
ぶつかっても自分の弾が消えないように
if ((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[0].life = 0;
tekinohikouki[0].life = 0;
}
が実行されないように
tekinohikouki[1].life=0;
が実行されて
tekinohikouki[1].lifeに0が代入された場合
もう自分の弾と見えない敵の飛行機1がぶつかっても自分の弾が消えないように
if ((jibunnotama[0].x < tekinohikouki[1].x + 28) && (tekinohikouki[1].x + 7 < jibunnotama[0].x + 15) && (jibunnotama[0].y < tekinohikouki[1].y + 13) && (
tekinohikouki[1].y + 6 < jibunnotama[0].y + 5)) {
jibunnotama[0].life = 0;
tekinohikouki[1].life = 0;
}
が実行されないように
tekinohikouki[2].life=0;
が実行されて
tekinohikouki[2].lifeに0が代入された場合
もう自分の弾と見えない敵の飛行機2がぶつかっても自分の弾が消えないように
if ((jibunnotama[0].x < tekinohikouki[2].x + 28) && (tekinohikouki[2].x + 7 < jibunnotama[0].x + 15) && (jibunnotama[0].y < tekinohikouki[2].y + 13) && (
tekinohikouki[2].y + 6 < jibunnotama[0].y + 5)) {
jibunnotama[0].life = 0;
tekinohikouki[2].life = 0;
}
が実行されないように
tekinohikouki[0].life=0;
が実行されて
tekinohikouki[0].lifeに0が代入された場合
もう
自分の弾1
と
見えない
敵の飛行機
が
ぶつかっても自分の弾1が消えないように
if ((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[1].life = 0;
tekinohikouki[0].life = 0;
}
が実行されないように
tekinohikouki[1].life=0;
が実行されて
tekinohikouki[1].lifeに0が代入された場合
もう自分の弾1と見えない敵の飛行機1がぶつかっても自分の弾1が消えないように
if ((jibunnotama[1].x < tekinohikouki[1].x + 28) && (tekinohikouki[1].x + 7 < jibunnotama[1].x + 15) && (jibunnotama[1].y < tekinohikouki[1].y + 13) && (
tekinohikouki[1].y + 6 < jibunnotama[1].y + 5)) {
jibunnotama[1].life = 0;
tekinohikouki[1].life = 0;
}
が実行されないように
tekinohikouki[2].life=0;
が実行されて
tekinohikouki[2].lifeに0が代入された場合
もう自分の弾1と見えない敵の飛行機2がぶつかっても自分の弾1が消えないように
if ((jibunnotama[1].x < tekinohikouki[2].x + 28) && (tekinohikouki[2].x + 7 < jibunnotama[1].x + 15) && (jibunnotama[1].y < tekinohikouki[2].y + 13) && (
tekinohikouki[2].y + 6 < jibunnotama[1].y + 5)) {
jibunnotama[1].life = 0;
tekinohikouki[2].life = 0;
}
が実行されないように
このプログラムの
👇
for (int i = 0; i < 3; i = i + 1) {
for (int j= 0; j< 2; i = i + 1) {
if ((jibunnotama[0].x < tekinohikouki[i].x + 28) && (tekinohikouki[i].x + 7 < jibunnotama[0].x + 15) && (jibunnotama[0].y < tekinohikouki[i].y + 13) && (
tekinohikouki[i].y + 6 < jibunnotama[0].y + 5)) {
jibunnotama[0].life = 0;
tekinohikouki[i].life = 0;
}
}
}
👆
の部分を変更する必要があります」
solarplexuss「効いたよ」
ソーラー「
それでは
👇
for (int i = 0; i < 3; i = i + 1) {
for (int j= 0; j< 2; i = i + 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;
}
}
}
👆
の部分を
for (int i = 0; i < 3; i = i + 1) {
if(tekinohikouki[i].life==1){
for (int j= 0; j< 2; i = i + 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;
}
}
}
}
に変更したプログラムを実行してみましょう
そのプログラムはこちらです
👇
#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[3];
//👆🌞敵の飛行機を3体登場させるために要素数を3にして構造体変数tekinohikouki[0]、tekinohikouki[1]、tekinohikouki[2]を作成しています
tekinohikouki[0].x = 600;
tekinohikouki[0].y = 100;
tekinohikouki[0].graphichandle = LoadGraph("画像データ\\敵の飛行機.bmp");
//👆メモリに取り込まれた😋敵の飛行機のデータ😋に割り当てられた番号が tekinohikouki[0].graphichandle に代入されています
tekinohikouki[0].life = 1; //👈🌞🌞🌞ここがポイントです🌞🌞🌞
//👆🌞構造体変数tekinohikouki[0]のメンバ変数の初期化を行っています
//👆😋敵の飛行機😋のデータをとりあつかっています
tekinohikouki[1].x = 600;
tekinohikouki[1].y = 200;
tekinohikouki[1].graphichandle = LoadGraph("画像データ\\敵の飛行機.bmp");
//👆メモリに取り込まれた😋敵の飛行機のデータ😋に割り当てられた番号が tekinohikouki[1].graphichandle に代入されています
tekinohikouki[1].life = 1; //👈🌞🌞🌞ここがポイントです🌞🌞🌞
//👆🌞構造体変数tekinohikouki[1]のメンバ変数の初期化を行っています
//👆😋敵の飛行機1😋のデータをとりあつかっています
tekinohikouki[2].x = 600;
tekinohikouki[2].y = 300;
tekinohikouki[2].graphichandle = LoadGraph("画像データ\\敵の飛行機.bmp");
//👆メモリに取り込まれた😋敵の飛行機2のデータ😋に割り当てられた番号が tekinohikouki[2].graphichandle に代入されています
tekinohikouki[2].life = 1; //👈🌞🌞🌞ここがポイントです🌞🌞🌞
//👆🌞構造体変数tekinohikouki[2]のメンバ変数の初期化を行っています
//👆😋敵の飛行機2😋のデータをとりあつかっています
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 = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[i].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 < 3; 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なら敵の飛行機の画像が描かれることはありません
//👆 tekinohikouki[1].lifeに格納されている値が1なら敵の飛行機1の画像を描きます
//👆 tekinohikouki[1].lifeに格納されている値が0なら敵の飛行機1の画像が描かれることはありません
//👆 tekinohikouki[2].lifeに格納されている値が1なら敵の飛行機2の画像を描きます
//👆 tekinohikouki[2].lifeに格納されている値が0なら敵の飛行機2の画像が描かれることはありません
for (int i = 0; i < 3; i++) {
if(tekinohikouki[i]==1){
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が代入されることになります
//👆自機と敵の飛行機1が重なった条件を満たせばjibunnohikouki.lifeとtekinohikouki[1].lifeには0が代入されることになります
//👆自機と敵の飛行機2が重なった条件を満たせばjibunnohikouki.lifeとtekinohikouki[2].lifeには0が代入されることになります
for (int i = 0; i < 3; i++) {
if (tekinohikouki[i].life==1) {
for (int j = 0; j < 2; j++) {
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;
}
}
}
}
//👆自分の弾と敵の飛行機が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[0].lifeには0が代入されることになります
//👆自分の弾と敵の飛行機1が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[1].lifeには0が代入されることになります
//👆自分の弾と敵の飛行機2が重なった条件を満たせばjibunnotama[0].lifeとtekinohikouki[2].lifeには0が代入されることになります
//👆自分の弾1と敵の飛行機が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[0].lifeには0が代入されることになります
//👆自分の弾1と敵の飛行機1が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[1].lifeには0が代入されることになります
//👆自分の弾1と敵の飛行機2が重なった条件を満たせばjibunnotama[1].lifeとtekinohikouki[2].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 + 20;
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, 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=UYVHNCGU_3c
solarplexuss「いやっほう~
複数の敵を用意して置いて
敵機が連射した自分の弾に当たってゲーム画面から消えた後
敵機のいた場所に連射した自分の弾をうちこんでも
連射した自分の弾が消える事はなくなった
すごいなあ
やったね!」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます