キーをおすと飛行機が望みの方向に移動するプログラムを作製してみよ~う
ソーラー「さて
今までは
飛行機が右に自動的にとんでいくプログラムを作製してきました
今日は
キーをおすと飛行機が望みの方向に移動するプログラムを作製してみよ~う」
マックス「そういえば
今までは
飛行機が
自動的に右にとんでいただけだったよなあ
今度は
↑キーを押したら
飛行機が上に
↓キーを押したら
飛行機が下に
→キーを押したら
飛行機が右に
←キーを押したら
飛行機が左に行く
みたいな感じにしたいんだろう
となると・・・
もし
→キーを押したならば
今 飛行機がいる位置から右の位置に
飛行機が移動するようにするには
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ドット移動することになります
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます