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

飛行機から自分の弾を1発だけ発射させるプログラムを構成してみよう

つづきです



ソーラー「それでは


なにかボタンを押したときだけ


飛行機の近くに


弾が表示されるようにしてみましょう


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

👇

👇

👇solarplexuss「え、もう完成したの?」

👇

👇


#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のメンバ変数の初期化を行っています



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


DrawGraph(jibunnohikouki.x+35, jibunnohikouki.y+20, jibunnotama.graphichandle, TRUE);


}


ScreenFlip();


ClearDrawScreen();


};



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


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

}


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

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

👇


https://youtu.be/m9YYUA_Mx3Q



マックス「


ついに


Zボタンを押したときだけ


自分の弾が表示されるようになった!」


solarplexuss「あとは


飛行機の近くに止まって表示されている自分の弾


を発射する方法を考えればいいんだね」



マックス「どうするか・・・か・・・


くくく・・


俺の腕前の見せ所だな」



solarplexuss「Zボタンを押したときに


自分の弾が発射されるようにすればいいんだから・・・


そうだなあ


攻略しがいがあるなあ


わくわくするなあ😊


うちの知性のみせどころなのだ」


ソーラー「はい 


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


こちらです

👇」


マックス「え?」


solarplexuss「え?」






#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



マックス「なにぃ~」


solarplexuss「ええ~?


今 自分の弾を飛ばす方法を絶賛考え中だったのに〜


もうん ちょっとはや~い」


ソーラー「へへ😊」


solarplexuss「ゲーム画面内で


自分の弾が発射されているんだけど


なに? このプログラム


どういう仕組みになってるのぉ


int a=0;


ってなんで


int型の変数aが登場してくるの?」


マックス「そうだな


プログラムの中で


ところどころ


変数aが登場してくるなあ


なんじゃらほい?」



ソーラー「それでは


プログラムを詳しくみていきましょう


このプログラムの


注目ポイントはこの部分かな

👇


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


};



ソーラー「int a = 0;



続く命令文はwhile{}文だね


while{

ではじまり

};


で終わっているね


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0)



条件式

CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0



1


を満たせば


while{}文のブロック{}内の命令文が繰り返し行われることになります


具体的には


以下のように命令文が行われることになります

👇


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





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


//👇🌞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);





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



//👇🌞3回目の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);





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


以下


while{}文のブロック{}内の命令文の繰り返しが無限に続きます」



マックス「なんだ~


なにがおこなわれてるのか


全然わからんん」


solarplexuss「いったい、これは何がおこなわれているの?」


ソーラー「


まず


int a = 0;


が実行されているね


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


この変数aは


         😊フラグを立てるために用意されました😊



マックス「フラグぅ?」


ソーラー「フラグを立てる


とは


どういうことか


知りたい方は


天国にいけるC言語入門ヘキサ構造体


フラグをたてる(ある定められた条件を満たす)とは ある事柄がおこるような🌞条件🌞が定まっている場合 その🌞条件🌞を満たすということなのです



エピソードをご覧ください


そのアドレスはこちらです

👇

https://kakuyomu.jp/works/1177354054881541503/episodes/16816452219679158575



solarplexuss「そ,そこをなんとか いますぐ説明して


・・」


ソーラー「わかりました


int a = 0;


を実行して


        🌞int型の変数a🌞を🌞作製したのは🌞


     int型の変数aに代入される値によって


実行される命令文を


選択するためなんです」


solarplexuss「ホワット?」


ソーラー「はは


具体的には


次のように


2つのif文が用意されているとします



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


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



aの値が0


をもつならば


命令文1;


が実行され


aの値が1


をもつならば


命令文2;


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



命令文1;


が実行されるように


aの値に0を代入することを


命令文1;


が実行されるための


フラグをたてる


といいます



命令文2;


が実行されるように


aの値に1を代入することを


命令文2;


が実行されるための


フラグをたてる


といいます


どう😊 みんな わかったかな?」



マックス「え? フラグをたてるって


ただそれだけのことなのか?」


ソーラー「そうなんです


それが分かったところで


👇


今の命令文をみていきましょう

👇


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





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


//👇🌞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);





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



//👇🌞3回目の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);





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


以下


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


の実行により


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



次に


いよいよ


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;


}


}


となり


ブロック{}内の命令文



jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


}


は実行されません


このとき


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


次に


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


}



が実行されます



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


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


}



if (0 == 1){



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



jibunnotama.x = jibunnotama.x + 10;


}



if (0){



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



jibunnotama.x = jibunnotama.x + 10;


}



となるので


ブロック{}内の命令文



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



jibunnotama.x = jibunnotama.x + 10;



は実行されません



ですので


裏画面に


jibunnotama.x

jibunnotama.y



始点として


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



次に


ScreenFlip();


の実行により


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


表画面に表示された後


ClearDrawScreen();


の実行により


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



つまり


キーボードからの入力に応じて


飛行機の画像が表示されても


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


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



マックス「よく忘れるんだが


いったん表画面と裏画面に描かれた画像は


ClearDrawScreen();


によって


消去されるんだよなあ」


ソーラー「


そう


表画面と裏画面に描かれた画像は一度消去されることになります


今はキーボードの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には


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の値を持ち


jibunnotama.y は jibunnohikouki.y + 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;


}



が実行されます



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


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


}



if (1){



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



jibunnotama.x = jibunnotama.x + 10;


}



となるので


ブロック{}内の命令文


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



jibunnotama.x = jibunnotama.x + 10;



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



ですので


裏画面に


jibunnotama.x

jibunnotama.y



始点として


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


そして


jibunnotama.x = jibunnotama.x + 10;


により


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


増えることになります


次に


ScreenFlip();


の実行により


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


表画面に表示された後


ClearDrawScreen();


の実行により


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




さあ


今度は


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


の実行により


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



次に


いよいよ


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;


が実行された場合は


その後


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

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


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


solarplexuss「ふ~ん


1回目のwhile{}文の実行の時


Zボタンを押したら


2回目のwhile{}文の実行の時以降


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

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


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



ソーラー「



次に



if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


}



の実行ですね



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


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


}



if (1){



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



jibunnotama.x = jibunnotama.x + 10;


}



となるので



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



jibunnotama.x = jibunnotama.x + 10;


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



ですので


裏画面に


jibunnotama.x

jibunnotama.y



始点として


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



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


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


jibunnotama.x = jibunnohikouki.x + 35;


jibunnotama.y = jibunnohikouki.y + 20;



a = 1;


の実行により


jibunnotama.x

jibunnotama.y



始点として


つまり


jibunnohikouki.x + 35


jibunnohikouki.y + 20



始点として


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


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


jibunnotama.x = jibunnotama.x + 10;


が実行されていたので


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


jibunnohikouki.x + 35に10を足した


jibunnohikouki.x + 45


jibunnohikouki.y + 20



始点として


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


つまり


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


以下同様に


さらに


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


jibunnohikouki.x + 45に10を足した


jibunnohikouki.x + 55


jibunnohikouki.y + 20



始点として


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


さらに


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


jibunnohikouki.x + 55に10を足した


jibunnohikouki.x + 65


jibunnohikouki.y + 20



始点として


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


こうして


Zボタンを押したなら


自分の弾の画像は水平に発射されることになります」


solarplexuss「あ、あのお


このプログラム


Zボタンを押したら


自分の弾を1発


水平に発射することができるんだけど


あと


Zボタンを連打しても


弾が発射されないんだけど・・・」


ソーラー「そうなんです


なぜかというと


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


aに0が代入されている状態でしたね


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;


}



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



jibunnotama.x = jibunnotama.x + 10;


が実行されることになるね


aに1が代入されているのがポイントだよ


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


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



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

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;


は実行されず


次に


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


}



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



jibunnotama.x = jibunnotama.x + 10;


が実行されることになるね


再び

aに1が代入されているのに注目だよ


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




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



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

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;


は実行されず


次に


if (a == 1){



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



jibunnotama.x = jibunnotama.x + 10;


}



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



jibunnotama.x = jibunnotama.x + 10;


が実行されることになるね


4回目以降の繰り返しの回でも同様のことが行われます




つまり



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


Zボタンを押したなら


aに1が代入されることになるので


あとは


Zボタンが押されている

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


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



jibunnotama.x = jibunnotama.x + 10;



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


まとめると


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

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

3回目の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();



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


solarplexuss「


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



が繰り返し実行され続けてる!」



マックス「つまり


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


Zボタンを押したなら


あとは


Zボタンが押されている

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


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


横に移動しながら


表示され


消える


ということが


ずっとえんえんと行われるというわけだ


これだと


2発目の自分の弾が発射されることはなさそうだなあ



ソーラー「逆に言えば


飛行機から


自分の弾を


1発しか


発射したくないときはこのプログラムでもいいんだね」


solarplexuss「1発しか発射できない超強力な弾を発射するときに


使えたりして😃」







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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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