スクリプト/RPG汎用関数/カメラ移動関数(履歴ID:447)

最終投稿者:Material 6858 mini akasata 更新:2013/02/20 19:56:40

smart_move_camera関数


ゲームタイプ利用
2DアクションRPGYes
2DRPGYes
ノベルゲームNo


移動先、移動にかかる秒数、マップの幅と高さを指定するとその場所にカメラが移動します。

使用する前の準備


開始スクリプトに以下のコードを指定してください。

def max(a, b)
  if a < b
    return b
  else
    return a
  end
end

def min(a, b)
  if a > b
    return b
  else
    return a
  end
end

def bind_camera_x(x, map_width)
  return min(max(x, 256), map_width - 256)
end

def bind_camera_y(y, map_height)
  return min(max(y, 192), map_height - 192)
end

# x, y: カメラの移動先(マス目)
# sec: 移動にかける秒数
# map_width, map_height: マップの幅と高さ(デフォルトは32,32)
def smart_move_camera(x, y, sec, map_width, map_height)
  count = sec * 20
  cx = bind_camera_x(getPlayerPosX(), map_width * 32)
  cy = bind_camera_y(getPlayerPosY(), map_height * 32)
  dx = (bind_camera_x(x * 32 + 16, map_width * 32) - cx) / count
  dy = (bind_camera_y(y * 32 + 16, map_height * 32) - cy) / count
  i = 0

  while i < count
    cx = cx + dx
    cy = cy + dy
    moveCamera(true, cx, cy)
    waitTime(50)
    i = i + 1
  end
end


イベントでの利用コード例


speak("カメラを移動するよ。2秒で、だ。")
# カメラの移動先:10, 13
# 移動にかかる時間:2秒
# マップの幅と高さ:32,32
smart_move_camera(10, 13, 2, 32, 32)
speak("カメラを移動完了!")


解説 - 基本的な考え方


※ 以下、興味のある人だけ読んでください。

※ この記事を理解するためには、中学1年で習う方程式の理解が必要かもしれません。

この関数は、カメラを指定した位置に、指定した秒数で滑らかに移動するものです。
滑らかに移動するために、1秒間に20回カメラを動かすことにします。

つまり、以下のような方程式ができます。

指定した秒数×20回×1回あたりの移動量=移動したい距離

仮に、指定した秒数が2秒なら、2秒×20回で40回カメラの移動を行うことになります。

1回あたりの移動量=移動したい距離÷(指定した秒数×20回)

移動したい距離は、プレイヤーキャラクタの現在地と移動先の座標の差で計算することができます。

移動したい距離X=移動先X座標 - 現在地X座標
移動したい距離Y=移動先Y座標 - 現在地Y座標

さて、移動したい距離が計算できるということは、1回あたりの移動量がわかるということです。

仮に、指定した秒数が2秒なら、2秒×20回で40回、カメラの位置を1回あたりの移動量分移動させれば、カメラを指定した秒数で滑らかに移動することができます。

以下、解説を付け加えたsmart_move_camera関数です。

def smart_move_camera(x, y, sec, map_width, map_height)
  # 指定した秒数×20回
  count = sec * 20
  
  # プレイヤーキャラクタの現在地の取得
  # bind_camera_x, bind_camera_y関数は、カメラがマップの外側にはみ出ないようにするためのものです
  cx = bind_camera_x(getPlayerPosX(), map_width * 32)
  cy = bind_camera_y(getPlayerPosY(), map_height * 32)

  # 移動したい距離の計算
  dx = (bind_camera_x(x * 32 + 16, map_width * 32) - cx) / count
  dy = (bind_camera_y(y * 32 + 16, map_height * 32) - cy) / count
  i = 0

  # 指定した秒数×20回、カメラの位置を1回あたりの移動量分移動させる
  while i < count
    cx = cx + dx
    cy = cy + dy
    moveCamera(true, cx, cy)

    # これを入れないと、早く動きすぎたり、滑らかに動かなかったりします
    waitTime(50)
    i = i + 1
  end
end



改善してみよう


  • 【初級者向け】waitTimeをコメントアウト(先頭に#をつける)してみよう。何が起こるか、わかった人はコメントして!
  • 【初級者向け】長い距離を移動させるとカクカクするかもしれません。1秒当たりの移動回数を増やせば改善するかも?
  • 【上級者向け】動き始めはゆっくりと、だんだん早くなって目的地が近づいたらまたゆっくりになると、スムーズで気持ちのいいカメラ移動が実現できるかも?