设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1237|回复: 3
打印 上一主题 下一主题

[已经解决] 存档的时候能否把事件的坐标位置保存下来?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
200 小时
注册时间
2008-3-1
帖子
360
跳转到指定楼层
1
发表于 2012-10-24 11:20:13 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 木许许 于 2012-10-25 12:47 编辑

如果事件是走动的话,存档的时候把事件的坐标位置保存下来,下次读取的时候,事件的位置会和地图的初始设置有所改变

点评

能。  发表于 2012-10-24 12:58

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
4
发表于 2012-10-25 12:36:00 | 只看该作者
木许许 发表于 2012-10-25 09:31
谢谢,如果我只需要保存每张地图中ID编号为11、12、13、14的事件呢?

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

同样直接替换,
开头有EventID = [11,12,13]
这就是每张地图需要保存的事件编号,用半角逗号分隔

评分

参与人数 1星屑 +200 收起 理由
hcm + 200 认可答案

查看全部评分

>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
200 小时
注册时间
2008-3-1
帖子
360
3
 楼主| 发表于 2012-10-25 09:31:11 | 只看该作者
沙漠点灰 发表于 2012-10-24 20:07
请直接替换Game_Map.........

谢谢,如果我只需要保存每张地图中ID编号为11、12、13、14的事件呢?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
2
发表于 2012-10-24 20:07:15 | 只看该作者
请直接替换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
复制代码
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-29 20:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表