设为首页收藏本站同能贴吧

同能网

 找回密码
 帐号注册

QQ登录

只需一步,快速开始

RPG Maker XP 让不懂编程的人也能做出精美的游戏来。 下载教程资源

RPG Maker VX 高效编辑、画面流畅、RGSS2脚本系统 下载教程脚本常见问题

RPG Maker VX Ace 同能网汉化版本、内置纸娃娃、全新的RGSS3 下载

搜索
查看: 1809|回复: 8
打印 上一主题 下一主题

[vx] 图块、通行度动态修改与扩展

[复制链接]
  • TA的每日心情
    开心
    2014-8-15 17:58
  • 签到天数: 1 天

    连续签到: 0 天

    [LV.1]初来乍到

    跳转到指定楼层
    楼主
    发表于 2011-7-6 10:33:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    #===============================================================================
    # ■  VX 简易地图扩张
    #-------------------------------------------------------------------------------
    #    *脚本说明及使用方法*
    #    => 参考引用网址
    #-------------------------------------------------------------------------------
    #    更新作者: 铃仙·优昙华院·因幡
    #    许可协议: FSL -DNR
    #    项目版本: 1.3.0614
    #    引用网址: http://bbs.66rpg.com/thread-155105-1-1.html
    #-------------------------------------------------------------------------------
    #    - *1.0.0828*  By 铃仙·优昙华院·因幡
    #      * 更新内容: 1.基本脚本组建
    #    - *1.1.0829*  By 铃仙·优昙华院·因幡
    #      * 更新内容: 1.添加 A系列模块替换功能
    #                  2.添加自动执行功能
    #    - *1.2.0913*  By 铃仙·优昙华院·因幡
    #      * 更新内容: 1.优化脚本结构
    #                  2.添加动态修改B C D E中某图块通行度功能
    #                  3.添加动态修改针对某地图坐标的通行度功能
    #                  4.附赠送查看地图图块ID脚本插件,详细请查阅《图块ID查看》
    #    - *1.3.0614*  By 铃仙·优昙华院·因幡
    #      * 更新内容: 1.修正在多次切换同一张地图后,出现图块读取错误的 BUG
    #                  2.优化整体甲苯结构
    #                  3.优化使用方法
    #===============================================================================

    $fscript = {} if $fscript == nil
    $fscript["*MapExpansion*"] = "1.3.0614"
       
    #==============================================================================
    # ■ reisen_module
    #------------------------------------------------------------------------------
    #  配置模块
    #==============================================================================

    module FSL
      module ReisenMapExpansion
       
        ALL_MAP   = "A1A2A3A4A5BCDE"
        A_MAP     = "A1A2A3A4A5"
        NOT_A_MAP = "BCDE"
       
        # 地图自动切换设定
        MAP_DATA = {
        # 地图ID => 方案
            2    => 2,
        }
       
        CAN     = 0x06
        NOT_CAN = 0x0f
        HIGH    = 0x16
       
        # 单块地图通行设定
        MAP_TILE_ID_PASSAGE = {
        # [地图ID,x,y] => [通行度]
          [ 1, 5, 5]   => [NOT_CAN],
        }
      end
      
      module Timap_id
        TIMAPID = ["TileA1", "TileA2", "TileA3", "TileA4", "TileA5", "TileB",
          "TileC", "TileD", "TileE"]
      end
       
    end

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

    class Game_Map
      #--------------------------------------------------------------------------
      # ● 定义实例变量
      #--------------------------------------------------------------------------
      attr_accessor :game_timap_need_refresh
      attr_reader   :game_timap_id
      CAN     = FSL::ReisenMapExpansion::CAN
      NOT_CAN = FSL::ReisenMapExpansion::NOT_CAN
      HIGH    = FSL::ReisenMapExpansion::HIGH
      #--------------------------------------------------------------------------
      # ● 初始化对像
      #--------------------------------------------------------------------------
      alias reisen_map_expansion_initialize initialize
      def initialize
        @game_timap_id = nil
        @game_timap_need_refresh = false
        @map_tile_xy_passage = FSL::ReisenMapExpansion::MAP_TILE_ID_PASSAGE
        reisen_map_expansion_initialize
      end
      #--------------------------------------------------------------------------
      # ● 可以通行判定
      #     x : X 坐标
      #     y : Y 坐标
      #     flag : 通行度标志(非交通工具时,一般为 0x01)
      #--------------------------------------------------------------------------
      alias reisen_map_expansion_passable? passable?
      def passable?(x, y, flag = 0x01)
        return false if @map_tile_xy_passage[[@map_id, x, y]] == [NOT_CAN]
        reisen_map_expansion_passable?(x, y, flag)
      end
      #--------------------------------------------------------------------------
      # ● 设置
      #     map_id : 地图 ID
      #--------------------------------------------------------------------------
      alias reisen_map_expansion_setup setup
      def setup(map_id)
        reisen_map_expansion_setup(map_id)
        if FSL::ReisenMapExpansion::MAP_DATA[map_id] != nil
          reisen_map_data = FSL::ReisenMapExpansion::MAP_DATA[map_id]
          change_tilemap(reisen_map_data)
        end
      end
      #--------------------------------------------------------------------------
      # ● 设置单个坐标通行度
      #--------------------------------------------------------------------------
      def set_tile_id_passages(map_id, x, y, flag)
        @map_tile_xy_passage[[map_id, x, y]] = flag
      end
      #--------------------------------------------------------------------------
      # ● 获取通行度
      #--------------------------------------------------------------------------
      def get_passages
        unless @game_timap_id
          @passages = $data_system.passages
        else
          @passages = (load_data("Data/System_#{@game_timap_id}.rvdata")).passages
        end
      end
      #--------------------------------------------------------------------------
      # ● 刷新
      #--------------------------------------------------------------------------
      def refresh
        if @map_id > 0
          get_passages
          for event in @events.values
            event.refresh
          end
          for common_event in @common_events.values
            common_event.refresh
          end
        end
        @need_refresh = false
      end
      #--------------------------------------------------------------------------
      # ● 更改单个地图元件通行度
      #--------------------------------------------------------------------------
      def chang_tile_passage(tile_id, flag)
        if tile_id <= 2000
          @passages[tile_id] = flag
        end
      end
      #--------------------------------------------------------------------------
      # ● 更改地图元件与通行度
      #--------------------------------------------------------------------------
      def change_tilemap(index)
        if $scene.is_a?(Scene_Map)
          @game_timap_id = index
          get_passages
          @game_timap_need_refresh = true
        end
      end
    end

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

    class Spriteset_Map
      #--------------------------------------------------------------------------
      # ● 生成地图元件
      #--------------------------------------------------------------------------
      def create_tilemap
        @tilemap = Tilemap.new(@viewport1)
        @titlemap_name = []
        load_tilemap
      end
      #--------------------------------------------------------------------------
      # ● 加载 原件
      #--------------------------------------------------------------------------
      def load_tilemap
        (0..8).each do |i|
          filename = "#{FSL::Timap_id::TIMAPID}_#{$game_map.game_timap_id}"
          if @titlemap_name != filename
            if FileTest.exist?("Graphics/System/" + filename + ".png")
              @tilemap.bitmaps.dispose if @tilemap.bitmaps
              @tilemap.bitmaps = Cache.system(filename)
              @titlemap_name = filename
            else
              @tilemap.bitmaps.dispose if @tilemap.bitmaps
              @tilemap.bitmaps = Cache.system(FSL::Timap_id::TIMAPID)
              @titlemap_name = FSL::Timap_id::TIMAPID + "_"
            end
          end
        end
        @tilemap.map_data = $game_map.data
        @tilemap.passages = $game_map.passages
      end
      #--------------------------------------------------------------------------
      # ● 更新地图元件
      #--------------------------------------------------------------------------
      alias reisen_update_tilemap update_tilemap
      def update_tilemap
        if $game_map.game_timap_need_refresh
          load_tilemap
          $game_map.game_timap_need_refresh = false
        end
        reisen_update_tilemap
      end
      #--------------------------------------------------------------------------
      # ● 更改地图元件
      #--------------------------------------------------------------------------
      def change_tilemap
        load_tilemap
      end
    end
    #==============================================================================
    # ■ Scene_Map
    #------------------------------------------------------------------------------
    #  处理地图画面的类。
    #==============================================================================

    class Scene_Map < Scene_Base
      #--------------------------------------------------------------------------
      # ● 定义实例变量
      #--------------------------------------------------------------------------
      attr_accessor :spriteset
    end

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

    class Game_Interpreter
      #--------------------------------------------------------------------------
      # ● 常量
      #--------------------------------------------------------------------------
      CAN     = FSL::ReisenMapExpansion::CAN
      NOT_CAN = FSL::ReisenMapExpansion::NOT_CAN
      HIGH    = FSL::ReisenMapExpansion::HIGH
      #--------------------------------------------------------------------------
      # ● 更改单个地图元件通行度
      #--------------------------------------------------------------------------
      def chang_tile_passage(tile_id, flag)
        $game_map.chang_tile_passage(tile_id, flag)
      end
      #--------------------------------------------------------------------------
      # ● 切换地图元件与通行度
      #--------------------------------------------------------------------------
      def change_tilemap(index)
        $game_map.change_tilemap(index)
      end
      #--------------------------------------------------------------------------
      # ● 设置单个坐标通行度
      #--------------------------------------------------------------------------
      def set_id_passages(map_id, x, y, flag)
        $game_map.set_tile_id_passages(map_id, x, y, flag)
      end
    end



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

       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数字即可


    class Game_Map
    #--------------------------------------------------------------------------
    # ● 获取图块ID
    #--------------------------------------------------------------------------
      def get_tile_id(x, y, n)
        @map.data[x, y, (n % 3)]
      end
    end

    class Window_reisen_Map < Window_Base
      def initialize
        super(0, 0, 100, 140)
        @old_x, @old_y = -1, -1
        update
      end
      def update
        if @old_x != $game_player.x or @old_y != $game_player.y
          @old_x, @old_y = $game_player.x, $game_player.y
          self.contents.clear
          self.contents.draw_text(0, 0, 100, 32, "0:#{$game_map.get_tile_id(@old_x, @old_y, 0) - 2000}")
          self.contents.draw_text(0,32, 100, 32, "1:#{$game_map.get_tile_id(@old_x, @old_y, 1)}")
          self.contents.draw_text(0,64, 100, 32, "2:#{$game_map.get_tile_id(@old_x, @old_y, 2)}")
        end
      end
    end

    class Scene_Map < Scene_Base
      alias reisen_old_initialize initialize
      def initialize
        reisen_old_initialize
        @window_reisen_map = Window_reisen_Map.new
      end
      alias reisen_old_update update
      def update
        @window_reisen_map.update
        reisen_old_update
      end
      alias reisen_old_terminate terminate
      def terminate
        reisen_old_terminate
        @window_reisen_map.dispose
      end
    end










    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 转播转播 分享分享1 分享淘帖
  • TA的每日心情
    开心
    2025-7-22 00:43
  • 签到天数: 322 天

    连续签到: 1 天

    [LV.8]以坛为家III

    沙发
    发表于 2011-7-6 10:36:22 | 只看该作者
    呵呵,不错支持下
  • TA的每日心情
    无聊
    2013-7-21 22:15
  • 签到天数: 3 天

    连续签到: 0 天

    [LV.2]偶尔看看I

    藤椅
    发表于 2011-7-10 07:43:22 | 只看该作者

    该用户从未签到

    板凳
    发表于 2013-6-9 17:13:57 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽

    该用户从未签到

    报纸
    发表于 2013-6-13 20:57:41 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽

    该用户从未签到

    地板
    发表于 2013-6-14 19:32:21 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽

    该用户从未签到

    7
    发表于 2013-6-16 15:07:19 | 只看该作者

    支持!

    看贴不回贴 都什么习惯呀? <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>美白面膜

    该用户从未签到

    8
    发表于 2013-6-23 04:13:26 | 只看该作者

    支持!

    顶起来,受教了,支持支持<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>美白食物

    该用户从未签到

    9
    发表于 2013-8-6 20:22:35 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽
    您需要登录后才可以回帖 登录 | 帐号注册

    本版积分规则

    QQ|申请友链|关于我们|小黑屋|手机版|简洁版|同能网 ( 沪ICP备12027754号-3 )  

    GMT+8, 2026-5-16 21:32 , Processed in 0.160257 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.1

    © 2001-2013 Comsenz Inc.

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