キーをおすと飛行機が望みの方向に移動するプログラムを作製してみよ~う

ソーラー「さて 


今までは


飛行機が右に自動的にとんでいくプログラムを作製してきました


今日は


キーをおすと飛行機が望みの方向に移動するプログラムを作製してみよ~う」


マックス「そういえば


今までは


飛行機が


自動的に右にとんでいただけだったよなあ


今度は


↑キーを押したら


飛行機が上に


↓キーを押したら


飛行機が下に


→キーを押したら


飛行機が右に


←キーを押したら


飛行機が左に行く


みたいな感じにしたいんだろう


となると・・・


もし


→キーを押したならば


今 飛行機がいる位置から右の位置に


飛行機が移動するようにするには


CheckHitKey関数をつかって


→キーが押されているかどうかを判定し


→キーが押されていると判定されたなら


DrawGraph関数を使って


今 飛行機がいる位置から右に何ドットか


そうだなあ


3ドット

4ドット

ずらした位置に


飛行機を表示すればいいんだろう?」


ソーラー「あおおう・・・


いきなり


核心をついてくるとは・・・」


solarplexuss「えっ もう


飛行機を動かす方法がわかったの?


まさか


今までの知識を使えば


キーボードからの入力によって


自由な方向に飛行機を動かせるようになるのおう???」


マックス「ふはは


たぶんできるぞ!


じゃあ早速


飛行機を動かすプログラムをつくってみるか・・・




ここをこうしてだな・・・



ふ~む


そこはこうだ!


うひゃひゃ


あちょ~~~


ふはは完成だ


↑キーを押したら


飛行機が上に


↓キーを押したら


飛行機が下に


→キーを押したら


飛行機が右に


←キーを押したら


飛行機が左に行くようにするプログラムはこれだ」

👇


#include "DxLib.h"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}


int graphichandle;


graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");



SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です



int x = 0;


int y = 0;



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


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);



if (CheckHitKey(KEY_INPUT_UP))y = y - 4;

if (CheckHitKey(KEY_INPUT_DOWN))y = y + 4;

if (CheckHitKey(KEY_INPUT_LEFT))x = x -4;

if (CheckHitKey(KEY_INPUT_RIGHT))x = x + 4;




DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


};



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


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

}


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

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


👇

https://www.youtube.com/watch?v=6FR882yO4Pg


solarplexuss「飛行機を動かすことができてる・・・」


マックス「このプログラムの仕組みはな・・


int graphichandle;


graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");


が実行されると何がおこるかというと


LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp")


の実行により


ソーラーが描いた飛行機.bmpファイルに保存されている画像データがメモリに読み込まれ


その画像データに割り当てられた番号が


LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp")に戻り値として返される


そして


graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");


により


画像データに割り当てられた番号がgraphichandleに代入されるわけだ」




(註1 この番号を用いて飛行機の画像がゲーム画面に表示されることになります)


(註2 ソーラーが描いた飛行機.bmpファイルに保存されている画像データ



四角い領域の中に飛行機が描かれています


この四角い領域全部が画像データとなります


飛行機が描かれている部分だけが画像データなのではありません


四角い領域全部が画像データなので


画像データは四角形となります


ですので


ソーラーが描いた飛行機.bmpファイルに保存されている画像データは


四角形なので


左上、右上、右下、左下


4つの頂点を持つことになります)





マックス「次に


SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です


の実行により


これから表示する画像はすべて裏画面に描かれることになる


でだ


ソーラーが描いた飛行機.bmpファイルに保存されている画像データ



ゲーム画面に表示されることになるが


まず


どの位置に表示させたらいいか?


となるだろう?」


solarplexuss「ふむふむ」


マックス「


int x = 0;


int y = 0;


が実行されているだろう


x

y

には


0が代入されている


次に


       😊while{}文のブロック{}内の命令文の1回目の実行に移る😊


まず


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


の実行により


青い四角形が



if (CheckHitKey(KEY_INPUT_UP))y = y - 4;

if (CheckHitKey(KEY_INPUT_DOWN))y = y + 4;

if (CheckHitKey(KEY_INPUT_LEFT))x = x -4;

if (CheckHitKey(KEY_INPUT_RIGHT))x = x + 4;


が実行されると


if (CheckHitKey(KEY_INPUT_UP))y = y - 4;

if (CheckHitKey(KEY_INPUT_DOWN))y = y + 4;

if (CheckHitKey(KEY_INPUT_LEFT))x = x -4;

if (CheckHitKey(KEY_INPUT_RIGHT))x = x + 4;


の実行前に



↑キーが押されているとyの値が4減りyの値は-4になる

↓キーが押されているとyの値が4増えyの値は4になる

←キーが押されているとxの値が4減りxの値は-4になる

→キーが押されているとxの値が4増えxの値は4になるわけだ


だが


何もキーが押されていないと


yの値が4減ることもなく

yの値が4増えることもなく

xの値が4減ることもなく

xの値が4増えることもない


だから

xの値は0

yの値は0


のままだ」


solarplexuss「なんで


x,y


がでてきたの?


この


x,yってなんのためにあるの?」



マックス「


それはな


次の命令文


DrawGraph(x,y,graphichandle, TRUE);


が関係してくるのだ


DrawGraph(x,y,graphichandle, TRUE);


が実行されると



ソーラーが描いた飛行機.bmpファイルに保存されている画像データは


ソーラーが描いた飛行機.bmpファイルに保存されている画像データの左上の頂点



(x,y)の点になるような位置に描かれるのだ(*´▽`*)」


その様子を示す画像はこちらです

👇


https://solalion.blogspot.com/2021/08/blog-post_19.html


👆

(今の状態では

ソーラーが描いた飛行機.bmpファイルに保存されている画像データは裏画面に描かれることになります)


マックス「


DrawGraph(x,y,graphichandle, TRUE);



xはソーラーが描いた飛行機.bmpファイルに保存されている画像データの左上の頂点の横座標の位置


yはソーラーが描いた飛行機.bmpファイルに保存されている画像データの左上の頂点の縦座標の位置


に対応しているんだ




int x = 0;


int y = 0;


が実行されていて


x

y

には


0が代入されているだろう


そして


if (CheckHitKey(KEY_INPUT_UP))y = y - 4;

if (CheckHitKey(KEY_INPUT_DOWN))y = y + 4;

if (CheckHitKey(KEY_INPUT_LEFT))x = x -4;

if (CheckHitKey(KEY_INPUT_RIGHT))x = x + 4;


が実行されているが


もし


if (CheckHitKey(KEY_INPUT_UP))y = y - 4;

if (CheckHitKey(KEY_INPUT_DOWN))y = y + 4;

if (CheckHitKey(KEY_INPUT_LEFT))x = x -4;

if (CheckHitKey(KEY_INPUT_RIGHT))x = x + 4;


の実行前に


↑キーが押されているとyの値が4減り

↓キーが押されているとyの値が4増え

←キーが押されているとxの値が4減り

→キーが押されているとxの値が4増えるわけだ


う~む


たとえば


もし


if (CheckHitKey(KEY_INPUT_UP))y = y - 4;

if (CheckHitKey(KEY_INPUT_DOWN))y = y + 4;

if (CheckHitKey(KEY_INPUT_LEFT))x = x -4;

if (CheckHitKey(KEY_INPUT_RIGHT))x = x + 4;


の実行前に


↓キーが押されているとyの値が4増えるだろう


xの値は0のままだ



DrawGraph(x,y,graphichandle, TRUE);


が実行されると


ソーラーが描いた飛行機.bmpファイルに保存されている画像データは



ソーラーが描いた飛行機.bmpファイルに保存されている画像データの左上の頂点



(0,4)の点になるような位置に描かれるわけだ


そのことを示す画像はこちらです

👇

https://solalion.blogspot.com/2021/08/blog-post_96.html



(👆この画像の


           🌞🌞🌞注目ポイントは🌞🌞🌞


通常のxy座標では


上に行けばいくほどyの値は大きくなりますが


この画像のように


ゲーム画面においては


下に行けば行くほど


yの値がおおきくなるということなのです)


だが


何もキーが押されていないと


yの値が4減ることもなく

yの値が4増えることもなく

xの値が4減ることもなく

xの値が4増えることもないわけだ


x

y

には


0が代入されているので



ソーラーが描いた飛行機.bmpファイルに保存されている画像データは



ソーラーが描いた飛行機.bmpファイルに保存されている画像データの左上の頂点



(0,0)の点になるような位置に描かれるわけだ


solarplexuss「にゃるほどね」


マックス「ここでは


もし


if (CheckHitKey(KEY_INPUT_UP))y = y - 4;

if (CheckHitKey(KEY_INPUT_DOWN))y = y + 4;

if (CheckHitKey(KEY_INPUT_LEFT))x = x -4;

if (CheckHitKey(KEY_INPUT_RIGHT))x = x + 4;


の実行前に


↓キーが押されていたとしようではないか


そのときxの値は0のままだ



DrawGraph(x,y,graphichandle, TRUE);


が実行されると


ソーラーが描いた飛行機.bmpファイルに保存されている画像データは



ソーラーが描いた飛行機.bmpファイルに保存されている画像データの左上の頂点



(0,4)の点になるような位置に描かれるわけだ




そして


ScreenFlip();


の実行により


裏画面に描かれた画像が


そのまま


ある一定の時間の間


表画面に表示される


そして


ClearDrawScreen();


の実行により


表画面の画像と裏画面の画像が消去される


これで


1回目のwhile{}文のブロック{}内の命令文の実行の終了だ



1回目のwhile{}文のブロック{}内の命令文の実行により


飛行機は4ドット下に表示されることになった


つまり


飛行機は下に4ドット移動することになったわけだ」




😊   😊   😊   😊   😊   😊


以下


2回目のwhile{}文のブロック{}内の命令文の実行


3回目のwhile{}文のブロック{}内の命令文の実行


えんえんと


while{}文のブロック{}内の命令文の実行が


つづいていきます


ある回のwhile{}文のブロック{}内の命令文


if (CheckHitKey(KEY_INPUT_UP))y = y - 4;

if (CheckHitKey(KEY_INPUT_DOWN))y = y + 4;

if (CheckHitKey(KEY_INPUT_LEFT))x = x -4;

if (CheckHitKey(KEY_INPUT_RIGHT))x = x + 4;


の実行前に


↑キーが押されているとyの値が4減り


飛行機の画像データは


上に移動4ドット移動することになります



↓キーが押されているとyの値が4増え


飛行機の画像データは


下に4ドット移動することになります



←キーが押されているとxの値が4減り


飛行機の画像データは


左に4ドット移動することになります


→キーが押されているとxの値が4増え


飛行機の画像データは


右に4ドット移動することになります

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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