Ouxiy さんが書きました: ↑4年前
以下はキーボードを用いてキャラクターを動かす関数のプログラムです
違います。
gpUpdateKey は、すべてのキーボードの押下状態を取得する関数です。
・キー i が押されていないと、Key[ i] の値は 0。
・キー i が押されていると、Key[ i] の値は押されてからのフレーム数。
gpUpdateKey は、キャラクターを動かす関数ではありません。
キャラクターを動かすのは、gpUpdateKey で取得した Key[ i] の値を見て、
キャラクターの表示位置と表示画像を変更し、DrawGraph で描画を行う
while ループ内のコードです。
なぜ、こんな当たり前のことが分からないのか不思議です。
Ouxiy さんが書きました: ↑4年前
★行い事
このコードがなぜこのように書けるのかわかりやすく教えてほしいです。
このプログラムによってPCの中で何が起こっているのかを教えて頂けると嬉しいです。
なぜこのようにしなくてはキーボードを利用してキャラが動かせないのか。
GetHitKeyStateAll も GetHitKey もキーの押下状態を
・キーが押されていたら 1
・キーが押されていなかったら 0
で表すだけです。
次のプログラムを実行してみてください。
コード:
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
//ウィンドウモード変更、DXライブラリ初期化、裏画面設定
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
int x = 0;
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
while (ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0) {
DrawFormatString(x, 20, GetColor(255, 255, 255), "%3d ", x);
if (CheckHitKey(KEY_INPUT_RIGHT) != 0) x += 10;
if (CheckHitKey(KEY_INPUT_LEFT) != 0) x -= 10;
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
右キーを押すと、キャラクターが右に 10ドット移動するように作ったつもりです。
キャラクターとして現在位置を表示することにしています。
さあ、右キーを押してみてください。10ずつ進みますか?
50 とか 60 進みませんか? なぜだかわかりますか?
WinMain の ProcessMessage の whileループは、1秒間に 60回実行されます。
人間がキーを押して離すのに 0.1秒ぐらいかかります。
その間に 6フレーム分の時間が経過します。
キーが押されているのが 6回検出されたら、キャラクタは 60 進みます。
これでは困ります。
そこで、gpUpdateKey関数を書いたのです。
この関数により、Key[KEY_INPUT_RIGHT] の値は、
0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0. 0, ... と変化します。
・最初の 0 は、キーが押される前の値。
・1 は、キーが押された直後の値。
・2~6 は、キーが押されている間の値。
・その後の 0 はキーが離された後の値。
whileループでは、Key[KEY_INPUT_RIGHT] が 1 かどうかを見るだけで、
右キーが 1回押されたことを検出できるのです。
それから、
フォーラム(掲示板)ルールをよく読んでください。
複数の掲示板で質問する時は、そのことを明示しなければなりません。