じ☆ve冰风 发表于 2024-4-19 20:17:52

八方向行走图(不影响4方)

其实不是什么特别好的东西,只是见到RM大师天干宝典中的八方行走图,连4方行走图都要拉长,很不方便,于是......
素材在XAS里弄得,找不到XAS的八方脚本,只好自己改......

脚本■ Game_Character3#==============================================================================# ■ Game_Character (分割定义 3)#------------------------------------------------------------------------------#  处理角色的类。本类作为 Game_Player 类与 Game_Event# 类的超级类使用。#==============================================================================class Game_Character#--------------------------------------------------------------------------# ● 向下移动#   turn_enabled : 本场地位置更改许可标志#--------------------------------------------------------------------------def move_down(turn_enabled = true)    # 面向下    if turn_enabled      turn_down    end    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面###########################################################################      @direction = 2###########################################################################    end    # 可以通行的场合    if passable?(@x, @y, 2)      # 面向下      turn_down      # 更新坐标      @y += 1      # 增加步数      increase_steps    # 不能通行的情况下    else      # 接触事件的启动判定      check_event_trigger_touch(@x, @y+1)    endend#--------------------------------------------------------------------------# ● 向左移动#   turn_enabled : 本场地位置更改许可标志#--------------------------------------------------------------------------def move_left(turn_enabled = true)    # 面向左    if turn_enabled      turn_left    end    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面###########################################################################      @direction = 4###########################################################################    end    # 可以通行的情况下    if passable?(@x, @y, 4)      # 面向左      turn_left      # 更新坐标      @x -= 1      # 增加步数      increase_steps    # 不能通行的情况下    else      # 接触事件的启动判定      check_event_trigger_touch(@x-1, @y)    endend#--------------------------------------------------------------------------# ● 向右移动#   turn_enabled : 本场地位置更改许可标志#--------------------------------------------------------------------------def move_right(turn_enabled = true)    # 面向右    if turn_enabled      turn_right    end    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面###########################################################################      @direction = 6###########################################################################    end    # 可以通行的场合    if passable?(@x, @y, 6)      # 面向右      turn_right      # 更新坐标      @x += 1      # 增加部数      increase_steps    # 不能通行的情况下    else      # 接触事件的启动判定      check_event_trigger_touch(@x+1, @y)    endend#--------------------------------------------------------------------------# ● 向上移动#   turn_enabled : 本场地位置更改许可标志#--------------------------------------------------------------------------def move_up(turn_enabled = true)    # 面向上    if turn_enabled      turn_up    end    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面###########################################################################      @direction = 8###########################################################################    end    # 可以通行的情况下    if passable?(@x, @y, 8)      # 面向上      turn_up      # 更新坐标      @y -= 1      # 歩数増加      increase_steps    # 不能通行的情况下    else      # 接触事件的启动判定      check_event_trigger_touch(@x, @y-1)    endend#--------------------------------------------------------------------------# ● 向左下移动#--------------------------------------------------------------------------def move_lower_left    # 没有固定面向的场合    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面###########################################################################      @direction = 1###########################################################################    end    # 下→左、左→下 的通道可以通行的情况下    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))      # 更新坐标      @x -= 1      @y += 1      # 增加步数      increase_steps    endend#--------------------------------------------------------------------------# ● 向右下移动#--------------------------------------------------------------------------def move_lower_right    # 没有固定面向的场合    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面###########################################################################      @direction = 3###########################################################################    end    # 下→右、右→下 的通道可以通行的情况下    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or       (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))      # 更新坐标      @x += 1      @y += 1      # 增加步数      increase_steps    endend#--------------------------------------------------------------------------# ● 向左上移动#--------------------------------------------------------------------------def move_upper_left    # 没有固定面向的场合    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面###########################################################################      @direction = 7###########################################################################    end    # 上→左、左→上 的通道可以通行的情况下    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))      # 更新坐标      @x -= 1      @y -= 1      # 增加步数      increase_steps    endend#--------------------------------------------------------------------------# ● 向右上移动#--------------------------------------------------------------------------def move_upper_right    # 没有固定面向的场合    unless @direction_fix      # 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面###########################################################################      @direction = 9###########################################################################    end    # 上→右、右→上 的通道可以通行的情况下    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or       (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))      # 更新坐标      @x += 1      @y -= 1      # 增加步数      increase_steps    endend#--------------------------------------------------------------------------# ● 随机移动#--------------------------------------------------------------------------def move_random    case rand(4)    when 0# 向下移动      move_down(false)    when 1# 向左移动      move_left(false)    when 2# 向右移动      move_right(false)    when 3# 向上移动      move_up(false)    endend#--------------------------------------------------------------------------# ● 接近主角#--------------------------------------------------------------------------def move_toward_player    # 求得与主角的坐标差    sx = @x - $game_player.x    sy = @y - $game_player.y    # 坐标相等情况下    if sx == 0 and sy == 0      return    end    # 求得差的绝对值    abs_sx = sx.abs    abs_sy = sy.abs    # 横距离与纵距离相等的情况下    if abs_sx == abs_sy      # 随机将边数增加 1      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1    end    # 横侧距离长的情况下    if abs_sx > abs_sy      # 左右方向优先。向主角移动      sx > 0 ? move_left : move_right      if not moving? and sy != 0      sy > 0 ? move_up : move_down      end    # 竖侧距离长的情况下    else      # 上下方向优先。向主角移动      sy > 0 ? move_up : move_down      if not moving? and sx != 0      sx > 0 ? move_left : move_right      end    endend#--------------------------------------------------------------------------# ● 远离主角#--------------------------------------------------------------------------def move_away_from_player    # 求得与主角的坐标差    sx = @x - $game_player.x    sy = @y - $game_player.y    # 坐标相等情况下    if sx == 0 and sy == 0      return    end    # 求得差的绝对值    abs_sx = sx.abs    abs_sy = sy.abs    # 横距离与纵距离相等的情况下    if abs_sx == abs_sy      # 随机将边数增加 1      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1    end    # 横侧距离长的情况下    if abs_sx > abs_sy      # 左右方向优先。远离主角移动      sx > 0 ? move_right : move_left      if not moving? and sy != 0      sy > 0 ? move_down : move_up      end    # 竖侧距离长的情况下    else      # 上下方向优先。远离主角移动      sy > 0 ? move_down : move_up      if not moving? and sx != 0      sx > 0 ? move_right : move_left      end    endend#--------------------------------------------------------------------------# ● 前进一步#--------------------------------------------------------------------------def move_forward    case @direction    when 2      move_down(false)    when 4      move_left(false)    when 6      move_right(false)    when 8      move_up(false)    endend#--------------------------------------------------------------------------# ● 后退一步#--------------------------------------------------------------------------def move_backward    # 记忆朝向固定信息    last_direction_fix = @direction_fix    # 强制固定朝向    @direction_fix = true    # 朝向分支    case @direction    when 2# 下      move_up(false)    when 4# 左      move_right(false)    when 6# 右      move_left(false)    when 8# 上      move_down(false)    end    # 还原朝向固定信息    @direction_fix = last_direction_fixend#--------------------------------------------------------------------------# ● 跳跃#   x_plus : X 坐标增加值#   y_plus : Y 坐标增加值#--------------------------------------------------------------------------def jump(x_plus, y_plus)    # 增加值不是 (0,0) 的情况下    if x_plus != 0 or y_plus != 0      # 横侧距离长的情况下      if x_plus.abs > y_plus.abs      # 变更左右方向      x_plus < 0 ? turn_left : turn_right      # 竖侧距离长的情况下      else      # 变更上下方向      y_plus < 0 ? turn_up : turn_down      end    end    # 计算新的坐标    new_x = @x + x_plus    new_y = @y + y_plus    # 增加值为 (0,0) 的情况下、跳跃目标可以通行的场合    if (x_plus == 0 and y_plus == 0) or passable?(new_x, new_y, 0)      # 矫正姿势      straighten      # 更新坐标      @x = new_x      @y = new_y      # 距计算距离      distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round      # 设置跳跃记数      @jump_peak = 10 + distance - @move_speed      @jump_count = @jump_peak * 2      # 清除停止记数信息      @stop_count = 0    endend#--------------------------------------------------------------------------# ● 面向向下#--------------------------------------------------------------------------def turn_down    unless @direction_fix      @direction = 2      @stop_count = 0    endend#--------------------------------------------------------------------------# ● 面向向左#--------------------------------------------------------------------------def turn_left    unless @direction_fix      @direction = 4      @stop_count = 0    endend#--------------------------------------------------------------------------# ● 面向向右#--------------------------------------------------------------------------def turn_right    unless @direction_fix      @direction = 6      @stop_count = 0    endend#--------------------------------------------------------------------------# ● 面向向上#--------------------------------------------------------------------------def turn_up    unless @direction_fix      @direction = 8      @stop_count = 0    endend#--------------------------------------------------------------------------# ● 向右旋转 90 度#--------------------------------------------------------------------------def turn_right_90    case @direction    when 2      turn_left    when 4      turn_up    when 6      turn_down    when 8      turn_right    endend#--------------------------------------------------------------------------# ● 向左旋转 90 度#--------------------------------------------------------------------------def turn_left_90    case @direction    when 2      turn_right    when 4      turn_down    when 6      turn_up    when 8      turn_left    endend#--------------------------------------------------------------------------# ● 旋转 180 度#--------------------------------------------------------------------------def turn_180    case @direction    when 2      turn_up    when 4      turn_right    when 6      turn_left    when 8      turn_down    endend#--------------------------------------------------------------------------# ● 从右向左旋转 90 度#--------------------------------------------------------------------------def turn_right_or_left_90    if rand(2) == 0      turn_right_90    else      turn_left_90    endend#--------------------------------------------------------------------------# ● 随机变换方向#--------------------------------------------------------------------------def turn_random    case rand(4)    when 0      turn_up    when 1      turn_right    when 2      turn_left    when 3      turn_down    endend#--------------------------------------------------------------------------# ● 接近主角的方向#--------------------------------------------------------------------------def turn_toward_player    # 求得与主角的坐标差    sx = @x - $game_player.x    sy = @y - $game_player.y    # 坐标相等的场合下    if sx == 0 and sy == 0      return    end    # 横侧距离长的情况下    if sx.abs > sy.abs      # 将左右方向变更为朝向主角的方向      sx > 0 ? turn_left : turn_right    # 竖侧距离长的情况下    else      # 将上下方向变更为朝向主角的方向      sy > 0 ? turn_up : turn_down    endend#--------------------------------------------------------------------------# ● 背向主角的方向#--------------------------------------------------------------------------def turn_away_from_player    # 求得与主角的坐标差    sx = @x - $game_player.x    sy = @y - $game_player.y    # 坐标相等的场合下    if sx == 0 and sy == 0      return    end    # 横侧距离长的情况下    if sx.abs > sy.abs      # 将左右方向变更为背离主角的方向      sx > 0 ? turn_right : turn_left    # 竖侧距离长的情况下    else      # 将上下方向变更为背离主角的方向      sy > 0 ? turn_down : turn_up    endendend复制代码■ Game_Player#==============================================================================# ■ Game_Player#------------------------------------------------------------------------------#  处理主角的类。事件启动的判定、以及地图的滚动等功能。# 本类的实例请参考 $game_player。#==============================================================================class Game_Player < Game_Character#--------------------------------------------------------------------------# ● 恒量#--------------------------------------------------------------------------CENTER_X = (320 - 16) * 4   # 画面中央的 X 坐标 * 4CENTER_Y = (240 - 16) * 4   # 画面中央的 Y 坐标 * 4#--------------------------------------------------------------------------# ● 可以通行判定#   x : X 坐标#   y : Y 坐标#   d : 方向 (0,2,4,6,8)※ 0 = 全方向不能通行的情况判定 (跳跃用)#--------------------------------------------------------------------------def passable?(x, y, d)    # 求得新的坐标    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)    # 坐标在地图外的情况下    unless $game_map.valid?(new_x, new_y)      # 不能通行      return false    end    # 调试模式为 ON 并且 按下 CTRL 键的情况下    if $DEBUG and Input.press?(Input::CTRL)      # 可以通行      return true    end    superend#--------------------------------------------------------------------------# ● 像通到画面中央一样的设置地图的显示位置#--------------------------------------------------------------------------def center(x, y)    max_x = ($game_map.width - 20) * 128    max_y = ($game_map.height - 15) * 128    $game_map.display_x = .min].max    $game_map.display_y = .min].maxend#--------------------------------------------------------------------------# ● 向指定的位置移动#   x : X 座標#   y : Y 座標#--------------------------------------------------------------------------def moveto(x, y)    super    # 自连接    center(x, y)    # 生成遇敌计数    make_encounter_countend#--------------------------------------------------------------------------# ● 增加步数#--------------------------------------------------------------------------def increase_steps    super    # 不是强制移动路线的场合    unless @move_route_forcing      # 增加步数      $game_party.increase_steps      # 步数是偶数的情况下      if $game_party.steps % 2 == 0      # 检查连续伤害      $game_party.check_map_slip_damage      end    endend#--------------------------------------------------------------------------# ● 获取遇敌计数#--------------------------------------------------------------------------def encounter_count    return @encounter_countend#--------------------------------------------------------------------------# ● 生成遇敌计数#--------------------------------------------------------------------------def make_encounter_count    # 两种颜色震动的图像    if $game_map.map_id != 0      n = $game_map.encounter_step      @encounter_count = rand(n) + rand(n) + 1    endend#--------------------------------------------------------------------------# ● 刷新#--------------------------------------------------------------------------def refresh    # 同伴人数为 0 的情况下    if $game_party.actors.size == 0      # 清除角色的文件名及对像      @character_name = ""      @character_hue = 0      # 分支结束      return    end    # 获取带头的角色    actor = $game_party.actors    # 设置角色的文件名及对像    @character_name = actor.character_name    @character_hue = actor.character_hue    # 初始化不透明度和合成方式子    @opacity = 255    @blend_type = 0end#--------------------------------------------------------------------------# ● 同位置的事件启动判定#--------------------------------------------------------------------------def check_event_trigger_here(triggers)    result = false    # 事件执行中的情况下    if $game_system.map_interpreter.running?      return result    end    # 全部事件的循环    for event in $game_map.events.values      # 事件坐标与目标一致的情况下      if event.x == @x and event.y == @y and triggers.include?(event.trigger)      # 跳跃中以外的情况下、启动判定是同位置的事件      if not event.jumping? and event.over_trigger?          event.start          result = true      end      end    end    return resultend#--------------------------------------------------------------------------# ● 正面事件的启动判定#--------------------------------------------------------------------------def check_event_trigger_there(triggers)    result = false    # 事件执行中的情况下    if $game_system.map_interpreter.running?      return result    end    # 计算正面坐标    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)    # 全部事件的循环    for event in $game_map.events.values      # 事件坐标与目标一致的情况下      if event.x == new_x and event.y == new_y and         triggers.include?(event.trigger)      # 跳跃中以外的情况下、启动判定是正面的事件      if not event.jumping? and not event.over_trigger?          event.start          result = true      end      end    end    # 找不到符合条件的事件的情况下    if result == false      # 正面的元件是计数器的情况下      if $game_map.counter?(new_x, new_y)      # 计算 1 元件里侧的坐标      new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)      new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)      # 全事件的循环      for event in $game_map.events.values          # 事件坐标与目标一致的情况下          if event.x == new_x and event.y == new_y and             triggers.include?(event.trigger)            # 跳跃中以外的情况下、启动判定是正面的事件            if not event.jumping? and not event.over_trigger?            event.start            result = true            end          end      end      end    end    return resultend#--------------------------------------------------------------------------# ● 接触事件启动判定#--------------------------------------------------------------------------def check_event_trigger_touch(x, y)    result = false    # 事件执行中的情况下    if $game_system.map_interpreter.running?      return result    end    # 全事件的循环    for event in $game_map.events.values      # 事件坐标与目标一致的情况下      if event.x == x and event.y == y and .include?(event.trigger)      # 跳跃中以外的情况下、启动判定是正面的事件      if not event.jumping? and not event.over_trigger?          event.start          result = true      end      end    end    return resultend#--------------------------------------------------------------------------# ● 画面更新#--------------------------------------------------------------------------def update    # 本地变量记录移动信息    last_moving = moving?    # 移动中、事件执行中、强制移动路线中、    # 信息窗口一个也不显示的时候    unless moving? or $game_system.map_interpreter.running? or         @move_route_forcing or $game_temp.message_window_showing      # 如果方向键被按下、主角就朝那个方向移动###########################################################################      case Input.dir8      when 2      move_down      when 4      move_left      when 6      move_right      when 8      move_up      when 1      move_lower_left      when 3      move_lower_right      when 7      move_upper_left      when 9      move_upper_right      end###########################################################################    end    # 本地变量记忆坐标    last_real_x = @real_x    last_real_y = @real_y    super    # 角色向下移动、画面上的位置在中央下方的情况下    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y      # 画面向下卷动      $game_map.scroll_down(@real_y - last_real_y)    end    # 角色向左移动、画面上的位置在中央左方的情况下    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X      # 画面向左卷动      $game_map.scroll_left(last_real_x - @real_x)    end    # 角色向右移动、画面上的位置在中央右方的情况下    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X      # 画面向右卷动      $game_map.scroll_right(@real_x - last_real_x)    end    # 角色向上移动、画面上的位置在中央上方的情况下    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y      # 画面向上卷动      $game_map.scroll_up(last_real_y - @real_y)    end    # 不在移动中的情况下    unless moving?      # 上次主角移动中的情况      if last_moving      # 与同位置的事件接触就判定为事件启动      result = check_event_trigger_here()      # 没有可以启动的事件的情况下      if result == false          # 调试模式为 ON 并且按下 CTRL 键的情况下除外          unless $DEBUG and Input.press?(Input::CTRL)            # 遇敌计数下降            if @encounter_count > 0            @encounter_count -= 1            end          end      end      end      # 按下 C 键的情况下      if Input.trigger?(Input::C)      # 判定为同位置以及正面的事件启动      check_event_trigger_here()      check_event_trigger_there()      end    endendend复制代码■ Sprite_Character#==============================================================================# ■ Sprite_Character#------------------------------------------------------------------------------#  角色显示用脚本。监视 Game_Character 类的实例、# 自动变化脚本状态。#==============================================================================class Sprite_Character < RPG::Sprite#--------------------------------------------------------------------------# ● 定义实例变量#--------------------------------------------------------------------------attr_accessor :character                # 角色#--------------------------------------------------------------------------# ● 初始化对像#   viewport: 查看端口#   character : 角色 (Game_Character)#--------------------------------------------------------------------------def initialize(viewport, character = nil)    super(viewport)    @character = character    updateend#--------------------------------------------------------------------------# ● 更新画面#--------------------------------------------------------------------------def update    super    # 元件 ID、文件名、色相与现在的情况存在差异的情况下    if @tile_id != @character.tile_id or       @character_name != @character.character_name or       @character_hue != @character.character_hue      # 记忆元件 ID 与文件名、色相      @tile_id = @character.tile_id      @character_name = @character.character_name      @character_hue = @character.character_hue      # 元件 ID 为有效值的情况下      if @tile_id >= 384      self.bitmap = RPG::Cache.tile($game_map.tileset_name,          @tile_id, @character.character_hue)      self.src_rect.set(0, 0, 32, 32)      self.ox = 16      self.oy = 32      # 元件 ID 为无效值的情况下      else      self.bitmap = RPG::Cache.character(@character.character_name,          @character.character_hue)      @cw = bitmap.width / 4###########################################################################      @ch = bitmap.height / 4###########################################################################      self.ox = @cw / 2      self.oy = @ch      end    end    # 设置可视状态    self.visible = (not @character.transparent)    # 图形是角色的情况下    if @tile_id == 0      # 设置传送目标的矩形      sx = @character.pattern * @cw###########################################################################      case @character.direction      when 2      self.bitmap = RPG::Cache.character(@character.character_name,          @character.character_hue)          @cw = bitmap.width / 4      @ch = bitmap.height / 4      sy = 0 * @ch      when 4      self.bitmap = RPG::Cache.character(@character.character_name,          @character.character_hue)          @cw = bitmap.width / 4      @ch = bitmap.height / 4      sy = 1 * @ch      when 6      self.bitmap = RPG::Cache.character(@character.character_name,          @character.character_hue)          @cw = bitmap.width / 4      @ch = bitmap.height / 4      sy = 2 * @ch      when 8      self.bitmap = RPG::Cache.character(@character.character_name,          @character.character_hue)          @cw = bitmap.width / 4      @ch = bitmap.height / 4      sy = 3 * @ch      when 1      self.bitmap = RPG::Cache.character(@character.character_name + "_quarter.png",          @character.character_hue)          @cw = bitmap.width / 4      @ch = bitmap.height / 4      sy = 0 * @ch      when 3      self.bitmap = RPG::Cache.character(@character.character_name + "_quarter.png",          @character.character_hue)          @cw = bitmap.width / 4      @ch = bitmap.height / 4      sy = 2 * @ch            when 7      self.bitmap = RPG::Cache.character(@character.character_name + "_quarter.png",          @character.character_hue)          @cw = bitmap.width / 4      @ch = bitmap.height / 4      sy = 1 * @ch      when 9      self.bitmap = RPG::Cache.character(@character.character_name + "_quarter.png",          @character.character_hue)          @cw = bitmap.width / 4      @ch = bitmap.height / 4      sy = 3 * @ch      end      self.src_rect.set(sx, sy, @cw, @ch)###########################################################################    end    # 设置脚本的坐标    self.x = @character.screen_x    self.y = @character.screen_y    self.z = @character.screen_z(@ch)    # 设置不透明度、合成方式、茂密    self.opacity = @character.opacity    self.blend_type = @character.blend_type    self.bush_depth = @character.bush_depth    # 动画    if @character.animation_id != 0      animation = $data_animations[@character.animation_id]      animation(animation, true)      @character.animation_id = 0    endendend复制代码工程
新手弄的,不知道有没有问题
             本帖来自P1论坛作者竹轩轩,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=215646若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 八方向行走图(不影响4方)