以下はコード全体です。
#include "DxLib.h" // コマの横/縦数 #define FRAME_WIDTH 5 #define FRAME_HEIGHT 5 // コマの描画幅/高さ #define CELL_WIDTH 49 #define CELL_HEIGHT 66 // 描画マージン #define FIELD_MARGIN_X 50 #define FIELD_MARGIN_Y 50 typedef struct Player_t { int x; int y; int handle; } Player; // コマ(x,y)に外枠を描く[おまけ] int box_draw(int x, int y) { return DrawBox(x * CELL_WIDTH + FIELD_MARGIN_X, y * CELL_HEIGHT + FIELD_MARGIN_Y, (x + 1) * CELL_WIDTH + FIELD_MARGIN_X, (y + 1) * CELL_HEIGHT + FIELD_MARGIN_Y, GetColor(255, 255, 255), FALSE); } // コマ(x,y)に画像を描く int cell_draw(int x, int y, int handle) { return DrawGraph(x * CELL_WIDTH + FIELD_MARGIN_X, y * CELL_HEIGHT + FIELD_MARGIN_Y, handle, FALSE); } int Key[256]; // キーが押されているフレーム数を格納する // キーの入力状態を更新する int gpUpdateKey() { char tmpKey[256]; // 現在のキーの入力状態を格納する GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る for (int i = 0; i < 256; i++) { if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら Key[i]++; // 加算 } else { // 押されていなければ Key[i] = 0; // 0にする } } return 0; } void Player_update(Player* p) { int dx = 0; int dy = 0; if (Key[KEY_INPUT_RIGHT] == 1) { dx = dx + 1; p->handle = 2; } if (Key[KEY_INPUT_LEFT] == 1) { dx = dx - 1; p->handle = 1; } if (Key[KEY_INPUT_UP] == 1) { dy = dy - 1; p->handle = 5; } if (Key[KEY_INPUT_DOWN] == 1) { dy = dy + 1; p->handle = 11; } if (dx == 0 && dy == 0) { p->handle = 8; } /* 新たな位置へ移動可能であるならplayerの位置を更新する */ int newX = p->x + dx; int newY = p->y + dy; if (0 <= newX && newX < FRAME_WIDTH && 0 <= newY && newY < FRAME_HEIGHT) { p->x = newX; p->y = newY; } else { p->handle = 8; // 動けないなら正面を向く } } void Player_draw(const Player* p, const int* gh) { cell_draw(p->x, p->y, gh[p->handle]); } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SetGraphMode(1300, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); if (DxLib_Init() == -1) { return -1; } //グラフィックハンドル格納用配列 int gh[12]; LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh); Player player; player.x = FRAME_WIDTH / 2; player.y = FRAME_HEIGHT / 2; SetDrawScreen(DX_SCREEN_BACK); while (ProcessMessage() == 0) { gpUpdateKey(); Player_update(&player); // ここから表現 ClearDrawScreen(); for (int x = 0; x < FRAME_WIDTH; ++x) for (int y = 0; y < FRAME_HEIGHT; ++y) box_draw(x, y); Player_draw(&player, gh); ScreenFlip(); } DxLib_End(); return 0; }
各プログラムを解読したいと思い質問します。
1、
void Player_update(Player* p) { int dx = 0; int dy = 0; }
関数void Player_updateが引数に関数Player* pを持ってきて、int型の変数dxの値0とint型の変数dyの値0に引数である関数Player* pを渡すと思いますが、この関数Player* p自体が何を持った関数かなのかわからないのですが、なんでしょうか?①
2、
nt Key[256]; // キーが押されているフレーム数を格納する // キーの入力状態を更新する int gpUpdateKey() { char tmpKey[256]; // 現在のキーの入力状態を格納する GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る for (int i = 0; i < 256; i++) { if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら Key[i]++; // 加算 } else { // 押されていなければ Key[i] = 0; // 0にする } } return 0; }
関数gpUpdateKey()はchar tmpKey[256]// 現在のキーの入力状態を格納して、さらにtmpKey[256]によりメモリに収納した256のキーが関数GetHitKeyStateAllによりメモリにある収納した256のキーをキーボードで押すことで呼び出せるようになった。
これにより全てのキーの入力状態を得るのですが、そのあとに続くfor (int i = 0; i < 256; i++) は何のためにあるのでしょうか。
また、
{ if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたらKey[i]++; // 加算 }
tmpKeyは入力状態になりましたが、tmpKeyは「GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る」より、いつ256のキーを押されても反応できる状態である。そしてif (tmpKey[i])より押される準備をした256のキー中ののi番目(GetHitKeyStateAll(tmpKey);より押される準備をしている256のキーの何が押されても大丈夫なことを「if (tmpKey[i] != 0)② { // i番のキーコードに対応するキーが押されていたら」表します。ですが、そのあとの「Key[i]++; // 加算」は何を言っているのでしょうか?キーボードでi番のキーコードに対応するキーが押されていた後で、Key[i]++; // 加算」を行いう理由がわかりません。③
其のあとの
else { // 押されていなければ Key[i] = 0; // 0にする }
iに対応するキーを押さなかったら、0とありますが、押さないならば、何も起きないのでこの部分を書く必要があるのか疑問です④
} return 0; }
最後は異常が無ければ0が来る。
長くなりました。
以上のプログラムで疑問に起こったに関する答えがほしいです。もう一つはプログラムの流れが合っているかを確認して頂きたいです。
どうかよろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー