查看: 2186|回复: 0

设置地图通行度

[复制链接]

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-9-20 21:01:45 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 taroxd 于 2015-2-11 19:34 编辑

[pre lang="ruby"]
#--------------------------------------------------------------------------
# ● require Taroxd基础设置
#    设置地图通行度
#--------------------------------------------------------------------------
#
#  使用方法1:在“设置区域通行度”处填入一定可以通行的区域和一定不能通行的区域。
#
#    例:PASSABLE_REGIONS = [2, 5, 8..11]
#        表明区域 2, 5, 8, 9, 10, 11 可以通行,无论上面是什么图块。
#
#  使用方法2:** require 显示地图通行度 **
#
#    测试模式下,把 EDIT_MODE 设为 true,
#    然后在地图上按下确定键即可改变当前位置的通行度。
#    该模式下,角色可以自由穿透。
#
#    △表示不改变,○表示可以通行,×表示不可通行。颜色表示最终的通行度。
#
#    需要清空设置的话,删除设置文件(见 FILE 常量)即可。
#
#    需要重置一张地图的设置的话,可以调用如下脚本:
#      Taroxd::Passage.clear(map_id)
#    其中 map_id 为地图 ID。若要清除当前地图的通行度,map_id 可以不填。
#    注意,清除后,通行度的显示并不会立即改变。重新打开游戏即可看到效果。
#
#--------------------------------------------------------------------------

module Taroxd::Passage

  # 地图通行度信息会保存到这个文件。建议每次编辑前备份该文件。
  FILE = 'Data/MapPassage.rvdata2'

  # 是否打开编辑模式。需要前置脚本“显示地图通行度”才可打开。
  EDIT_MODE = false

  # 编辑方式(可整合鼠标脚本)
  EDIT_TRIGGER = -> { Input.trigger?(:C) }
  EDIT_POINT   = -> { [$game_player.x, $game_player.y] }

  # 设置区域通行度。可以使用 Range。
  PASSABLE_REGIONS   = []    # 可以通行的区域
  IMPASSABLE_REGIONS = []    # 不可通行的区域

  # 常量,不建议改动
  DEFAULT    = 0
  PASSABLE   = 1
  IMPASSABLE = 2
  TEXTS = ['△', '○', '×']

  SIZE = TEXTS.size

  # 通行度的哈希表。以地图ID为键,以通行度的二维 Table 为值。
  @data = File.exist?(FILE) ? load_data(FILE) : {}

  class << self

    # 获取 x, y 坐标处的通行度设定。(DEFAULT/PASSABLE/IMPASSABLE)
    def [](x, y)
      return data[x, y] if data[x, y] != DEFAULT
      rid = $game_map.region_id(x, y)
      return PASSABLE   if PASSABLE_REGIONS.any?   { |e| e === rid }
      return IMPASSABLE if IMPASSABLE_REGIONS.any? { |e| e === rid }
      DEFAULT
    end

    # 更新,编辑模式下应每帧调用一次
    def update
      return unless EDIT_TRIGGER.call
      x, y = EDIT_POINT.call
      data[x, y] = (data[x, y] + 1) % SIZE
      save
    end

    # 获取当前地图的数据
    def data
      table = @data[map_id] ||= Table.new(width, height)
      if table.xsize < width || table.ysize < height
        update_table(table)
      else
        table
      end
    end

    # 清除一个地图的设置
    def clear(map_id = $game_map.map_id)
      @data.delete(map_id)
      save
    end

    private

    # 如果表格不够大,那么重新建立表格
    def update_table(table)
      @data[map_id] = new_table = Table.new(width, height)
      table.xsize.times do |x|
        table.ysize.times do |y|
          new_table[x, y] = table[x, y]
        end
      end
      new_table
    end

    # 将所有数据保存到文件
    def save
      save_data(@data, FILE)
    end
  
    # 获取当前地图信息
    def map_id
      $game_map.map_id
    end

    def width
      $game_map.width
    end

    def height
      $game_map.height
    end
  end
end

class Game_Map
  psg = Taroxd::Passage

  def_chain :passable? do |old, x, y, d|
    case psg[x, y]
    when psg::DEFAULT    then old.call(x, y, d)
    when psg::PASSABLE   then true
    when psg::IMPASSABLE then false
    end
  end
end

if $TEST && Taroxd::Passage::EDIT_MODE

  class Game_Player < Game_Character
  
    # 每帧调用一次 Taroxd::Passage.update
    def_after :update, Taroxd::Passage.method(:update)

    def debug_through?
      true
    end
  end
  
  class Taroxd::PlanePassage < Plane
  
    TEXT_RECT = Rect.new(0, 0, 32, 32)
    const_set :VISIBLE, true
    psg = Taroxd::Passage
    include psg
  
    # 通行度文字的位图缓存
    def text_bitmaps
      @text_bitmap_cache ||= TEXTS.map do |text|
        bitmap = Bitmap.new(TEXT_RECT.width, TEXT_RECT.height)
        bitmap.draw_text(TEXT_RECT, text, 1)
        bitmap
      end
    end
  
    # 绘制通行度的设置情况
    def_after :draw_point do |x, y|
      bitmap.blt(x * 32, y * 32, text_bitmaps[psg.data[x, y]], TEXT_RECT)
    end
  
    # 更新通行度的变化
    def_after :update do
      return unless EDIT_TRIGGER.call
      x, y = EDIT_POINT.call
      bitmap.clear_rect(x * 32, y * 32, 32, 32)
      draw_point(x, y)
    end

    def_before :dispose do
      @text_bitmaps_cache.each(&:dispose) if @text_bitmaps
    end
  end
end[/pre]

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本发帖返回顶部