今回はRPGとかでキャラがスイーといってピタッて止まるやつを作りたいと思います。
どういうことかというとこういうこと、RPGのキャラをマス目へ瞬間移動のように動くのではなく、スイーっと滑らかに進んで、キーボードから手が離れたらマス目上にピタッと止まるようなプログラムを書きたいということです。
まず変数として、プレイヤーのドット単位でのx,y座標を用意しましょう。
今回は適当にPlayerX,PlayerYとでもしておきます。
そして、そのほかにMoveX,MoveYという変数も作っておきます。
定数として、マップチップのサイズ(ドット)も用意しましょう
次に、キーボードからの入力を取りましょう。
DXライブラリでキーボードの入力をとる方法は、
char KeyStateBuf[256];
と変数を宣言し、キーボードの入力をとる関数の中に
GetHitKeyStateAll(KeyStateBuf);
と書きましょう
そしたら、if文でどのキーが押されたを判定しましょう。今回は上下左右のキーを使うので、
if (KeyStateBuf[KEY_INPUT_LEFT] == 1) {
MoveX = -CHIP_SIZE;
}
else if (KeyStateBuf[KEY_INPUT_UP] == 1) {
MoveY = -CHIP_SIZE;
}
else if (KeyStateBuf[KEY_INPUT_RIGHT] == 1) {
MoveX = CHIP_SIZE;
}
else if (KeyStateBuf[KEY_INPUT_DOWN] == 1) {
MoveY = CHIP_SIZE;
}
としましょう。そうしたら、だんだんとPlayerX,Yに値を足していきたいので、別の関数を作ります
int sign(int _x) {
if (_x == 0)return 0;
if (_x < 0)return -4;
if (_x > 0)return 4;
}
僕はこうやって書きました。signというのはjavascriptにある命令の名前を持ってきました。
そして、またキー入力をとる関数に戻り、
PlayerX += sign(MoveX);
PlayerY += sign(MoveY);
MoveX -= sign(MoveX);
MoveY -= sign(MoveY);
と書くことによって無事に滑らかに動かすことができました!
また、強制的に動きを止めたい場合は、if文が終わった後に
MoveX = MoveY = 0;
と書けばいいです。
さらに、障害物に当るような方向に矢印キーが押されたとき、動かないようにするためには、PlayerMapAfterXとPlayerMapAfterYという変数を新たに作り、if文の後に
PlayerMapAfterX = (PlayerX + MoveX) / CHIP_SIZE;
PlayerMapAfterY = (PlayerY + MoveY) / CHIP_SIZE;
と書いてあげて、当たり判定がある配列のPlayerMapAfterXとPlayerMapAfterYの座標が1(壁など)ならばMoveXとMoveYを0にすればいいです。
ここまでありがとうございました!
追記:キーの入力をとるif文をif (MoveX = 0 || MoveY = 0)の中に入れる必要がありました
そして、当たり判定のところで、PlayerMapAfterXとYが0以上の時のif文の中に入れる必要がありました