画面の外に弾が出てから次の弾が発射されるプログラムでは画面の左端にいると次弾が発射されるのに時間がかかり画面の右端にいるとすぐに次弾が発射されることになります

ソーラー「


みなさん今までの


最初に

自分の弾が発射されて


ゲーム画面の外に出ると


次の自分の弾が発射されるタイプのプログラムをご覧ください」

👇


#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回おきの実行ごとに


新たな弾が発射されることになります」


マックス「今のが画面の右端のほうに自機がいる場合に弾が発射されている状態か」


ソーラー「では 画面の右端にいても左端にいても


一定の間隔で弾が発射されるようにしてみましょう」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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