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

Project1

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

设置地图通行度

[复制链接]

…あたしは天使なんかじゃないわ

梦石
0
星屑
2207
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

跳转到指定楼层
1
发表于 2014-9-20 21:01:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2. # ● require Taroxd基础设置
  3. #    设置地图通行度
  4. #--------------------------------------------------------------------------
  5. #
  6. #  使用方法1:在“设置区域通行度”处填入一定可以通行的区域和一定不能通行的区域。
  7. #
  8. #    例:PASSABLE_REGIONS = [2, 5, 8..11]
  9. #        表明区域 2, 5, 8, 9, 10, 11 可以通行,无论上面是什么图块。
  10. #
  11. #  使用方法2:** require 显示地图通行度 **
  12. #
  13. #    测试模式下,把 EDIT_MODE 设为 true,
  14. #    然后在地图上按下确定键即可改变当前位置的通行度。
  15. #    该模式下,角色可以自由穿透。
  16. #
  17. #    △表示不改变,○表示可以通行,×表示不可通行。颜色表示最终的通行度。
  18. #
  19. #    需要清空设置的话,删除设置文件(见 FILE 常量)即可。
  20. #
  21. #    需要重置一张地图的设置的话,可以调用如下脚本:
  22. #      Taroxd::Passage.clear(map_id)
  23. #    其中 map_id 为地图 ID。若要清除当前地图的通行度,map_id 可以不填。
  24. #    注意,清除后,通行度的显示并不会立即改变。重新打开游戏即可看到效果。
  25. #
  26. #--------------------------------------------------------------------------
  27.  
  28. module Taroxd::Passage
  29.  
  30.   # 地图通行度信息会保存到这个文件。建议每次编辑前备份该文件。
  31.   FILE = 'Data/MapPassage.rvdata2'
  32.  
  33.   # 是否打开编辑模式。需要前置脚本“显示地图通行度”才可打开。
  34.   EDIT_MODE = false
  35.  
  36.   # 编辑方式(可整合鼠标脚本)
  37.   EDIT_TRIGGER = -> { Input.trigger?(:C) }
  38.   EDIT_POINT   = -> { [$game_player.x, $game_player.y] }
  39.  
  40.   # 设置区域通行度。可以使用 Range。
  41.   PASSABLE_REGIONS   = []    # 可以通行的区域
  42.   IMPASSABLE_REGIONS = []    # 不可通行的区域
  43.  
  44.   # 常量,不建议改动
  45.   DEFAULT    = 0
  46.   PASSABLE   = 1
  47.   IMPASSABLE = 2
  48.   TEXTS = ['△', '○', '×']
  49.  
  50.   SIZE = TEXTS.size
  51.  
  52.   # 通行度的哈希表。以地图ID为键,以通行度的二维 Table 为值。
  53.   @data = File.exist?(FILE) ? load_data(FILE) : {}
  54.  
  55.   class << self
  56.  
  57.     # 获取 x, y 坐标处的通行度设定。(DEFAULT/PASSABLE/IMPASSABLE)
  58.     def [](x, y)
  59.       return data[x, y] if data[x, y] != DEFAULT
  60.       rid = $game_map.region_id(x, y)
  61.       return PASSABLE   if PASSABLE_REGIONS.any?   { |e| e === rid }
  62.       return IMPASSABLE if IMPASSABLE_REGIONS.any? { |e| e === rid }
  63.       DEFAULT
  64.     end
  65.  
  66.     # 更新,编辑模式下应每帧调用一次
  67.     def update
  68.       return unless EDIT_TRIGGER.call
  69.       x, y = EDIT_POINT.call
  70.       data[x, y] = (data[x, y] + 1) % SIZE
  71.       save
  72.     end
  73.  
  74.     # 获取当前地图的数据
  75.     def data
  76.       table = @data[map_id] ||= Table.new(width, height)
  77.       if table.xsize < width || table.ysize < height
  78.         update_table(table)
  79.       else
  80.         table
  81.       end
  82.     end
  83.  
  84.     # 清除一个地图的设置
  85.     def clear(map_id = $game_map.map_id)
  86.       @data.delete(map_id)
  87.       save
  88.     end
  89.  
  90.     private
  91.  
  92.     # 如果表格不够大,那么重新建立表格
  93.     def update_table(table)
  94.       @data[map_id] = new_table = Table.new(width, height)
  95.       table.xsize.times do |x|
  96.         table.ysize.times do |y|
  97.           new_table[x, y] = table[x, y]
  98.         end
  99.       end
  100.       new_table
  101.     end
  102.  
  103.     # 将所有数据保存到文件
  104.     def save
  105.       save_data(@data, FILE)
  106.     end
  107.  
  108.     # 获取当前地图信息
  109.     def map_id
  110.       $game_map.map_id
  111.     end
  112.  
  113.     def width
  114.       $game_map.width
  115.     end
  116.  
  117.     def height
  118.       $game_map.height
  119.     end
  120.   end
  121. end
  122.  
  123. class Game_Map
  124.   psg = Taroxd::Passage
  125.  
  126.   def_chain :passable? do |old, x, y, d|
  127.     case psg[x, y]
  128.     when psg::DEFAULT    then old.call(x, y, d)
  129.     when psg::PASSABLE   then true
  130.     when psg::IMPASSABLE then false
  131.     end
  132.   end
  133. end
  134.  
  135. if $TEST && Taroxd::Passage::EDIT_MODE
  136.  
  137.   class Game_Player < Game_Character
  138.  
  139.     # 每帧调用一次 Taroxd::Passage.update
  140.     def_after :update, Taroxd::Passage.method(:update)
  141.  
  142.     def debug_through?
  143.       true
  144.     end
  145.   end
  146.  
  147.   class Taroxd::PlanePassage < Plane
  148.  
  149.     TEXT_RECT = Rect.new(0, 0, 32, 32)
  150.     const_set :VISIBLE, true
  151.     psg = Taroxd::Passage
  152.     include psg
  153.  
  154.     # 通行度文字的位图缓存
  155.     def text_bitmaps
  156.       @text_bitmap_cache ||= TEXTS.map do |text|
  157.         bitmap = Bitmap.new(TEXT_RECT.width, TEXT_RECT.height)
  158.         bitmap.draw_text(TEXT_RECT, text, 1)
  159.         bitmap
  160.       end
  161.     end
  162.  
  163.     # 绘制通行度的设置情况
  164.     def_after :draw_point do |x, y|
  165.       bitmap.blt(x * 32, y * 32, text_bitmaps[psg.data[x, y]], TEXT_RECT)
  166.     end
  167.  
  168.     # 更新通行度的变化
  169.     def_after :update do
  170.       return unless EDIT_TRIGGER.call
  171.       x, y = EDIT_POINT.call
  172.       bitmap.clear_rect(x * 32, y * 32, 32, 32)
  173.       draw_point(x, y)
  174.     end
  175.  
  176.     def_before :dispose do
  177.       @text_bitmaps_cache.each(&:dispose) if @text_bitmaps
  178.     end
  179.   end
  180. end
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-5-1 19:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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