Bakinでグリッド移動がしたい

By Izna on Aug 15, 2024
RPG Developer Bakin 開発日誌 6日目画像部分

Bakinはマップがグリッド(マス目)になっているのでグリッド移動もできる仕様です。

一応エディタ側でもグリッド移動にできる仕組みはありますが今回は自分で作る方に焦点をあてていきます。

具体的な内容としてはサンプルの3Dダンジョンを読み込んで移動処理の部分をみてください。

グリッド移動の分析

まずはコモンイベント敵に書き起こしてみましょう。

このシートを実行する条件

  • 「移動禁止」スイッチがオフになっている

イベント実行タイプ

  • 自動的に開始(並列して繰り返し実行)

処理フロー

  • 移動の許可/禁止:プレイヤーの移動を禁止します
  • プレイヤーの移動スピードを変える:プレイヤーの移動スピードを-2に変更
  • 複雑な変数ボックスの操作:ローカル変数playerLockedに操作禁止(0=許可)を代入する
  • 変数ボックスの確認:ローカル変数playerLockedの中身が0と等しいとき
    • イベントスイッチのOn /OFF:変数StopPlayer_2_2をオンにする
    • 複雑な変数ボックスの操作:ローカル変数pressUPに操作キー「上」を代入
    • 複雑な変数ボックスの操作:ローカル変数pressDOWNに操作キー「下」を代入
    • 複雑な変数ボックスの操作:ローカル変数pressLEFTに操作キー「左」を代入
    • 複雑な変数ボックスの操作:ローカル変数pressRIGHTに操作キー「右」を代入
    • 複雑な変数ボックスの操作:ローカル変数pressDASHに操作キー「ダッシュ」を代入
    • 複雑な変数ボックスの操作:ローカル変数Angleにカメラ設定「Y回転」を代入
    • 変数ボックスの確認:ローカル変数pressUPの中身が0と異なるとき
      • ローカル変数Angleに180を足す
      • プレイヤーを歩かせる:ローカル変数Angle度の方向へ0.7マス歩く
      • プレイヤーの位置をグリッドに吸着する:プレイヤーの位置をグリッド中央に移動する
    • 上下左右分作る

移動許可とか速度とかは何度も動かす意味はないので初期化処理に置いたほうがいいですね。

キーが押されるまではループで監視しておいて、押されたら移動処理が発動。

移動が終わるまではループ処理しておいて操作させないようにするのがミソです。

グリッド移動の要

処理を追っていると移動方向に「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でも酔う)

©2024 あるてなそふと