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

Project1

 找回密码
 注册会员
搜索
查看: 15133|回复: 28

[RMVX发布] [vx] 图块、通行度动态修改与扩展 V1.3.0614 (2011-6-14日更新)

[复制链接]

Lv1.梦旅人

神隐的主犯

梦石
0
星屑
90
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

发表于 2010-8-28 18:06:33 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 八云紫 于 2013-10-25 13:21 编辑

好吧,这个脚本感觉和 流星姐 的那个脚本撞车了,不过还是发一下吧.
http://pan.baidu.com/s/1mVzOP
更新后的脚本如下
  1. #===============================================================================
  2. # ■  VX 简易地图扩张
  3. #-------------------------------------------------------------------------------
  4. #    *脚本说明及使用方法*
  5. #    => 参考引用网址
  6. #-------------------------------------------------------------------------------
  7. #    更新作者: 铃仙·优昙华院·因幡
  8. #    许可协议: FSL -DNR
  9. #    项目版本: 1.3.0614
  10. #    引用网址: http://rpg.blue/thread-155105-1-1.html
  11. #-------------------------------------------------------------------------------
  12. #    - *1.0.0828*  By 铃仙·优昙华院·因幡
  13. #      * 更新内容: 1.基本脚本组建
  14. #    - *1.1.0829*  By 铃仙·优昙华院·因幡
  15. #      * 更新内容: 1.添加 A系列模块替换功能
  16. #                  2.添加自动执行功能
  17. #    - *1.2.0913*  By 铃仙·优昙华院·因幡
  18. #      * 更新内容: 1.优化脚本结构
  19. #                  2.添加动态修改B C D E中某图块通行度功能
  20. #                  3.添加动态修改针对某地图坐标的通行度功能
  21. #                  4.附赠送查看地图图块ID脚本插件,详细请查阅《图块ID查看》
  22. #    - *1.3.0614*  By 铃仙·优昙华院·因幡
  23. #      * 更新内容: 1.修正在多次切换同一张地图后,出现图块读取错误的 BUG
  24. #                  2.优化整体甲苯结构
  25. #                  3.优化使用方法
  26. #===============================================================================

  27. $fscript = {} if $fscript == nil
  28. $fscript["*MapExpansion*"] = "1.3.0614"
  29.    
  30. #==============================================================================
  31. # ■ reisen_module
  32. #------------------------------------------------------------------------------
  33. #  配置模块
  34. #==============================================================================

  35. module FSL
  36.   module ReisenMapExpansion
  37.    
  38.     ALL_MAP   = "A1A2A3A4A5BCDE"
  39.     A_MAP     = "A1A2A3A4A5"
  40.     NOT_A_MAP = "BCDE"
  41.    
  42.     # 地图自动切换设定
  43.     MAP_DATA = {
  44.     # 地图ID => 方案
  45.         2    => 2,
  46.     }
  47.    
  48.     CAN     = 0x06
  49.     NOT_CAN = 0x0f
  50.     HIGH    = 0x16
  51.    
  52.     # 单块地图通行设定
  53.     MAP_TILE_ID_PASSAGE = {
  54.     # [地图ID,x,y] => [通行度]
  55.       [ 1, 5, 5]   => [NOT_CAN],
  56.     }
  57.   end
  58.   
  59.   module Timap_id
  60.     TIMAPID = ["TileA1", "TileA2", "TileA3", "TileA4", "TileA5", "TileB",
  61.       "TileC", "TileD", "TileE"]
  62.   end
  63.    
  64. end

  65. #==============================================================================
  66. # ■ Game_Map
  67. #------------------------------------------------------------------------------
  68. #  处理地图的类。包含卷动以及可以通行的判断功能。本类的实例请参考 $game_map 。
  69. #==============================================================================

  70. class Game_Map
  71.   #--------------------------------------------------------------------------
  72.   # ● 定义实例变量
  73.   #--------------------------------------------------------------------------
  74.   attr_accessor :game_timap_need_refresh
  75.   attr_reader   :game_timap_id
  76.   CAN     = FSL::ReisenMapExpansion::CAN
  77.   NOT_CAN = FSL::ReisenMapExpansion::NOT_CAN
  78.   HIGH    = FSL::ReisenMapExpansion::HIGH
  79.   #--------------------------------------------------------------------------
  80.   # ● 初始化对像
  81.   #--------------------------------------------------------------------------
  82.   alias reisen_map_expansion_initialize initialize
  83.   def initialize
  84.     @game_timap_id = nil
  85.     @game_timap_need_refresh = false
  86.     @map_tile_xy_passage = FSL::ReisenMapExpansion::MAP_TILE_ID_PASSAGE
  87.     reisen_map_expansion_initialize
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 可以通行判定
  91.   #     x : X 坐标
  92.   #     y : Y 坐标
  93.   #     flag : 通行度标志(非交通工具时,一般为 0x01)
  94.   #--------------------------------------------------------------------------
  95.   alias reisen_map_expansion_passable? passable?
  96.   def passable?(x, y, flag = 0x01)
  97.     return false if @map_tile_xy_passage[[@map_id, x, y]] == [NOT_CAN]
  98.     reisen_map_expansion_passable?(x, y, flag)
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● 设置
  102.   #     map_id : 地图 ID
  103.   #--------------------------------------------------------------------------
  104.   alias reisen_map_expansion_setup setup
  105.   def setup(map_id)
  106.     reisen_map_expansion_setup(map_id)
  107.     if FSL::ReisenMapExpansion::MAP_DATA[map_id] != nil
  108.       reisen_map_data = FSL::ReisenMapExpansion::MAP_DATA[map_id]
  109.       change_tilemap(reisen_map_data)
  110.     end
  111.   end
  112.   #--------------------------------------------------------------------------
  113.   # ● 设置单个坐标通行度
  114.   #--------------------------------------------------------------------------
  115.   def set_tile_id_passages(map_id, x, y, flag)
  116.     @map_tile_xy_passage[[map_id, x, y]] = flag
  117.   end
  118.   #--------------------------------------------------------------------------
  119.   # ● 获取通行度
  120.   #--------------------------------------------------------------------------
  121.   def get_passages
  122.     unless @game_timap_id
  123.       @passages = $data_system.passages
  124.     else
  125.       @passages = (load_data("Data/System_#{@game_timap_id}.rvdata")).passages
  126.     end
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 刷新
  130.   #--------------------------------------------------------------------------
  131.   def refresh
  132.     if @map_id > 0
  133.       get_passages
  134.       for event in @events.values
  135.         event.refresh
  136.       end
  137.       for common_event in @common_events.values
  138.         common_event.refresh
  139.       end
  140.     end
  141.     @need_refresh = false
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # ● 更改单个地图元件通行度
  145.   #--------------------------------------------------------------------------
  146.   def chang_tile_passage(tile_id, flag)
  147.     if tile_id <= 2000
  148.       @passages[tile_id] = flag
  149.     end
  150.   end
  151.   #--------------------------------------------------------------------------
  152.   # ● 更改地图元件与通行度
  153.   #--------------------------------------------------------------------------
  154.   def change_tilemap(index)
  155.     if $scene.is_a?(Scene_Map)
  156.       @game_timap_id = index
  157.       get_passages
  158.       @game_timap_need_refresh = true
  159.     end
  160.   end
  161. end

  162. #==============================================================================
  163. # ■ Spriteset_Map
  164. #------------------------------------------------------------------------------
  165. #  处理地图画面活动块和元件的类。本类在 Scene_Map 类的内部使用。
  166. #==============================================================================

  167. class Spriteset_Map
  168.   #--------------------------------------------------------------------------
  169.   # ● 生成地图元件
  170.   #--------------------------------------------------------------------------
  171.   def create_tilemap
  172.     @tilemap = Tilemap.new(@viewport1)
  173.     @titlemap_name = []
  174.     load_tilemap
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # ● 加载 原件
  178.   #--------------------------------------------------------------------------
  179.   def load_tilemap
  180.     (0..8).each do |i|
  181.       filename = "#{FSL::Timap_id::TIMAPID[i]}_#{$game_map.game_timap_id}"
  182.       if @titlemap_name[i] != filename
  183.         if FileTest.exist?("Graphics/System/" + filename + ".png")
  184.           @tilemap.bitmaps[i].dispose if @tilemap.bitmaps[i]
  185.           @tilemap.bitmaps[i] = Cache.system(filename)
  186.           @titlemap_name[i] = filename
  187.         else
  188.           @tilemap.bitmaps[i].dispose if @tilemap.bitmaps[i]
  189.           @tilemap.bitmaps[i] = Cache.system(FSL::Timap_id::TIMAPID[i])
  190.           @titlemap_name[i] = FSL::Timap_id::TIMAPID[i] + "_"
  191.         end
  192.       end
  193.     end
  194.     @tilemap.map_data = $game_map.data
  195.     @tilemap.passages = $game_map.passages
  196.   end
  197.   #--------------------------------------------------------------------------
  198.   # ● 更新地图元件
  199.   #--------------------------------------------------------------------------
  200.   alias reisen_update_tilemap update_tilemap
  201.   def update_tilemap
  202.     if $game_map.game_timap_need_refresh
  203.       load_tilemap
  204.       $game_map.game_timap_need_refresh = false
  205.     end
  206.     reisen_update_tilemap
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # ● 更改地图元件
  210.   #--------------------------------------------------------------------------
  211.   def change_tilemap
  212.     load_tilemap
  213.   end
  214. end
  215. #==============================================================================
  216. # ■ Scene_Map
  217. #------------------------------------------------------------------------------
  218. #  处理地图画面的类。
  219. #==============================================================================

  220. class Scene_Map < Scene_Base
  221.   #--------------------------------------------------------------------------
  222.   # ● 定义实例变量
  223.   #--------------------------------------------------------------------------
  224.   attr_accessor :spriteset
  225. end

  226. #==============================================================================
  227. # ■ Game_Interpreter
  228. #------------------------------------------------------------------------------
  229. #  执行事件命令的解释器。本类在 Game_Map 类、Game_Troop 类、与
  230. # Game_Event 类的内部使用。
  231. #==============================================================================

  232. class Game_Interpreter
  233.   #--------------------------------------------------------------------------
  234.   # ● 常量
  235.   #--------------------------------------------------------------------------
  236.   CAN     = FSL::ReisenMapExpansion::CAN
  237.   NOT_CAN = FSL::ReisenMapExpansion::NOT_CAN
  238.   HIGH    = FSL::ReisenMapExpansion::HIGH
  239.   #--------------------------------------------------------------------------
  240.   # ● 更改单个地图元件通行度
  241.   #--------------------------------------------------------------------------
  242.   def chang_tile_passage(tile_id, flag)
  243.     $game_map.chang_tile_passage(tile_id, flag)
  244.   end
  245.   #--------------------------------------------------------------------------
  246.   # ● 切换地图元件与通行度
  247.   #--------------------------------------------------------------------------
  248.   def change_tilemap(index)
  249.     $game_map.change_tilemap(index)
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # ● 设置单个坐标通行度
  253.   #--------------------------------------------------------------------------
  254.   def set_id_passages(map_id, x, y, flag)
  255.     $game_map.set_tile_id_passages(map_id, x, y, flag)
  256.   end
  257. end
复制代码
下载范例(2011-6-14日更新): 正在上传

最后是用法,有点点复杂.

   1. 请先记住几个关键的文件
       1) System.rvdata      包含通行度的数据文件 ,位于 data/ 里
       2) MapXXX.rvdata     地图数据文件,包含 ID 为 XXX 的地图所有数据,
位于 data/ 里
       3) TileB.png TileC.png TileD.png TileE.png
           包含地图元件的图片素材, B 对应 B图块, 以此类推, 位于
Graphics/System/ 里

   2. 当你的地图元件不够使用的时候,请打开另一个 VX ,将需要相加的地图
元件添加或替换新建的工程(个人认为自己工程的复制更好)里,然后画
地图,设定事件什么的.
   
   3. 都做完后,请一次点击 测试 -> 打开游戏目录 , 找到 Data 文件夹, 将里
面的 System.rvdata 重命名为 System_X.rvdata, 其中 X 为数字, 要记住这个
数字,因为后面也要使用. 将需要替换的图块也这样重命名, 比如我替换掉了 B
图块, 那么将 TileB.png 重命名为 TileB_X.png 这里的 X 要与之前的相同. 将
重命名后的  System_X.rvdata TileB_X.png MapXXX.rvdata(这里
要注意 MapXXX 不要和自己工程里的地图数据重名)
复制到自己的游戏
工程的响应文件夹里.

   4. 以上完成后, 使用事件脚本, 写上脚本:  change_tilemap(index, str, bool)
       其中:
          index: 图块替换方案ID , 其实就是第 3 步里的那个 X . 填写 nil 的话,就
   是使用这个工程默认的图块和通行度
          str: 需要替换的图块, 比如需要替换 B 图块, 就是 "B"; 替换多个就写在一
    起, 比如要替换 B D E 三个, 那么就是 "BDE"
          bool : 保留, 填 0 就可以了.
  比如范例的: change_tilemap(2, "B", false) 使用方案2 , 替换掉 B 图块. false 无视.

    5. 目前只能替换 B C D E 四个图块的素材, 但是 通行度 是可以全部替换掉的.

    6. 可以动态修改, 也就是说, 不需要切换地图就可以看到更改后的地图~~





   [1.2] 版本更新后使用方法:
    1. 替换默认图块等方法参考上面。
    2. 针对 B C D E 图块的通行度修改,注意,是对某个图块的全部修改,通行度替换后,修改无效。
      使用方法:
       事件 -> 脚本 -> chang_tile_passage(tile_id, flag)
          其中: tile_id -> 图块ID  0~2000 之间
              flag -> 通行标志,可以有如下值  CAN:可以通行,NOT_CAN:不可通行
    3. 针对坐标的通行度修改,注意,是对某个坐标的修改,通行度替换后,修改依旧有效。
       使用方法:
       事件 -> 脚本 -> chang_tile_passageset_id_passages(map_id, x, y, flag)
          其中: map_id, x, y -> 地图ID , X Y坐标
              flag -> 通行标志,可以有如下值  CAN:可以通行,NOT_CAN:不可通行
    4. 附送图块ID 查看脚本, 使用时,填写 "2:XX" 那个 XX数字即可


  1. class Game_Map
  2. #--------------------------------------------------------------------------
  3. # ● 获取图块ID
  4. #--------------------------------------------------------------------------
  5.   def get_tile_id(x, y, n)
  6.     @map.data[x, y, (n % 3)]
  7.   end
  8. end

  9. class Window_reisen_Map < Window_Base
  10.   def initialize
  11.     super(0, 0, 100, 140)
  12.     @old_x, @old_y = -1, -1
  13.     update
  14.   end
  15.   def update
  16.     if @old_x != $game_player.x or @old_y != $game_player.y
  17.       @old_x, @old_y = $game_player.x, $game_player.y
  18.       self.contents.clear
  19.       self.contents.draw_text(0, 0, 100, 32, "0:#{$game_map.get_tile_id(@old_x, @old_y, 0) - 2000}")
  20.       self.contents.draw_text(0,32, 100, 32, "1:#{$game_map.get_tile_id(@old_x, @old_y, 1)}")
  21.       self.contents.draw_text(0,64, 100, 32, "2:#{$game_map.get_tile_id(@old_x, @old_y, 2)}")
  22.     end
  23.   end
  24. end

  25. class Scene_Map < Scene_Base
  26.   alias reisen_old_initialize initialize
  27.   def initialize
  28.     reisen_old_initialize
  29.     @window_reisen_map = Window_reisen_Map.new
  30.   end
  31.   alias reisen_old_update update
  32.   def update
  33.     @window_reisen_map.update
  34.     reisen_old_update
  35.   end
  36.   alias reisen_old_terminate terminate
  37.   def terminate
  38.     reisen_old_terminate
  39.     @window_reisen_map.dispose
  40.   end
  41. end
复制代码


就是这样的吧, 有什么 BUG 或者建议请回帖说明.

MapExpansion.rar

2.65 MB, 下载次数: 32419

点评

围观 レイセン・うどんげいん・イナバ  发表于 2011-8-19 18:06

评分

参与人数 4星屑 +608 +6 收起 理由
小幽的马甲 + 6
lzy136188230 + 2
小角色 + 600 这样就可以虐自己了T-T
untrueterry + 6 上次那个日文版,这个更容易看懂,先下载范 ...

查看全部评分


《天空之城 —— 破碎的命运》

Lv1.梦旅人

梦石
0
星屑
85
在线时间
1564 小时
注册时间
2008-7-30
帖子
4425

贵宾

发表于 2010-8-28 18:08:09 | 显示全部楼层
好详尽的帮助O_O

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

战国美少年森兰丸

梦石
0
星屑
199
在线时间
852 小时
注册时间
2008-7-20
帖子
3705
发表于 2010-8-28 18:10:03 | 显示全部楼层
了解了,看上去用法也是相当简单,回去测试一下!待编辑
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
3 小时
注册时间
2010-7-28
帖子
307
发表于 2010-8-28 18:36:23 | 显示全部楼层
初步测试结果,显示方面无问题
这下帮我解决了最需要解决的问题了
多谢~~!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

神隐的主犯

梦石
0
星屑
90
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

 楼主| 发表于 2010-8-28 18:43:54 | 显示全部楼层
回复 untrueterry 的帖子

显示和通行度测试了,问题应该没有.

现在只是脚本调用函数的时候就会马上改变,有点不好就是了~~

   
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-7-18
帖子
58
发表于 2010-8-28 22:21:31 | 显示全部楼层
这个很强大啊~地图更加丰富化了

点评

遇到什么问题或者BUG或者建议的,可以PM我哦~~~  发表于 2010-8-28 22:50
簽名被和諧了==
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
416 小时
注册时间
2006-10-21
帖子
1245
发表于 2010-8-28 22:58:23 | 显示全部楼层
重命名为 System_X.rvdata之后不用切换就能在编辑里直接看到?还是必须要使用change_tilemap(index, str, bool)?使用事件的话就是半自动的?需要执行自动事件?
我记得有个简单扩张的也是需要System_X.rvdata这样 但是编辑地图的话还是只能看到当前图块的 只能进入游戏才能看到替换的样子

点评

已更新,欢迎测试~~~~  发表于 2010-8-29 14:37
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
3 小时
注册时间
2010-7-28
帖子
307
发表于 2010-8-28 23:01:52 | 显示全部楼层
回复 wangswz 的帖子


    确实如你所说,而且目前这个脚本还无法实现自动执行,另外加上无法启用TileA,
这个脚本还待完善,暂时没有发现BUG

点评

加上 TileA 也可以,之前感觉没啥必要替换 A 元件. 自动执行么? 我去更新~~~  发表于 2010-8-28 23:15
回复 支持 反对

使用道具 举报

Lv1.梦旅人

神隐的主犯

梦石
0
星屑
90
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

 楼主| 发表于 2010-8-28 23:05:02 | 显示全部楼层
回复 wangswz 的帖子

可以打开另一个 VX 来画地图. 这样就可以看到了.

不过 推荐是 将自己的工程复制一份, 然后用替换后的图块来画地图, 这样可以避免新建地图的时候, 新地图的信息问题.

画好后 , 再修改复制到自己原来的工程就可以了~~~

点评

拿回学校好好调教一番  发表于 2010-8-29 15:41
明白了. 应该用的是雪流星姐翻译的那个脚本吧~~~  发表于 2010-8-28 23:27
哦 我的那个图块扩张用的是这样设置的模块 俺觉得这样设置起来比较方便。。 然后通行度是加入_X这样的文件。。  发表于 2010-8-28 23:22
那样到头来还是需要移动素材,重命名什么的. 结果都一样,感觉更麻烦~~~~  发表于 2010-8-28 23:13
希望加上类似 数组=『地图ID=》{A=>A2}』这样的用户设定模块~  发表于 2010-8-28 23:11
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
3 小时
注册时间
2010-7-28
帖子
307
发表于 2010-8-28 23:17:25 | 显示全部楼层
本帖最后由 untrueterry 于 2010-8-28 23:19 编辑

A元件替换关系到图层问题,虽然可以用2、3背景脚本
自动执行就有实现的必要了,否则就变成魔法城市了。。。
LZ打算帮我实现那2个愿望么?
那我先谢过了,期待你的更新大作

点评

已更新,欢迎测试~~~~  发表于 2010-8-29 14:37
回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-1-19 08:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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