Project1

标题: 存档的时候能否把事件的坐标位置保存下来? [打印本页]

作者: 木许许    时间: 2012-10-24 11:20
标题: 存档的时候能否把事件的坐标位置保存下来?
本帖最后由 木许许 于 2012-10-25 12:47 编辑

如果事件是走动的话,存档的时候把事件的坐标位置保存下来,下次读取的时候,事件的位置会和地图的初始设置有所改变
作者: 沙漠点灰    时间: 2012-10-24 20:07
请直接替换Game_Map.........
  1. #==============================================================================
  2. # ■ Game_Map
  3. #------------------------------------------------------------------------------
  4. #  处理地图的类。包含卷动以及可以通行的判断功能。
  5. # 本类的实例请参考 $game_map 。
  6. #==============================================================================

  7. class Game_Map
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_accessor :tileset_name             # 元件 文件名
  12.   attr_accessor :autotile_names           # 自动元件 文件名
  13.   attr_accessor :panorama_name            # 全景 文件名
  14.   attr_accessor :panorama_hue             # 全景 色相
  15.   attr_accessor :fog_name                 # 雾 文件名
  16.   attr_accessor :fog_hue                  # 雾 色相
  17.   attr_accessor :fog_opacity              # 雾 不透明度
  18.   attr_accessor :fog_blend_type           # 雾 混合方式
  19.   attr_accessor :fog_zoom                 # 雾 放大率
  20.   attr_accessor :fog_sx                   # 雾 SX
  21.   attr_accessor :fog_sy                   # 雾 SY
  22.   attr_accessor :battleback_name          # 战斗背景 文件名
  23.   attr_accessor :display_x                # 显示 X 坐标 * 128
  24.   attr_accessor :display_y                # 显示 Y 坐标 * 128
  25.   attr_accessor :need_refresh             # 刷新要求标志
  26.   attr_reader   :passages                 # 通行表
  27.   attr_reader   :priorities               # 优先表
  28.   attr_reader   :terrain_tags             # 地形标记表
  29.   attr_reader   :events                   # 事件
  30.   attr_reader   :fog_ox                   # 雾 原点 X 坐标
  31.   attr_reader   :fog_oy                   # 雾 原点 Y 坐标
  32.   attr_reader   :fog_tone                 # 雾 色调
  33.   #--------------------------------------------------------------------------
  34.   # ● 初始化条件
  35.   #--------------------------------------------------------------------------
  36.   def initialize
  37.     @map_id = 0
  38.     @display_x = 0
  39.     @display_y = 0
  40.     @events_set = {}
  41.   end
  42.   #--------------------------------------------------------------------------
  43.   # ● 设置
  44.   #     map_id : 地图 ID
  45.   #--------------------------------------------------------------------------
  46.   def setup(map_id)
  47.     # 地图 ID 记录到 @map_id
  48.     if @map
  49.       for i in @map.events.keys
  50.         @events_set[@map_id] ||= {}
  51.         @events_set[@map_id][i] = [@events[i].x, @events[i].y]
  52.       end
  53.     end
  54.     @map_id = map_id
  55.     # 地图文件装载后、设置到 @map
  56.     @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  57.     # 定义实例变量设置地图元件信息
  58.     tileset = $data_tilesets[@map.tileset_id]
  59.     @tileset_name = tileset.tileset_name
  60.     @autotile_names = tileset.autotile_names
  61.     @panorama_name = tileset.panorama_name
  62.     @panorama_hue = tileset.panorama_hue
  63.     @fog_name = tileset.fog_name
  64.     @fog_hue = tileset.fog_hue
  65.     @fog_opacity = tileset.fog_opacity
  66.     @fog_blend_type = tileset.fog_blend_type
  67.     @fog_zoom = tileset.fog_zoom
  68.     @fog_sx = tileset.fog_sx
  69.     @fog_sy = tileset.fog_sy
  70.     @battleback_name = tileset.battleback_name
  71.     @passages = tileset.passages
  72.     @priorities = tileset.priorities
  73.     @terrain_tags = tileset.terrain_tags
  74.     # 初始化显示坐标
  75.     @display_x = 0
  76.     @display_y = 0
  77.     # 清除刷新要求标志
  78.     @need_refresh = false
  79.     # 设置地图事件数据
  80.     @events = {}
  81.     for i in @map.events.keys
  82.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  83.       if @events_set[@map_id]
  84.         p @events_set[@map_id]
  85.         @events[i].moveto(*@events_set[@map_id][i]) if @events_set[@map_id][i]
  86.       else
  87.         @events_set[@map_id] = {}
  88.       end
  89.     end
  90.     # 设置公共事件数据
  91.     @common_events = {}
  92.     for i in 1...$data_common_events.size
  93.       @common_events[i] = Game_CommonEvent.new(i)
  94.     end
  95.     # 初始化雾的各种信息
  96.     @fog_ox = 0
  97.     @fog_oy = 0
  98.     @fog_tone = Tone.new(0, 0, 0, 0)
  99.     @fog_tone_target = Tone.new(0, 0, 0, 0)
  100.     @fog_tone_duration = 0
  101.     @fog_opacity_duration = 0
  102.     @fog_opacity_target = 0
  103.     # 初始化滚动信息
  104.     @scroll_direction = 2
  105.     @scroll_rest = 0
  106.     @scroll_speed = 4
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 获取地图 ID
  110.   #--------------------------------------------------------------------------
  111.   def map_id
  112.     return @map_id
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # ● 获取宽度
  116.   #--------------------------------------------------------------------------
  117.   def width
  118.     return @map.width
  119.   end
  120.   #--------------------------------------------------------------------------
  121.   # ● 获取高度
  122.   #--------------------------------------------------------------------------
  123.   def height
  124.     return @map.height
  125.   end
  126.   #--------------------------------------------------------------------------
  127.   # ● 获取遇敌列表
  128.   #--------------------------------------------------------------------------
  129.   def encounter_list
  130.     return @map.encounter_list
  131.   end
  132.   #--------------------------------------------------------------------------
  133.   # ● 获取遇敌步数
  134.   #--------------------------------------------------------------------------
  135.   def encounter_step
  136.     return @map.encounter_step
  137.   end
  138.   #--------------------------------------------------------------------------
  139.   # ● 获取地图数据
  140.   #--------------------------------------------------------------------------
  141.   def data
  142.     return @map.data
  143.   end
  144.   #--------------------------------------------------------------------------
  145.   # ● BGM / BGS 自动切换
  146.   #--------------------------------------------------------------------------
  147.   def autoplay
  148.     if @map.autoplay_bgm
  149.       $game_system.bgm_play(@map.bgm)
  150.     end
  151.     if @map.autoplay_bgs
  152.       $game_system.bgs_play(@map.bgs)
  153.     end
  154.   end
  155.   #--------------------------------------------------------------------------
  156.   # ● 刷新
  157.   #--------------------------------------------------------------------------
  158.   def refresh
  159.     # 地图 ID 有效
  160.     if @map_id > 0
  161.       # 刷新全部的地图事件
  162.       for event in @events.values
  163.         event.refresh
  164.       end
  165.       # 刷新全部的公共事件
  166.       for common_event in @common_events.values
  167.         common_event.refresh
  168.       end
  169.     end
  170.     # 清除刷新要求标志
  171.     @need_refresh = false
  172.   end
  173.   #--------------------------------------------------------------------------
  174.   # ● 向下滚动
  175.   #     distance : 滚动距离
  176.   #--------------------------------------------------------------------------
  177.   def scroll_down(distance)
  178.     @display_y = [@display_y + distance, (self.height - 15) * 128].min
  179.   end
  180.   #--------------------------------------------------------------------------
  181.   # ● 向左滚动
  182.   #     distance : 滚动距离
  183.   #--------------------------------------------------------------------------
  184.   def scroll_left(distance)
  185.     @display_x = [@display_x - distance, 0].max
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   # ● 向右滚动
  189.   #     distance : 滚动距离
  190.   #--------------------------------------------------------------------------
  191.   def scroll_right(distance)
  192.     @display_x = [@display_x + distance, (self.width - 20) * 128].min
  193.   end
  194.   #--------------------------------------------------------------------------
  195.   # ● 向上滚动
  196.   #     distance : 滚动距离
  197.   #--------------------------------------------------------------------------
  198.   def scroll_up(distance)
  199.     @display_y = [@display_y - distance, 0].max
  200.   end
  201.   #--------------------------------------------------------------------------
  202.   # ● 有效坐标判定
  203.   #     x          : X 坐标
  204.   #     y          : Y 坐标
  205.   #--------------------------------------------------------------------------
  206.   def valid?(x, y)
  207.     return (x >= 0 and x < width and y >= 0 and y < height)
  208.   end
  209.   #--------------------------------------------------------------------------
  210.   # ● 可以通行判定
  211.   #     x          : X 坐标
  212.   #     y          : Y 坐标
  213.   #     d          : 方向 (0,2,4,6,8,10)
  214.   #                  ※ 0,10 = 全方向不能通行的情况的判定 (跳跃等)
  215.   #     self_event : 自己 (判定事件可以通行的情况下)
  216.   #--------------------------------------------------------------------------
  217.   def passable?(x, y, d, self_event = nil)
  218.     # 被给予的坐标地图外的情况下
  219.     unless valid?(x, y)
  220.       # 不能通行
  221.       return false
  222.     end
  223.     # 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
  224.     bit = (1 << (d / 2 - 1)) & 0x0f
  225.     # 循环全部的事件
  226.     for event in events.values
  227.       # 自己以外的元件与坐标相同的情况
  228.       if event.tile_id >= 0 and event != self_event and
  229.          event.x == x and event.y == y and not event.through
  230.         # 如果障碍物的接触被设置的情况下
  231.         if @passages[event.tile_id] & bit != 0
  232.           # 不能通行
  233.           return false
  234.         # 如果全方向的障碍物的接触被设置的情况下
  235.         elsif @passages[event.tile_id] & 0x0f == 0x0f
  236.           # 不能通行
  237.           return false
  238.         # 这以外的优先度为 0 的情况下
  239.         elsif @priorities[event.tile_id] == 0
  240.           # 可以通行
  241.           return true
  242.         end
  243.       end
  244.     end
  245.     # 从层按从上到下的顺序调查循环
  246.     for i in [2, 1, 0]
  247.       # 取得元件 ID
  248.       tile_id = data[x, y, i]
  249.       # 取得元件 ID 失败
  250.       if tile_id == nil
  251.         # 不能通行
  252.         return false
  253.       # 如果障碍物的接触被设置的情况下
  254.       elsif @passages[tile_id] & bit != 0
  255.         # 不能通行
  256.         return false
  257.       # 如果全方向的障碍物的接触被设置的情况下
  258.       elsif @passages[tile_id] & 0x0f == 0x0f
  259.         # 不能通行
  260.         return false
  261.       # 这以外的优先度为 0 的情况下
  262.       elsif @priorities[tile_id] == 0
  263.         # 可以通行
  264.         return true
  265.       end
  266.     end
  267.     # 可以通行
  268.     return true
  269.   end
  270.   #--------------------------------------------------------------------------
  271.   # ● 茂密判定
  272.   #     x          : X 坐标
  273.   #     y          : Y 坐标
  274.   #--------------------------------------------------------------------------
  275.   def bush?(x, y)
  276.     if @map_id != 0
  277.       for i in [2, 1, 0]
  278.         tile_id = data[x, y, i]
  279.         if tile_id == nil
  280.           return false
  281.         elsif @passages[tile_id] & 0x40 == 0x40
  282.           return true
  283.         end
  284.       end
  285.     end
  286.     return false
  287.   end
  288.   #--------------------------------------------------------------------------
  289.   # ● 反击判定
  290.   #     x          : X 坐标
  291.   #     y          : Y 坐标
  292.   #--------------------------------------------------------------------------
  293.   def counter?(x, y)
  294.     if @map_id != 0
  295.       for i in [2, 1, 0]
  296.         tile_id = data[x, y, i]
  297.         if tile_id == nil
  298.           return false
  299.         elsif @passages[tile_id] & 0x80 == 0x80
  300.           return true
  301.         end
  302.       end
  303.     end
  304.     return false
  305.   end
  306.   #--------------------------------------------------------------------------
  307.   # ● 地获取地形标志
  308.   #     x          : X 坐标
  309.   #     y          : Y 坐标
  310.   #--------------------------------------------------------------------------
  311.   def terrain_tag(x, y)
  312.     if @map_id != 0
  313.       for i in [2, 1, 0]
  314.         tile_id = data[x, y, i]
  315.         if tile_id == nil
  316.           return 0
  317.         elsif @terrain_tags[tile_id] > 0
  318.           return @terrain_tags[tile_id]
  319.         end
  320.       end
  321.     end
  322.     return 0
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # ● 获取指定位置的事件 ID
  326.   #     x          : X 坐标
  327.   #     y          : Y 坐标
  328.   #--------------------------------------------------------------------------
  329.   def check_event(x, y)
  330.     for event in $game_map.events.values
  331.       if event.x == x and event.y == y
  332.         return event.id
  333.       end
  334.     end
  335.   end
  336.   #--------------------------------------------------------------------------
  337.   # ● 滚动开始
  338.   #     direction : 滚动方向
  339.   #     distance  : 滚动距离
  340.   #     speed     : 滚动速度
  341.   #--------------------------------------------------------------------------
  342.   def start_scroll(direction, distance, speed)
  343.     @scroll_direction = direction
  344.     @scroll_rest = distance * 128
  345.     @scroll_speed = speed
  346.   end
  347.   #--------------------------------------------------------------------------
  348.   # ● 滚动中判定
  349.   #--------------------------------------------------------------------------
  350.   def scrolling?
  351.     return @scroll_rest > 0
  352.   end
  353.   #--------------------------------------------------------------------------
  354.   # ● 开始变更雾的色调
  355.   #     tone     : 色调
  356.   #     duration : 时间
  357.   #--------------------------------------------------------------------------
  358.   def start_fog_tone_change(tone, duration)
  359.     @fog_tone_target = tone.clone
  360.     @fog_tone_duration = duration
  361.     if @fog_tone_duration == 0
  362.       @fog_tone = @fog_tone_target.clone
  363.     end
  364.   end
  365.   #--------------------------------------------------------------------------
  366.   # ● 开始变更雾的不透明度
  367.   #     opacity  : 不透明度
  368.   #     duration : 时间
  369.   #--------------------------------------------------------------------------
  370.   def start_fog_opacity_change(opacity, duration)
  371.     @fog_opacity_target = opacity * 1.0
  372.     @fog_opacity_duration = duration
  373.     if @fog_opacity_duration == 0
  374.       @fog_opacity = @fog_opacity_target
  375.     end
  376.   end
  377.   #--------------------------------------------------------------------------
  378.   # ● 刷新画面
  379.   #--------------------------------------------------------------------------
  380.   def update
  381.     # 还原必要的地图
  382.     if $game_map.need_refresh
  383.       refresh
  384.     end
  385.     # 滚动中的情况下
  386.     if @scroll_rest > 0
  387.       # 滚动速度变化为地图坐标系的距离
  388.       distance = 2 ** @scroll_speed
  389.       # 执行滚动
  390.       case @scroll_direction
  391.       when 2  # 下
  392.         scroll_down(distance)
  393.       when 4  # 左
  394.         scroll_left(distance)
  395.       when 6  # 右
  396.         scroll_right(distance)
  397.       when 8  # 上
  398.         scroll_up(distance)
  399.       end
  400.       # 滚动距离的减法运算
  401.       @scroll_rest -= distance
  402.     end
  403.     # 更新地图事件
  404.     for event in @events.values
  405.       event.update
  406.     end
  407.     # 更新公共事件
  408.     for common_event in @common_events.values
  409.       common_event.update
  410.     end
  411.     # 处理雾的滚动
  412.     @fog_ox -= @fog_sx / 8.0
  413.     @fog_oy -= @fog_sy / 8.0
  414.     # 处理雾的色调变更
  415.     if @fog_tone_duration >= 1
  416.       d = @fog_tone_duration
  417.       target = @fog_tone_target
  418.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  419.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  420.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  421.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  422.       @fog_tone_duration -= 1
  423.     end
  424.     # 处理雾的不透明度变更
  425.     if @fog_opacity_duration >= 1
  426.       d = @fog_opacity_duration
  427.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  428.       @fog_opacity_duration -= 1
  429.     end
  430.   end
  431. end
复制代码

作者: 木许许    时间: 2012-10-25 09:31
沙漠点灰 发表于 2012-10-24 20:07
请直接替换Game_Map.........

谢谢,如果我只需要保存每张地图中ID编号为11、12、13、14的事件呢?
作者: 沙漠点灰    时间: 2012-10-25 12:36
木许许 发表于 2012-10-25 09:31
谢谢,如果我只需要保存每张地图中ID编号为11、12、13、14的事件呢?

[pre lang="ruby" line="1"]#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
#  处理地图的类。包含卷动以及可以通行的判断功能。
# 本类的实例请参考 $game_map 。
#==============================================================================

class Game_Map
  EventID = [11,12,13]
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :tileset_name             # 元件 文件名
  attr_accessor :autotile_names           # 自动元件 文件名
  attr_accessor :panorama_name            # 全景 文件名
  attr_accessor :panorama_hue             # 全景 色相
  attr_accessor :fog_name                 # 雾 文件名
  attr_accessor :fog_hue                  # 雾 色相
  attr_accessor :fog_opacity              # 雾 不透明度
  attr_accessor :fog_blend_type           # 雾 混合方式
  attr_accessor :fog_zoom                 # 雾 放大率
  attr_accessor :fog_sx                   # 雾 SX
  attr_accessor :fog_sy                   # 雾 SY
  attr_accessor :battleback_name          # 战斗背景 文件名
  attr_accessor :display_x                # 显示 X 坐标 * 128
  attr_accessor :display_y                # 显示 Y 坐标 * 128
  attr_accessor :need_refresh             # 刷新要求标志
  attr_reader   :passages                 # 通行表
  attr_reader   :priorities               # 优先表
  attr_reader   :terrain_tags             # 地形标记表
  attr_reader   :events                   # 事件
  attr_reader   :fog_ox                   # 雾 原点 X 坐标
  attr_reader   :fog_oy                   # 雾 原点 Y 坐标
  attr_reader   :fog_tone                 # 雾 色调
  #--------------------------------------------------------------------------
  # ● 初始化条件
  #--------------------------------------------------------------------------
  def initialize
    @map_id = 0
    @display_x = 0
    @display_y = 0
    @events_set = {}
  end
  #--------------------------------------------------------------------------
  # ● 设置
  #     map_id : 地图 ID
  #--------------------------------------------------------------------------
  def setup(map_id)
    # 地图 ID 记录到 @map_id
    if @map
      for i in @map.events.keys
        next if !EventID.include?(i)
        @events_set[@map_id] ||= {}
        @events_set[@map_id] = [@events.x, @events.y]
      end
    end
    @map_id = map_id
    # 地图文件装载后、设置到 @map
    @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
    # 定义实例变量设置地图元件信息
    tileset = $data_tilesets[@map.tileset_id]
    @tileset_name = tileset.tileset_name
    @autotile_names = tileset.autotile_names
    @panorama_name = tileset.panorama_name
    @panorama_hue = tileset.panorama_hue
    @fog_name = tileset.fog_name
    @fog_hue = tileset.fog_hue
    @fog_opacity = tileset.fog_opacity
    @fog_blend_type = tileset.fog_blend_type
    @fog_zoom = tileset.fog_zoom
    @fog_sx = tileset.fog_sx
    @fog_sy = tileset.fog_sy
    @battleback_name = tileset.battleback_name
    @passages = tileset.passages
    @priorities = tileset.priorities
    @terrain_tags = tileset.terrain_tags
    # 初始化显示坐标
    @display_x = 0
    @display_y = 0
    # 清除刷新要求标志
    @need_refresh = false
    # 设置地图事件数据
    @events = {}
    for i in @map.events.keys
      @events = Game_Event.new(@map_id, @map.events)
      if @events_set[@map_id]
        p @events_set[@map_id]
        @events.moveto(*@events_set[@map_id]) if @events_set[@map_id]
      else
        @events_set[@map_id] = {}
      end
    end
    # 设置公共事件数据
    @common_events = {}
    for i in 1...$data_common_events.size
      @common_events = Game_CommonEvent.new(i)
    end
    # 初始化雾的各种信息
    @fog_ox = 0
    @fog_oy = 0
    @fog_tone = Tone.new(0, 0, 0, 0)
    @fog_tone_target = Tone.new(0, 0, 0, 0)
    @fog_tone_duration = 0
    @fog_opacity_duration = 0
    @fog_opacity_target = 0
    # 初始化滚动信息
    @scroll_direction = 2
    @scroll_rest = 0
    @scroll_speed = 4
  end
  #--------------------------------------------------------------------------
  # ● 获取地图 ID
  #--------------------------------------------------------------------------
  def map_id
    return @map_id
  end
  #--------------------------------------------------------------------------
  # ● 获取宽度
  #--------------------------------------------------------------------------
  def width
    return @map.width
  end
  #--------------------------------------------------------------------------
  # ● 获取高度
  #--------------------------------------------------------------------------
  def height
    return @map.height
  end
  #--------------------------------------------------------------------------
  # ● 获取遇敌列表
  #--------------------------------------------------------------------------
  def encounter_list
    return @map.encounter_list
  end
  #--------------------------------------------------------------------------
  # ● 获取遇敌步数
  #--------------------------------------------------------------------------
  def encounter_step
    return @map.encounter_step
  end
  #--------------------------------------------------------------------------
  # ● 获取地图数据
  #--------------------------------------------------------------------------
  def data
    return @map.data
  end
  #--------------------------------------------------------------------------
  # ● BGM / BGS 自动切换
  #--------------------------------------------------------------------------
  def autoplay
    if @map.autoplay_bgm
      $game_system.bgm_play(@map.bgm)
    end
    if @map.autoplay_bgs
      $game_system.bgs_play(@map.bgs)
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    # 地图 ID 有效
    if @map_id > 0
      # 刷新全部的地图事件
      for event in @events.values
        event.refresh
      end
      # 刷新全部的公共事件
      for common_event in @common_events.values
        common_event.refresh
      end
    end
    # 清除刷新要求标志
    @need_refresh = false
  end
  #--------------------------------------------------------------------------
  # ● 向下滚动
  #     distance : 滚动距离
  #--------------------------------------------------------------------------
  def scroll_down(distance)
    @display_y = [@display_y + distance, (self.height - 15) * 128].min
  end
  #--------------------------------------------------------------------------
  # ● 向左滚动
  #     distance : 滚动距离
  #--------------------------------------------------------------------------
  def scroll_left(distance)
    @display_x = [@display_x - distance, 0].max
  end
  #--------------------------------------------------------------------------
  # ● 向右滚动
  #     distance : 滚动距离
  #--------------------------------------------------------------------------
  def scroll_right(distance)
    @display_x = [@display_x + distance, (self.width - 20) * 128].min
  end
  #--------------------------------------------------------------------------
  # ● 向上滚动
  #     distance : 滚动距离
  #--------------------------------------------------------------------------
  def scroll_up(distance)
    @display_y = [@display_y - distance, 0].max
  end
  #--------------------------------------------------------------------------
  # ● 有效坐标判定
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def valid?(x, y)
    return (x >= 0 and x < width and y >= 0 and y < height)
  end
  #--------------------------------------------------------------------------
  # ● 可以通行判定
  #     x          : X 坐标
  #     y          : Y 坐标
  #     d          : 方向 (0,2,4,6,8,10)
  #                  ※ 0,10 = 全方向不能通行的情况的判定 (跳跃等)
  #     self_event : 自己 (判定事件可以通行的情况下)
  #--------------------------------------------------------------------------
  def passable?(x, y, d, self_event = nil)
    # 被给予的坐标地图外的情况下
    unless valid?(x, y)
      # 不能通行
      return false
    end
    # 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
    bit = (1 << (d / 2 - 1)) & 0x0f
    # 循环全部的事件
    for event in events.values
      # 自己以外的元件与坐标相同的情况
      if event.tile_id >= 0 and event != self_event and
         event.x == x and event.y == y and not event.through
        # 如果障碍物的接触被设置的情况下
        if @passages[event.tile_id] & bit != 0
          # 不能通行
          return false
        # 如果全方向的障碍物的接触被设置的情况下
        elsif @passages[event.tile_id] & 0x0f == 0x0f
          # 不能通行
          return false
        # 这以外的优先度为 0 的情况下
        elsif @priorities[event.tile_id] == 0
          # 可以通行
          return true
        end
      end
    end
    # 从层按从上到下的顺序调查循环
    for i in [2, 1, 0]
      # 取得元件 ID
      tile_id = data[x, y, i]
      # 取得元件 ID 失败
      if tile_id == nil
        # 不能通行
        return false
      # 如果障碍物的接触被设置的情况下
      elsif @passages[tile_id] & bit != 0
        # 不能通行
        return false
      # 如果全方向的障碍物的接触被设置的情况下
      elsif @passages[tile_id] & 0x0f == 0x0f
        # 不能通行
        return false
      # 这以外的优先度为 0 的情况下
      elsif @priorities[tile_id] == 0
        # 可以通行
        return true
      end
    end
    # 可以通行
    return true
  end
  #--------------------------------------------------------------------------
  # ● 茂密判定
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def bush?(x, y)
    if @map_id != 0
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        if tile_id == nil
          return false
        elsif @passages[tile_id] & 0x40 == 0x40
          return true
        end
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 反击判定
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def counter?(x, y)
    if @map_id != 0
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        if tile_id == nil
          return false
        elsif @passages[tile_id] & 0x80 == 0x80
          return true
        end
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 地获取地形标志
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def terrain_tag(x, y)
    if @map_id != 0
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        if tile_id == nil
          return 0
        elsif @terrain_tags[tile_id] > 0
          return @terrain_tags[tile_id]
        end
      end
    end
    return 0
  end
  #--------------------------------------------------------------------------
  # ● 获取指定位置的事件 ID
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def check_event(x, y)
    for event in $game_map.events.values
      if event.x == x and event.y == y
        return event.id
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 滚动开始
  #     direction : 滚动方向
  #     distance  : 滚动距离
  #     speed     : 滚动速度
  #--------------------------------------------------------------------------
  def start_scroll(direction, distance, speed)
    @scroll_direction = direction
    @scroll_rest = distance * 128
    @scroll_speed = speed
  end
  #--------------------------------------------------------------------------
  # ● 滚动中判定
  #--------------------------------------------------------------------------
  def scrolling?
    return @scroll_rest > 0
  end
  #--------------------------------------------------------------------------
  # ● 开始变更雾的色调
  #     tone     : 色调
  #     duration : 时间
  #--------------------------------------------------------------------------
  def start_fog_tone_change(tone, duration)
    @fog_tone_target = tone.clone
    @fog_tone_duration = duration
    if @fog_tone_duration == 0
      @fog_tone = @fog_tone_target.clone
    end
  end
  #--------------------------------------------------------------------------
  # ● 开始变更雾的不透明度
  #     opacity  : 不透明度
  #     duration : 时间
  #--------------------------------------------------------------------------
  def start_fog_opacity_change(opacity, duration)
    @fog_opacity_target = opacity * 1.0
    @fog_opacity_duration = duration
    if @fog_opacity_duration == 0
      @fog_opacity = @fog_opacity_target
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 还原必要的地图
    if $game_map.need_refresh
      refresh
    end
    # 滚动中的情况下
    if @scroll_rest > 0
      # 滚动速度变化为地图坐标系的距离
      distance = 2 ** @scroll_speed
      # 执行滚动
      case @scroll_direction
      when 2  # 下
        scroll_down(distance)
      when 4  # 左
        scroll_left(distance)
      when 6  # 右
        scroll_right(distance)
      when 8  # 上
        scroll_up(distance)
      end
      # 滚动距离的减法运算
      @scroll_rest -= distance
    end
    # 更新地图事件
    for event in @events.values
      event.update
    end
    # 更新公共事件
    for common_event in @common_events.values
      common_event.update
    end
    # 处理雾的滚动
    @fog_ox -= @fog_sx / 8.0
    @fog_oy -= @fog_sy / 8.0
    # 处理雾的色调变更
    if @fog_tone_duration >= 1
      d = @fog_tone_duration
      target = @fog_tone_target
      @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
      @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
      @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
      @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
      @fog_tone_duration -= 1
    end
    # 处理雾的不透明度变更
    if @fog_opacity_duration >= 1
      d = @fog_opacity_duration
      @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
      @fog_opacity_duration -= 1
    end
  end
end
[/pre]
同样直接替换,
开头有EventID = [11,12,13]
这就是每张地图需要保存的事件编号,用半角逗号分隔




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X5.0