Bakinはマップがグリッド(マス目)になっているのでグリッド移動もできる仕様です。
一応エディタ側でもグリッド移動にできる仕組みはありますが今回は自分で作る方に焦点をあてていきます。
具体的な内容としてはサンプルの3Dダンジョンを読み込んで移動処理の部分をみてください。
まずはコモンイベント敵に書き起こしてみましょう。
移動許可とか速度とかは何度も動かす意味はないので初期化処理に置いたほうがいいですね。
キーが押されるまではループで監視しておいて、押されたら移動処理が発動。
移動が終わるまではループ処理しておいて操作させないようにするのがミソです。
処理を追っていると移動方向に「0.7」マス移動して
そのあとにグリッドに吸着する(中央に移動)があるのでこれが心臓部の処理となる。
player.move(false);
player.speed(-2);
l_playerLocked = 0;
if (playerLocked == 0) {
stopPlayer_2_2 = true;
l_playerUP = player.move.up;
l_playerDOWN = player.move.down;
l_playerLEFT = player.move.left;
l_playerRIGHT = player.move.rigtht;
if (pressUP != 0) {
player.move(0.7, UP);
} else if (pressDOWN != 0) {
player.move(0.7, DOWN);
} else if (pressLEFT != 0) {
player.move(0.7, LEFT);
} else if (pressRIGHT != 0) {
player.move(0.7, RIGHTwd);
}
}
エディタで作るイベントをそのまま書きおこすとちょっとわかりづらいですね。
上記の処理をプログラミング的に修正してみましょう。
public start() {
// 初期化処理
moving = false;
speed = 2.0f;
direct = NONE;
}
public update() {
// 移動中でなければキー監視
if (!moving) {
// キー入力を取得
int moveDirect = player.getMove();
// 押されてたら移動させる
if (moveDirect != 0)
{
moving = true;
}
// 方向を決める
switch(moveDirect) {
case move.Up:
direct = UP;
break;
case move.Down:
direct = Down;
break;
case move.Left:
direct = Left;
break;
case move.Right:
direct = Right;
break;
default:
direct = NONE;
}
}
else
{
// 移動中であれば位置を加算する
moveUp(speed);
// 一定の位置まで進んだら位置を補正してキー入力受付状態に戻す
if (player.center(0.7))
{
// プレイヤーをグリッドの真ん中に調整する
player.position.fix();
// 移動中フラグを折る
moving = false;
}
}
}
このコードはあくまでイメージです。
そのまま記述しても動きません。
簡単に説明するとキー入力を監視して上下左右どれか入力されたらその方向に動き続け、
グリッドの中央に近づいたら移動をやめてグリッドの真ん中に位置を補正する感じです。
こうすることで1回キーを操作することでグリッド移動が実装できます。
サンプルに3Dダンジョンというグリッド移動を再現してるものがあるので具体的な内容はそちらを参考にしてください。
ただ、一人称視点の仕様になっているので三人称視点でやると、
ブランディッシュみたいな視点になるので注意です(個人的に2Dでも酔う)