地上の洞窟

どこにも行かず、液晶と「にらめっこ」し続ける人の物語。

【RGSS3】壁抜け無し8方向移動

壁抜け無し8方向移動
シンプルかつ自然(?)な8方向移動!

プレイヤーが8方向に移動できるようになるスクリプトです。
壁を斜めにすり抜けてしまうと描画が不自然になるため、
その場合、斜め移動は不可能と判断し、直線方向への移動を試みます。

イベントの起動判定などについては、処理が重そうなので手を付けていません。悪しからず。


更新履歴 内容
2023/08/26 初版

→スクリプト一覧へ


スクリプト(ダブルクリックで全選択)↓

=begin =========================================================================
 ■ 「壁抜け無し8方向移動」- NTWMoveDir8 by 地上の洞窟
================================================================================
  
  プレイヤーが8方向移動できるようになるスクリプトです。
  壁を斜めにすり抜けてしまうような場合は通行不可と判定します。
  また、斜め移動に失敗した場合でも、直線方向への移動を試みます。

================================================================================
 ■ ここからソースコード
=end #==========================================================================

class Game_Player < Game_Character
  # ☆ 再定義
  def move_by_input
    return if !movable? || $game_map.interpreter.running? || (d = Input.dir8) == 0
    if d[0] == 0
      move_straight(d) # 2, 4, 6, 8
    else
      case d
      when 1
        horz = 4
        vert = 2
      when 3
        horz = 6
        vert = 2
      when 7
        horz = 4
        vert = 8
      when 9
        horz = 6
        vert = 8
      end

      x2 = $game_map.round_x_with_direction(@x, horz)
      y2 = $game_map.round_y_with_direction(@y, vert)
      c3 = (c1 = passable?(@x, @y, vert)) && passable?(@x, y2, horz)
      c4 = (c2 = passable?(@x, @y, horz)) && passable?(x2, @y, vert)
      
      if c3 && c4
        move_diagonal(horz, vert)
      elsif @lc3 && c2
        move_straight(horz)
      elsif @lc4 && c1
        move_straight(vert)
      elsif c1
        move_straight(vert)
      elsif c2
        move_straight(horz)
      end

      @lc3 = c3
      @lc4 = c4
    end
  end
end