さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
画面の外に弾が出てから次の弾が発射されるプログラムでは画面の左端にいると次弾が発射されるのに時間がかかり画面の右端にいるとすぐに次弾が発射されることになります
画面の外に弾が出てから次の弾が発射されるプログラムでは画面の左端にいると次弾が発射されるのに時間がかかり画面の右端にいるとすぐに次弾が発射されることになります
ソーラー「
みなさん今までの
最初に
自分の弾が発射されて
ゲーム画面の外に出ると
次の自分の弾が発射されるタイプのプログラムをご覧ください」
👇
#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のメンバ変数の初期化を行っています
//👆😋飛行機😋のデータをとりあつかっています
struct Character jibunnotama[1];//自分の弾,を取り扱うためにCharacter型の構造体変数が1つ作成されるように要素数を1にしました
for (int i = 0; i < 1; i = i + 1) {
jibunnotama[i].x = 0;
jibunnotama[i].y = 0;
jibunnotama[i].graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[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 (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;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
//👆飛行機の画像を描きます
if (key & PAD_INPUT_A) {
for (int i = 0; i < 1; i = i + 1) {
if (jibunnotama[i].life == 0) {
jibunnotama[i].x = jibunnohikouki.x + 35;
jibunnotama[i].y = jibunnohikouki.y + 20;
jibunnotama[i].life = 1;
break;
}
}
}
for (int i = 0; i < 1; i = i + 1) {
if (jibunnotama[i].life == 1) {
DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);
jibunnotama[i].x = jibunnotama[i].x + 10;
if (jibunnotama[i].x > 640)
jibunnotama[i].life = 0;
}
}
ScreenFlip();
ClearDrawScreen();
};
DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます
return 0; // プログラムを終了します
}
デバッグなしで実行をしてから一度プログラムを終了し
生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです
👇
https://www.youtube.com/watch?v=cY_sf52Pe0U
ソーラー「このプログラムが実行されると
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;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
//👆飛行機の画像を描きます
if (key & PAD_INPUT_A) {
for (int i = 0; i < 1; i = i + 1) {
if (jibunnotama[i].life == 0) {
jibunnotama[i].x = jibunnohikouki.x + 35;
jibunnotama[i].y = jibunnohikouki.y + 20;
jibunnotama[i].life = 1;
break;
}
}
}
for (int i = 0; i < 1; i = i + 1) {
if (jibunnotama[i].life == 1) {
DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);
jibunnotama[i].x = jibunnotama[i].x + 10;
if (jibunnotama[i].x > 640)
jibunnotama[i].life = 0;
}
}
ScreenFlip();
ClearDrawScreen();
};
のブロック{}内の命令文
👇
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;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
//👆飛行機の画像を描きます
if (key & PAD_INPUT_A) {
for (int i = 0; i < 1; i = i + 1) {
if (jibunnotama[i].life == 0) {
jibunnotama[i].x = jibunnohikouki.x + 35;
jibunnotama[i].y = jibunnohikouki.y + 20;
jibunnotama[i].life = 1;
break;
}
}
}
for (int i = 0; i < 1; i = i + 1) {
if (jibunnotama[i].life == 1) {
DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);
jibunnotama[i].x = jibunnotama[i].x + 10;
if (jibunnotama[i].x > 640)
jibunnotama[i].life = 0;
}
}
ScreenFlip();
ClearDrawScreen();
が繰り返し実行されることになります
for{}文のところを展開すると
👇
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;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
//👆飛行機の画像を描きます
if (key & PAD_INPUT_A) {
if (jibunnotama[0].life == 0) {
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
//🌞🌞🌞break;はfor{}文のブロック{}内以外で使うとプログラムの実行時break;が実行された時点でプログラムが終了するので取り除いています🌞🌞🌞
}
}
if (jibunnotama[0].life == 1) {
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
}
}
ScreenFlip();
ClearDrawScreen();
が繰り返し実行されることになります
もし
Zボタンが押された状態で
1回目の while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の実行されると
if (key & PAD_INPUT_A) の条件式
key & PAD_INPUT_Aは
16&16
は
1の値を持つので
if (key & PAD_INPUT_A) {
if (jibunnotama[0].life == 0) {
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
}
}
のブロック{}内の命令文
👇
if (jibunnotama[0].life == 0) {
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
}
が実行されることになります
jibunnotama[0].life は
0で初期化されていたので
if (jibunnotama[0].life == 0) {}のブロック{}内の命令文
👇
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
が実行されることになります
jibunnohikouki.x
jibunnohikouki.y
は
0
0
に初期化されていたので
jibunnotama[0].x に格納されている値は35になり
jibunnotama[0].y に格納されている値は20になります
jibunnotama[0].life = 1;
が実行されるので
jibunnotama[0].lifeに格納される値は1になります
☆☆ jibunnotama[0].lifeに格納される値は1になったので
自分の弾の発射の準備が整いました☆☆
😊jibunnotama[0].lifeには1が代入されていたので😊
続く命令文
if (jibunnotama[0].life == 1) {
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
}
のブロック{}内の命令文
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
が実行されることになります
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
の実行により
(35,0)の位置が
自分の弾の画像データの左上の頂点になるように
自分の弾の画像データが表示されることになります
そして
jibunnotama[0].x = jibunnotama[0].x + 10;
の実行により
jibunnotama[0].xに格納される値は45になります
jibunnotama[0].xに格納される値は45なので
if (jibunnotama[0].x > 640)
の条件式
jibunnotama[0].x > 640
は
45>640
は
0の値を持つので
if (jibunnotama[0].x > 640)に続く命令文
jibunnotama[0].life = 0;
は実行されません
2回目の while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の実行されると
if (key & PAD_INPUT_A) {
if (jibunnotama[0].life == 0) {
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
}
}
が実行されることになりますが
jibunnotama[0].life に格納されている値は1になったので
if (jibunnotama[0].life == 0)の条件式
1 == 0
は
0
となり
if (jibunnotama[0].life == 0) {{
のブロック{}内の命令文
👇
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
👆
が実行されることはありません
次に
if (jibunnotama[0].life == 1) {
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
}
の実行に移ります
😊jibunnotama[0].lifeには1が代入されていたので😊
if (jibunnotama[0].life == 1)の条件式
jibunnotama[0].life == 1
は
1==1
は
1
の値をもつので
if (jibunnotama[0].life == 1) {}のブロック{}内の命令文
👇
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
👆
が実行されることになります
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
の実行により
(45,0)の位置が
自分の弾の画像データの左上の頂点になるように
自分の弾の画像データが表示されることになります
そして
jibunnotama[0].x = jibunnotama[0].x + 10;
の実行により
jibunnotama[0].xに格納される値は55になります
jibunnotama[0].xに格納される値は55なので
if (jibunnotama[0].x > 640)
の条件式
jibunnotama[0].x > 640
の持つ値は
0になるので
if (jibunnotama[0].x > 640)に続く命令文
jibunnotama[0].life = 0;
は実行されません
3回目
4回目
5回目
6回目
7回目
8回目
・
・
・
60回目
の
while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の実行されたあと
61回目のwhile (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の実行されると何がおこるかをみてみましょう
61回目の while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の実行されると
まず
if (key & PAD_INPUT_A) {
if (jibunnotama[0].life == 0) {
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
}
}
が実行されることになります
jibunnotama[0].life に格納されている値は1なので
if (jibunnotama[0].life == 0)の条件式
1 == 0
は
0
となり
if (jibunnotama[0].life == 0) {{
のブロック{}内の命令文
👇
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
👆
が実行されることはありません
😊jibunnotama[0].lifeには1が代入されていたので😊
続く命令文
if (jibunnotama[0].life == 1) {
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
}
のブロック{}内の命令文
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
が実行されることになります
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
の実行により
(635,0)の位置が
自分の弾の画像データの左上の頂点になるように
自分の弾の画像データが表示されることになります
そして
jibunnotama[0].x = jibunnotama[0].x + 10;
の実行により
jibunnotama[0].xに格納される値は645になります
jibunnotama[0].xに格納される値は645なので
if (jibunnotama[0].x > 640)
の条件式
jibunnotama[0].x > 640
は
645>640
は
1の値を持つので
if (jibunnotama[0].x > 640)に続く命令文
💖 jibunnotama[0].life = 0;💖
が実行されることになります
💖 jibunnotama[0].life に格納されている値が0になることにより
新たな自分の弾の発射準備が整いました💖
そして
62回目のの while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の実行されると
まず
if (key & PAD_INPUT_A) {
if (jibunnotama[0].life == 0) {
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
}
}
が実行されることになります
jibunnotama[0].life に格納されている値は0に変化したので
if (jibunnotama[0].life == 0)の条件式
0 == 0
は
1
となり
if (jibunnotama[0].life == 0) {{
のブロック{}内の命令文
👇
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
👆
が実行されることになります
自機を移動させていなければ
jibunnohikouki.x
jibunnohikouki.y
は
0
0
に初期化されたままなので
jibunnotama[0].x に格納されている値は35になり
jibunnotama[0].y に格納されている値は20になります
jibunnotama[0].life = 1;
が実行されるので
jibunnotama[0].lifeに格納される値は1になります
😊jibunnotama[0].lifeには1が代入されていたので😊
続く命令文
if (jibunnotama[0].life == 1) {
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
}
のブロック{}内の命令文
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
が実行されることになります
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
の実行により
(35,0)の位置が
自分の弾の画像データの左上の頂点になるように
自分の弾の画像データが表示されることになります
そして
jibunnotama[0].x = jibunnotama[0].x + 10;
の実行により
jibunnotama[0].xに格納される値は45になります
jibunnotama[0].xに格納される値は45なので
if (jibunnotama[0].x > 640)
の条件式
jibunnotama[0].x > 640
は
45>640
は
0の値を持つので
if (jibunnotama[0].x > 640)に続く命令文
jibunnotama[0].life = 0;
は実行されません
ソーラー「このプログラムでは
最初に
自分の弾が発射されて
自分の弾がゲーム画面の外に出たら
次の自分の弾が発射されることになります」
マックス「う~ん
そうなんだが微妙いよなあ
自機が
ゲーム画面の右端近くの方にいると
自分の弾が発射されたとき
すぐに
自分の弾がゲーム画面の右端に
たどり着いて
ゲーム画面の外に
自分の弾が出て行くから
次の自分の弾はすぐに発射されるんだが
自機が
ゲーム画面の左端の方にいると
自分の弾が発射されても
自分の弾がゲーム画面の右端に
たどり着いて
ゲーム画面の外に
自分の弾が出て行くのに時間がかかるから
自分の弾が発射されてから
次の自分の弾が発射されるまでに時間がかかるんだよなあ
今のプログラムがその例というわけだ
ふーむ
このギャップを
どうしたものか」
solarplexuss「確かに、そうなり
画面の右端の方に飛行機がいると弾が
超高速で連続して発射されるんだけど
画面の左端の方に飛行機がいると弾がぽつっ ぽつっ
としか発射されないんだよねえ」
マックス「なんかこう
自機が
ゲーム画面の右端にいても左端にいても
一定の間隔で
自分の弾が発射されるようにしたいぃ
どうしたものか」
ソーラー「自機が
ゲーム画面の右端近くの方にいると
自分の弾が発射されたとき
すぐに
自分の弾がゲーム画面の右端に
たどり着いて
ゲーム画面の外に
自分の弾が出て行くから
次の自分の弾はすぐに発射され
自機が
ゲーム画面の左端の方にいると
自分の弾が発射されても
自分の弾がゲーム画面の右端に
たどり着いて
ゲーム画面の外に
自分の弾が出て行くのに時間がかかるから
自分の弾が発射されてから
次の自分の弾が発射されるまでに時間がかかる
その原因は
今のプログラムのこの部分
👇
if (jibunnotama[0].life == 1) {
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
}
👆
の
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
の部分にあります
ある回の while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文が実行されたとき
jibunnotama[0].x > 640
が成立した場合
jibunnotama[0].life = 0;
が実行されることになりますね
jibunnotama[0].lifeに格納される値が0になったので
新たな自分の弾の発射の準備が整うことになります
次の 回のwhile (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の実行において
まず
if (key & PAD_INPUT_A) {
if (jibunnotama[0].life == 0) {
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
}
}
が実行されることになります
jibunnotama[0].life に格納されている値は0に変化したので
if (jibunnotama[0].life == 0)の条件式
0 == 0
は
1
となり
if (jibunnotama[0].life == 0) {{
のブロック{}内の命令文
👇
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
👆
が実行されることになります
ここで問題になるのが
jibunnohikouki.x
jibunnohikouki.y
に格納されている値です
jibunnohikouki.x
jibunnohikouki.y
に格納されている値は
飛行機を移動させることによってさまざまに変化します
自機を右側に水平に600ドット移動させていれば
jibunnohikouki.x
jibunnohikouki.y
は
600
0
の値を持つことになります
すると
jibunnotama[0].x に格納されている値は635になり
jibunnotama[0].y に格納されている値は0になります
jibunnotama[0].life = 1;
が実行されるので
jibunnotama[0].lifeに格納される値は1になります
jibunnotama[0].lifeに格納される値は1になったので
再び自分の弾の発射の準備が整いました
この状態で続く命令文
👇
if (jibunnotama[0].life == 1) {
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
}
👆
が実行されると
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
の実行により
(635,0)の位置が
自分の弾の画像データの左上の頂点になるように
自分の弾の画像データが表示されることになります
そして
jibunnotama[0].x = jibunnotama[0].x + 10;
の実行により
jibunnotama[0].xに格納される値は645になります
jibunnotama[0].xに格納される値は645なので
if (jibunnotama[0].x > 640)
の条件式
jibunnotama[0].x > 640
は
645>640
は
1の値を持つので
if (jibunnotama[0].x > 640)に続く命令文
jibunnotama[0].life = 0;
が実行されることになります
jibunnotama[0].life =に格納される値が0になったことにより
新たな次の自分の弾が発射される準備が整いました
この状態だと
while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の1回の実行ごとに
新たな弾が発射されることになります
つまり自機が画面右端にいると
次々と高速で弾が発射されることになります
solarplexuss「ええと
今は
自機を右側に水平に600ドット移動させていたでしょう
じゃあ
自機を右側に水平に590ドット移動させていれば
jibunnohikouki.x
jibunnohikouki.y
は
590
0
の値を持つことになるでしょ
すると
jibunnotama[0].x に格納されている値は625になり
jibunnotama[0].y に格納されている値は0になります
jibunnotama[0].life = 1;
が実行されるので
jibunnotama[0].lifeに格納される値は1になります
jibunnotama[0].lifeに格納される値は1になったので
再び自分の弾の発射の準備が整ったね
この状態で続く命令文
👇
if (jibunnotama[0].life == 1) {
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
}
👆
が実行されると
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
の実行により
(625,0)の位置が
自分の弾の画像データの左上の頂点になるように
自分の弾の画像データが表示されることになります
そして
jibunnotama[0].x = jibunnotama[0].x + 10;
の実行により
jibunnotama[0].xに格納される値は635になります
jibunnotama[0].xに格納される値は635なので
if (jibunnotama[0].x > 640)
の条件式
jibunnotama[0].x > 640
は
635>640
は
0の値を持つので
if (jibunnotama[0].x > 640)に続く命令文
jibunnotama[0].life = 0;
は実行されないよね
次の 回のwhile (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の実行において
まず
if (key & PAD_INPUT_A) {
if (jibunnotama[0].life == 0) {
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
}
}
が実行されることになります
jibunnotama[0].life に格納されている値は1なので
if (jibunnotama[0].life == 0)の条件式
1 == 0
は
0
となり
if (jibunnotama[0].life == 0) {{
のブロック{}内の命令文
👇
jibunnotama[0].x = jibunnohikouki.x + 35;
jibunnotama[0].y = jibunnohikouki.y + 20;
jibunnotama[0].life = 1;
break;
👆
は実行されません
続く命令文
👇
if (jibunnotama[0].life == 1) {
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
jibunnotama[0].x = jibunnotama[0].x + 10;
if (jibunnotama[0].x > 640)
jibunnotama[0].life = 0;
}
👆
が実行されると
DrawGraph(jibunnotama[0].x, jibunnotama[0].y, jibunnotama[0].graphichandle, TRUE);
の実行により
(635,0)の位置が
自分の弾の画像データの左上の頂点になるように
自分の弾の画像データが表示されることになります
そして
jibunnotama[0].x = jibunnotama[0].x + 10;
の実行により
jibunnotama[0].xに格納される値は645になります
jibunnotama[0].xに格納される値は645なので
if (jibunnotama[0].x > 640)
の条件式
jibunnotama[0].x > 640
は
645>640
は
1の値を持つので
if (jibunnotama[0].x > 640)に続く命令文
jibunnotama[0].life = 0;
が実行されることになります
jibunnotama[0].life =に格納される値が0になったことにより
新たな次の自分の弾が発射される準備が整いました
この状態だと
while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}のブロック{}内の命令文の1回おきの実行ごとに
新たな弾が発射されることになります」
マックス「今のが画面の右端のほうに自機がいる場合に弾が発射されている状態か」
ソーラー「では 画面の右端にいても左端にいても
一定の間隔で弾が発射されるようにしてみましょう」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます