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発しか発射できない超強力な弾を発射するときに
使えたりして😃」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます