Zボタンを押して発射された自分の弾が画面の外に出たときZボタンを押したら新たに自分の弾が発射されるようにプログラムを構成してみましょう

ソーラー「


Zボタンを押したとき飛行機の自分の弾が発射されるプログラムは


こちらでした


ただしこのプログラムでは


自分の弾が一つ発射されたあとは


それ以降


何度


Zボタンを押しても


もう自分の弾が発射されることはありません」


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

👇



#include "DxLib.h"


struct Character {

int x;

int y;

int graphichandle;


};

//👆🌞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;

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


jibunnotama.x = 0;


jibunnotama.y = 0;


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

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



int a = 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) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}



if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


}



ScreenFlip();


ClearDrawScreen();


};



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


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


}


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

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

👇


https://www.youtube.com/watch?v=VzmvhH-vRHg



ソーラー「



このプログラムが実行されると


while{}文のブロック{}内の


命令文が繰り返し実行されることになります


       🌸Zボタンを押している状態で🌸


while{}文のブロック{}内の


命令文が繰り返し実行される場合



具体的には



jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();




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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();


が実行されることになります


このプログラムをよく観察してね




1回目のwhile{}文のブロック{}内の命令文の繰り返しのとき


Zボタンが押されていたなら


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



が実行され


あとの繰り返しの回は


Zボタンが押されている

Zボタンが押されていないにかかわらず


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



が実行されるので


自分の弾の画像が10ドットずつ


横に移動しながら


表示され消える


ということが


ずっとえんえんと行われることになります


いずれは


ゲーム画面の外に


自分の弾の画像は消えていくことになります



それでも


jibunnotama.x = jibunnotama.x + 10;


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


ScreenFlip();


ClearDrawScreen();



ずっと実行されることになります



この状態では


Zボタンが押されている

Zボタンが押されていないにかかわらず


自分の弾の画像が10ドットずつ


横に移動しながら


表示されるということが


ずっとえんえんと行われることになりますが


実行されている命令文

👇


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();




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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();


👆


を見てもわかるように


もちろん


Zボタンをおしても


2発目の弾が発射されるなんてことはおこりませんね」


solarplexuss「??ふ〜ん


なんかぱっと


このwhile{}文を見た感じだと


Zボタンを押すと


そのたびに弾が発射されそうにみえるんだけど・・・


気のせいかな?」


ソーラー「そう、思う?


solarplexussさん


いい線いってる😊


そうなんです


このwhile{}文に


ほんのちょっと改良を加えただけで


Zボタンを押すたびに弾が発射されるようにすることができます



まずは


        🌹発射された自分の弾が画面の外に出たとき🌹


Zボタンを押したら


弾が発射されるようにしてみましょう


では


ちょっとだけ


while{}文に次のように改良を加えてみるよ」


👇


int a = 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) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}



if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if(jibunnotama.x>640)


a=0;

//👆この部分だけ付け加えました

}



ScreenFlip();


ClearDrawScreen();


};



マックス「


//👇この部分だけ付け加えました

if(jibunnotama.x>640)


a=0;

//👆この部分だけ付け加えました


👆を追加しただけで


発射された自分の弾が画面の外に出たとき


Zボタンを押したら


新たに自分の弾が発射されるようになるのか?


まさかなあ?」


ソーラー「うふふ 不思議だね


ではwhile文に


//👇この部分だけ付け加えました

if(jibunnotama.x>640)


a=0;

//👆この部分だけ付け加えました


👆を追加したプログラムを実行してみましょう



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

👇

#include "DxLib.h"


struct Character {

int x;

int y;

int graphichandle;


};

//👆🌞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;

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


jibunnotama.x = 0;


jibunnotama.y = 0;


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

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




int a = 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) {


if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;


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


a = 1;

}

}


if (a == 1) {


jibunnotama.x = jibunnotama.x + 10;


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


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


}



ScreenFlip();


ClearDrawScreen();


};



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


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


}


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

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

👇

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


おまけ

👇

https://www.youtube.com/watch?v=StNCd-wGxS4


マックス「


なんで


//👇この部分だけ付け加えました

if(jibunnotama.x>640)


a=0;

//👆この部分だけ付け加えました


👆を追加しただけで


Zボタンを押して発射された自分の弾が画面の外に出たとき


再び


Zボタンを押したら


自分の弾が発射されるように


なったのか


意味が分からん」


ソーラー「では


変更が加えられたwhile{}文の仕組みをみてみようよ


このプログラムが実行されると


while{}文のブロック{}内の


命令文が繰り返し実行されることになります


まず


while{}文の前で


int a = 0;


が実行されているね


int型の変数aが生成されています


ここでは


int型の変数aに0


が代入されています


int型の変数aに0が代入されている状態だと


if (a == 0){命令文;}


タイプの


命令文は実行されることになるね



さあ


まずは


1回目のwhile{}文のブロック{}内の命令文の繰り返しが実行されます


まず


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);


の実行により



キーボードからの入力に応じて(裏画面の)ある位置に飛行機の画像データが表示されることになります


今はキーボードの十字キーからの入力は行われていないとすると


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


が実行されていたので


(0,0)を始点として


裏画面に飛行機の画像データが表示されることになります





次に


いよいよ


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


の実行ですね


          🧩今は🧩


    🧩キーボードのZボタンが押されていない状態で🧩


          🧩なおかつ


    🧩十字キーを押して飛行機を動かしていないとします🧩


つまり何もキーを押していないとします


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


が実行されると


key & PAD_INPUT_A



0&16



0


となり


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}



if (0) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


となり


if (0) {}のブロック{}内の命令文


if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


は実行されません


このとき


while{}文の前で


int a = 0;


が実行されていたので


aには0が代入されたままです


次に


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました



}



が実行されます



aには0が代入されているので


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました



}



if (0){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました



}



となるので


ブロック内の命令文



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました




は実行されません



ですので


裏画面に


jibunnotama.x

jibunnotama.y

に代入されている値

(

jibunnotama.x=0;

jibunnotama.y=0;

が実行されていたので

)


0

0


始点として



    🍊自分の弾の画像データが描かれることはありません🍊



飛行機の画像データだけが裏画面に表示されることになります



次に


ScreenFlip();


の実行により


今まで裏画面に描かれた飛行機の画像がしばらくの間


表画面に表示された後


ClearDrawScreen();


の実行により


表画面と裏画面に描かれた飛行機の画像がすべて消去されることになります



つまり


何もボタンをおしてなくても


飛行機の画像は表示されるんだけど


Zボタンは押されていないので


自分の弾は表示されないってわけだね


まあ 普通のことかな?


2回目のwhile{}文のブロック{}内の命令文の繰り返しの実行でも


何もボタンをおしていないと


飛行機の画像は表示されるんだけど


Zボタンは押されていないので


自分の弾は表示されないってわけだね」


solarplexuss「にゃん」


ソーラー「


今は


    🧩飛行機を十字キーを押して動かしていない状態で🧩


            🧩なおかつ🧩


    🧩キーボードのZボタンが押されていない状態🧩


            🧩つまり🧩


     🧩何もキーを押していない状態でしたが🧩


            🧚‍♂️今度は🧚


     🧚飛行機を十字キーを押して動かしていない状態で🧚


      🧚キーボードのZボタンが押されている状態🧚


            🧚つまり🧚


    🧚キーボードのZボタンだけが押されている状態だとします🧚


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


が実行されると


Zボタンを押しているので


key & PAD_INPUT_A



16&16


イコール


1


となり


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}



if (1) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


となり


ブロック{}内の命令文


if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


が実行されることになります


このとき


aには


0が代入されているので


a == 0



0==0



1


となり


if (1) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


となるので



jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;



が実行されることになります


自分の弾の画像データが表示される位置に関わる


jibunnotama.xは jibunnohikouki.x + 35=0+35=35の値を持ち


jibunnotama.y は jibunnohikouki.y + 20=0+20=20の値を持つことになりますね



続く


a = 1;


がポイントだね



int型の変数aに0が代入されている状態だと


if (a == 0){命令文;}


タイプの


命令文が実行されますが



int型の変数aに1が代入されている状態だと


if (a == 1){命令文;}


タイプの


命令文が実行されることになります



a = 1;


を実行することにより



if (a == 1){命令文;}

タイプの


命令文が実行されるように変更されたんだよ



次に



if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました



}



が実行されます



aには1が代入されているので


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました



}



if (1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました



}



となるので


ブロック{}内の命令文



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


が実行されることになります



ですので


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


の実行により


裏画面に


jibunnotama.x

jibunnotama.y


(



jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;


すなわち


jibunnotama.x = 0+ 35;


jibunnotama.y = 0 + 20;



実行されていたので


jibunnotama.x

jibunnotama.y


には


35

20



が代入されています)


すなわち


35

20


始点として


自分の弾の画像データが描かれることになります


そして


続く


jibunnotama.x = jibunnotama.x + 10;


の実行により


jibunnotama.x に格納されている値は10


増えて


45になります



次に


if (jibunnotama.x > 640)


a = 0;


の実行に移りますが


条件式


jibunnotama.x > 640



45>640



0


となり


if (jibunnotama.x > 640)


if (0)


となるので



if (jibunnotama.x > 640)に続く命令文


a = 0;


は実行されません


ですので


aには1が代入されたままです


次に


ScreenFlip();


の実行により


今まで裏画面に描かれた飛行機と自分の弾の画像がしばらくの間


表画面に表示された後


ClearDrawScreen();


の実行により


表画面と裏画面に描かれた飛行機と自分の弾の画像がすべて消去されることになります


これで


1回目のwhile{}文のブロック{}内の命令文の繰り返しの実行の終了です


さあ


今度は


2回目のwhile{}文のブロック{}内の命令文の繰り返しの実行です



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);


の実行により


キーボードからの入力に応じて裏画面に飛行機の画像データが表示されることになります


まず


今はキーボードの十字キーからの入力は行われていないとすると


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


が実行されていたので


(0,0)を始点として


裏画面に飛行機の画像データが表示されることになります


次に



if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


の実行ですね


このとき


キーボードのZボタンは


押され続けているかもしれないし


もう


キーボードのZボタンは


押されていないかもしれません





キーボードのZボタンが押されている状態で


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


が実行されると


key & PAD_INPUT_A



16&16


イコール


1


となり


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}



if (1) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


となり



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


が実行されることになります


このとき


aには


1が代入されているので


a == 0



1==0



0


となり


if (0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


となるので



jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;



は実行されません



1回目のwhile{}文のブロック{}内の命令文の繰り返しのとき



jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


が実行されているので


         🍎aには1が代入されたままです🍎



続いて

キーボードのZボタンが押されていない状態で


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


が実行されると


key & PAD_INPUT_A



0&16



0


となり


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}



if (0) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


となるので



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


は実行されません



1回目のwhile{}文のブロック{}内の命令文の繰り返しのとき



jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


が実行されているので


          🍎aには1が代入されたままです🍎


つまり


1回目のwhile{}文のブロック{}内の命令文の繰り返しで


Zボタンを押すことにより


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


が実行された場合は


2回目のwhile{}文のブロック{}内の命令文の繰り返しの実行の時点で


          😊 Zボタンが押されていても 😊

          😁 Zボタンが押されていなくても 😁


aには1が代入されたままになります」


solarplexuss「ふ~ん


1回目のwhile{}文のブロック{}内の命令文の繰り返しの実行の時点で


Zボタンを押したら


aには1が代入される


そして


2回目のwhile{}文のブロック{}内の命令文の繰り返しの実行の時点で


          😊 Zボタンが押されていても 😊

          😁 Zボタンが押されていなくても 😁


aには1が代入されたままなんだ」



ソーラー「そうなんです


実行されない


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


に続いて


次に



if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


}



の実行となりますが



aには1が代入されているので


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


}



if (1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


}



となるので


ブロック内の命令文



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


jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


が実行されることになります



1回目のwhile{}文のブロック{}内の命令文の繰り返しのときで


Zボタンを押していた場合は


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


の実行により


jibunnotama.x = 0 + 35;


jibunnotama.y = 0 + 20;


始点として


つまり


35

20



始点として


自分の弾の画像が描かれましたが


1回目のwhile{}文のブロック{}内の命令文の繰り返しで


その後

jibunnotama.x = jibunnotama.x + 10;


が実行されていたので


jibunnotama.xには45が代入されています


jibunnotama.y

には何も操作が行われていないので

20の値を持ったままとなります



ですので


2回目のwhile{}文のブロック{}内の命令文の繰り返しのときの


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


が実行されると


45

20



始点として


自分の弾の画像が描かれることになります


つまり


自分の弾の画像データが水平に10ドット横に移動して描かれることになります


次に


jibunnotama.x = jibunnotama.x + 10;


が実行されるので


jibunnotama.x

55

の値を持つことになり

jibunnotama.y

20の値を持ったままとなります


次に


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


の実行になりますが


jibunnotama.x > 640



55>640



0となるので


a = 0;


は実行されません


そして


次は


3回目のwhile{}文のブロック{}内の命令文の繰り返しの実行になりますが


結論を言うと


3回目のwhile{}文のブロック{}内の命令文の繰り返しのときも


今はキーボードの十字キーからの入力は行われていないとすると


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


が実行されていたので


(0,0)を始点として


裏画面に飛行機の画像データが表示されることになります


そして


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


が実行されることになりますが



さきほど


2回目のwhile{}文のブロック{}内の命令文の繰り返しのとき


jibunnotama.x

55

の値を持つことになり

jibunnotama.y

20の値を持ったままとなったので


55

20



始点として


自分の弾の画像が描かれることになります


次に


jibunnotama.x = jibunnotama.x + 10;


が実行されるので


jibunnotama.x

65

の値を持つことになり

jibunnotama.y

20の値を持ったままとなります


次に


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


の実行になりますが


jibunnotama.x > 640



65>640



0となるので


a = 0;


は実行されません


以下


4回目のwhile{}文のブロック{}内の命令文の繰り返し

5回目のwhile{}文のブロック{}内の命令文の繰り返し

6回目のwhile{}文のブロック{}内の命令文の繰り返し

7回目のwhile{}文のブロック{}内の命令文の繰り返し

8回目のwhile{}文のブロック{}内の命令文の繰り返し


と続いていくことになりますが


jibunnotama.xの格納している値は


65

75

85

95

105



どんどん増加していき


65

20


75

20


85

20


95

20


105

20



始点として


自分の弾の画像が描かれることになります


自分の弾のy座標は20のままなので


自分の弾は10ドットずつ水平に移動して表示されることになるね




62回目のwhile{}文のブロック{}内の命令文の繰り返しのとき


aの値は645になります


では


🧚🏻‍♀️62回目のwhile{}文のブロック{}内の命令文の繰り返しでは何が行われるかを見ていきましょう🧚🏻‍♀️


まず


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}


が実行されますが


Zボタンを押していて


key & PAD_INPUT_A



1になっても


aには1が代入されているので


if (1 == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;


a = 1;


}


となり


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;


a = 1;



は実行されません




Zボタンを押していなくて


key & PAD_INPUT_A



0になっても



if (a== 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;


a = 1;


}


は実行されないので


ブロック{}内の命令文


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;


a = 1;



は実行されません


次に


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


}



の実行に移ります


aには1が代入されているので


a == 1



1 == 1


となり


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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


が実行されることになります


このとき


実は

61回目のwhile{}文のブロック{}内の命令文の繰り返し実行のとき


jibunnotama.x

635

の値を持ち

jibunnotama.y

20の値を持つことになったので


635

20



始点として


自分の弾の画像が描かれることになります


ゲーム画面の幅は


640なので


ぎりぎり


ゲーム画面の外にはみ出しながら自分の弾の画像



表示されることになるね


次に



jibunnotama.x = jibunnotama.x + 10;


が実行されると


jibunnotama.x

645

の値を持ちます


今までどおり

jibunnotama.y

20の値をもったままです


さあ


いよいよ


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


が実行されることになります


jibunnotama.xは645の値を持っているので


jibunnotama.x > 640



645 > 640



1


となり


a = 0;


が実行されることになります」


マックス「おや?


aに0が代入されることになるのか?


ということは


次の63回目のwhile文の繰り返し実行のときは


           🌞また🌞



aに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) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}



if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


}


が実行されることになるのか?


ということは・・・


今までは


aに1が代入されていたので


Zボタンを押しても何も反応がなかったのが


aに0が代入されることにより


再び


Zボタンを押すと



if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


}




key & PAD_INPUT_A



16&16



1


となるので


if (key & PAD_INPUT_A) {}の


ブロック{}内の命令文


if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


が実行されることになる


aには0が代入されているので


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


が実行される




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



35

20



始点として


自分の弾の画像が描かれることになる




jibunnotama.x = jibunnotama.x + 10;


が実行されると


jibunnotama.x

45

の値を持つんだろう




次に


ScreenFlip();


の実行により


今まで裏画面に描かれた飛行機と自分の弾の画像がしばらくの間


表画面に表示された後


ClearDrawScreen();


の実行により


表画面と裏画面に描かれた飛行機と自分の弾の画像がすべて消去されることになる





2回目のwhile{}文のブロック{}内の命令文の繰り返しの回以降の回は



jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


は実行されず


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



だけが


ずっと


以下のように


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();


が実行されることになるわけだ


つまり



1回目のwhile{}文のブロック{}内の命令文の繰り返しのとき


Zボタンが押されていたなら


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



が実行され


あとの繰り返しの回は


Zボタンが押されている

Zボタンが押されていないにかかわらず


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



jibunnotama.x = jibunnotama.x + 10;


ScreenFlip();


ClearDrawScreen();



が実行されるので


自分の弾の画像が10ドットずつ


水平に横に移動しながら


表示され消える


ということが


また行われることになるわけだ



まあ まとめると


Zボタンを押して発射された弾が


ゲーム画面の外にでたなら


再び


Zボタンを押して


自分の弾を


発射できるってわけだ」


solarplexuss「へええ〜なるほどぉ〜」


ソーラー「そうなんです


そして


同様に


1回目でなくても


どこかのwhile文の繰り返し実行の回で


Zボタンを押すと


if (key & PAD_INPUT_A) {



if (a == 0) {


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}



jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;


a = 1;


が実行されて


aに1が代入されることになります


となると


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


}



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました



実行されることになります


jibunnotama.x > 640


が成立しない限り


その次のwhile文の繰り返し実行の回でも


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


}



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました



実行されることになります


次の次のwhile文の繰り返し実行の回でも


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


}



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



jibunnotama.x = jibunnotama.x + 10;


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました



実行されることになります


この後に続く


あるwhile文の繰り返し実行の回で



jibunnotama.x > 640


を満たすことにより


//👇この部分だけ付け加えました

if (jibunnotama.x > 640)


a = 0;

//👆この部分だけ付け加えました


のブロック内の命令文


a=0;



実行されて


aに


再び


0が代入されるようになるまでは


Zボタンを押しても


新たに自分の弾は発射されないんだよ


つまり


Zボタンを押して発射された弾が


ゲーム画面の外にでないと


再び


Zボタンを押して


自分の弾を


発射できるようにならないんだ」



solarplexuss「なんか


飛行機がゲーム画面の右の方の位置にいるときは


自分の弾が発射される間隔が短くて


飛行機がゲーム画面の左の方の位置にいるときは


自分の弾が発射される間隔が長くなって間延びしてない???


気のせいかな?」



ソーラー「うう」


マックス「もしや


最初


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


を実行したとき


飛行機がゲーム画面の右端の方にいる


すなわち


jibunnohikouki.xの位置が640に近いと


jibunnotama.x = jibunnotama.x + 10;



数回行われただけで


すなわち短い時間で


jibunnotama.x > 640


を満たし


aに0が代入されることになる


だから


Zボタンを押し続けている状態で


飛行機が画面の💕右端💕に近い位置にいると


ゲーム画面の外に自分の弾が出て行く時間は短くなるので


ゲーム画面の外に自分の弾が出て行ったあと


すぐに


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


だから


前に発射した自分の弾

次に発射する自分の弾


の間隔は短くなるわけだ




Zボタンを押し続けている状態で


飛行機がゲーム画面の💖左端💖の方にいる


すなわち


jibunnohikouki.xの位置が0に近いと


jibunnotama.x = jibunnotama.x + 10;



何回も行われて


すなわち


かなり時間がかかって


jibunnotama.x > 640


を満たし


aに0が代入されることになる


つまり


Zボタンを押し続けている状態で


飛行機が画面の左端に近い位置にいると


発射した自分の弾がゲーム画面の外に出るのに時間がかかるので


次の自分の弾が発射されるまでに


時間がかかることになるだろう


つまり


前に発射した自分の弾

次に発射する自分の弾


の間隔は長くなるわけだ」



ソーラー「う~わあ


すごいな


よく見抜いたね」






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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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