Project1

标题: 我要造房子!修改地图元件 [打印本页]

作者: yangff    时间: 2008-5-31 16:36
标题: 我要造房子!修改地图元件
2008年6.1更新发现:
RMXP的数据库实际支持宽度,高度〉500的地图,只是编辑器作了限制。
使用newmap可以建立宽度,高度〉500的地图
但是系统自动为他们涂上背景,要循环500*500次,所以很正常的失败了 {/hx}
2008年6.1再次更新
to:暴风龙,错误修正了 {/cy}
范例更新:
http://rpg.blue/upload_program/files/Save_Map!Yes!_92755880.rar
本脚本修改了
Scene_Load
Scene_Save
Scene_Title
Game_Map
冲突较大
如:
四处留情(一个改事件,一个改地图,能不冲突吗?)
股票(债券系统)
(涉及
Scene_Load
Scene_Save
修改)
本脚本用处:
    比如您想在地图的2*2到5*5的地方造一个房子,一般只能用事件.很卡.
使用这个脚本只需要:
                  edit(mapid,x,y,lv,dat)
就可以修改任意地图,id的任意层的地图元件。
使用本脚本可以延伸出事件的修改//
使用方法:
         edit(mapid,x,y,lv,dat)
         实现:修改某个地图的某一格
         使用:
             mapid:要修改的地图id
             x,y,lv:要修改的x,y,层(0、1、2)
             dat:要替换的内容,不支持自动元件,从384开始
         editbymap(mapid,x,y,mapid1,x1,y1,w1,h1)
         实现:edit功能只能一格一格修改,不方便。
               这个程序可以从其他地图拷贝一块到当前地图。
         使用:
               mapid:要修改的地图id
               x,y:要修改的地图的x,y
               mapid1:地图库
               x1,y1,w1,h1:从x1,y1开始复制大小为w1,h1的地图元件到mapid的x,y
newmap(h,w,tileset)
         实现:创建新地图
         使用:
             h,w:新地图大小
             tileset:地图所使用图块的 ID。

脚本内容:
  1. #==============================================================================
  2. # ■ Scene_Load
  3. #------------------------------------------------------------------------------
  4. #  处理读档画面的类。
  5. #==============================================================================

  6. class Scene_Load < Scene_File
  7.   #--------------------------------------------------------------------------
  8.   # ● 读取存档数据
  9.   #     file : 读取用文件对像 (已经打开)
  10.   #--------------------------------------------------------------------------
  11.   def read_save_data(file)
  12.     # 读取描绘存档文件用的角色数据
  13.     characters = Marshal.load(file)
  14.     # 读取测量游戏时间用画面计数
  15.     Graphics.frame_count = Marshal.load(file)
  16.     # 读取各种游戏对像
  17.     $game_system        = Marshal.load(file)
  18.     $game_switches      = Marshal.load(file)
  19.     $game_variables     = Marshal.load(file)
  20.     $game_self_switches = Marshal.load(file)
  21.     $game_screen        = Marshal.load(file)
  22.     $game_actors        = Marshal.load(file)
  23.     $game_party         = Marshal.load(file)
  24.     $game_troop         = Marshal.load(file)
  25.     $mapdat             = Marshal.load(file)
  26.     $game_map           = Marshal.load(file)
  27.     $game_player        = Marshal.load(file)
  28.     # 魔法编号与保存时有差异的情况下
  29.     # (加入编辑器的编辑过的数据)
  30.     if $game_system.magic_number != $data_system.magic_number
  31.       # 重新装载地图
  32.       $game_map.setup($game_map.map_id)
  33.       $game_player.center($game_player.x, $game_player.y)
  34.     end
  35.     # 刷新同伴成员
  36.     $game_party.refresh
  37.   end
  38. end
  39. #==============================================================================
  40. # ■ Scene_Title
  41. #------------------------------------------------------------------------------
  42. #  处理标题画面的类。
  43. #==============================================================================

  44. class Scene_Title
  45.   #--------------------------------------------------------------------------
  46.   # ● 命令 : 新游戏
  47.   #--------------------------------------------------------------------------
  48.   def command_new_game
  49.     # 演奏确定 SE
  50.     $game_system.se_play($data_system.decision_se)
  51.     # 停止 BGM
  52.     Audio.bgm_stop
  53.     # 重置测量游戏时间用的画面计数器
  54.     Graphics.frame_count = 0
  55.     # 生成各种游戏对像
  56.     $game_temp          = Game_Temp.new
  57.     $game_system        = Game_System.new
  58.     $game_switches      = Game_Switches.new
  59.     $game_variables     = Game_Variables.new
  60.     $game_self_switches = Game_SelfSwitches.new
  61.     $game_screen        = Game_Screen.new
  62.     $game_actors        = Game_Actors.new
  63.     $game_party         = Game_Party.new
  64.     $game_troop         = Game_Troop.new
  65.     $mapdat = []
  66.     for i in 1...1000
  67.       file = sprintf("Data/Map%03d.rxdata", i)
  68.       if FileTest.exist?(file)
  69.         $mapdat.push(load_data(sprintf("Data/Map%03d.rxdata", i)))
  70.       end
  71.     end
  72.     $game_map           = Game_Map.new
  73.     $game_player        = Game_Player.new
  74.     # 设置初期同伴位置
  75.     $game_party.setup_starting_members
  76.     # 设置初期位置的地图
  77.     $game_map.setup($data_system.start_map_id)
  78.     # 主角向初期位置移动
  79.     $game_player.moveto($data_system.start_x, $data_system.start_y)
  80.     # 刷新主角
  81.     $game_player.refresh
  82.     # 执行地图设置的 BGM 与 BGS 的自动切换
  83.     $game_map.autoplay
  84.     # 刷新地图 (执行并行事件)
  85.     $game_map.update
  86.     # 切换地图画面
  87.     $scene = Scene_Map.new
  88.   end
  89. end
  90. #==============================================================================
  91. # ■ Game_Map
  92. #------------------------------------------------------------------------------
  93. #  处理地图的类。包含卷动以及可以通行的判断功能。
  94. # 本类的实例请参考 $game_map 。
  95. #==============================================================================

  96. class Game_Map
  97.   #--------------------------------------------------------------------------
  98.   # ● 设置
  99.   #     map_id : 地图 ID
  100.   #--------------------------------------------------------------------------
  101.   def setup(map_id)
  102.     # 地图 ID 记录到 @map_id
  103.     @map_id = map_id
  104.     # 地图文件装载后、设置到 @map
  105.     @map = $mapdat[@map_id-1]#load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  106.     # 定义实例变量设置地图元件信息
  107.     tileset = $data_tilesets[@map.tileset_id]
  108.     @tileset_name = tileset.tileset_name
  109.     @autotile_names = tileset.autotile_names
  110.     @panorama_name = tileset.panorama_name
  111.     @panorama_hue = tileset.panorama_hue
  112.     @fog_name = tileset.fog_name
  113.     @fog_hue = tileset.fog_hue
  114.     @fog_opacity = tileset.fog_opacity
  115.     @fog_blend_type = tileset.fog_blend_type
  116.     @fog_zoom = tileset.fog_zoom
  117.     @fog_sx = tileset.fog_sx
  118.     @fog_sy = tileset.fog_sy
  119.     @battleback_name = tileset.battleback_name
  120.     @passages = tileset.passages
  121.     @priorities = tileset.priorities
  122.     @terrain_tags = tileset.terrain_tags
  123.     # 初始化显示坐标
  124.     @display_x = 0
  125.     @display_y = 0
  126.     # 清除刷新要求标志
  127.     @need_refresh = false
  128.     # 设置地图事件数据
  129.     @events = {}
  130.     for i in @map.events.keys
  131.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  132.     end
  133.     # 设置公共事件数据
  134.     @common_events = {}
  135.     for i in 1...$data_common_events.size
  136.       @common_events[i] = Game_CommonEvent.new(i)
  137.     end
  138.     # 初始化雾的各种信息
  139.     @fog_ox = 0
  140.     @fog_oy = 0
  141.     @fog_tone = Tone.new(0, 0, 0, 0)
  142.     @fog_tone_target = Tone.new(0, 0, 0, 0)
  143.     @fog_tone_duration = 0
  144.     @fog_opacity_duration = 0
  145.     @fog_opacity_target = 0
  146.     # 初始化滚动信息
  147.     @scroll_direction = 2
  148.     @scroll_rest = 0
  149.     @scroll_speed = 4
  150.   end
  151.   #--------------------------------------------------------------------------
  152.   # ● 刷新2
  153.   #--------------------------------------------------------------------------
  154.   def refresh2
  155.     @map = $mapdat[@map_id-1]#load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  156.   end  
  157. end
  158. #==============================================================================
  159. # ■ Scene_Save
  160. #------------------------------------------------------------------------------
  161. #  处理存档画面的类。
  162. #==============================================================================

  163. class Scene_Save < Scene_File
  164.   def write_save_data(file)
  165.     # 生成描绘存档文件用的角色图形
  166.     characters = []
  167.     for i in 0...$game_party.actors.size
  168.       actor = $game_party.actors[i]
  169.       characters.push([actor.character_name, actor.character_hue])
  170.     end
  171.     # 写入描绘存档文件用的角色数据
  172.     Marshal.dump(characters, file)
  173.     # 写入测量游戏时间用画面计数
  174.     Marshal.dump(Graphics.frame_count, file)
  175.     # 增加 1 次存档次数
  176.     $game_system.save_count += 1
  177.     # 保存魔法编号
  178.     # (将编辑器保存的值以随机值替换)
  179.     $game_system.magic_number = $data_system.magic_number
  180.     # 写入各种游戏对像
  181.     Marshal.dump($game_system, file)
  182.     Marshal.dump($game_switches, file)
  183.     Marshal.dump($game_variables, file)
  184.     Marshal.dump($game_self_switches, file)
  185.     Marshal.dump($game_screen, file)
  186.     Marshal.dump($game_actors, file)
  187.     Marshal.dump($game_party, file)
  188.     Marshal.dump($game_troop, file)
  189.     Marshal.dump($mapdat, file)
  190.     Marshal.dump($game_map, file)
  191.     Marshal.dump($game_player, file)
  192.   end
  193. end
复制代码
  1. def edit(mapid,x,y,lv,dat) #lv=0,1,2
  2.   $mapdat[mapid-1].data[x,y,lv] = dat
  3.   upmap
  4. end
  5. def editbymap(mapid,x,y,mapid1,x1,y1,w1,h1) #lv=0,1,2
  6.   #$mapdat[mapid-1].data[x,y,lv] = dat
  7.   x3 = x
  8.   for y2 in x1..h1+(x1-1)
  9.     for x2 in y1..w1+(y1-1)
  10.       $mapdat[mapid-1].data[x3,y,0] = $mapdat[mapid1-1].data[x2,y2,0]
  11.       $mapdat[mapid-1].data[x3,y,1] = $mapdat[mapid1-1].data[x2,y2,1]
  12.       $mapdat[mapid-1].data[x3,y,2] = $mapdat[mapid1-1].data[x2,y2,2]
  13.       x3 = x3+1
  14.     end
  15.     y = y+1
  16.     x3 = x
  17.   end
  18.   upmap
  19. end
  20. def newmap(h,w,tileset)
  21.   $mapdat.push(RPG::Map.new(w,h))
  22. #  $mapdat.height = h
  23. #  $mapdat.width = w
  24. #  $mapdat.data = Table.new(h,w,3)
  25. for x in 0..w
  26.   for y in 0..h
  27.   edit($mapdat.size,x,y,0,384)
  28. end
  29. end
  30.   return $mapdat.size
  31.   upmap
  32. end
  33. def upmap
  34.   $game_map.refresh2
  35.   $game_map.update
  36. end
复制代码

截图怎么截捏?
使用草原地图时的范例
for i in 0..4
edit(1,2,2+i,1,488+(i*8))
edit(1,3,2+i,1,489+(i*8))
edit(1,4,2+i,1,490+(i*8))
edit(1,5,2+i,1,491+(i*8))
edit(1,6,2+i,1,492+(i*8))
end
作者: 越前リョーマ    时间: 2008-5-31 16:51
不大明白怎么用……
作者: yangff    时间: 2008-5-31 17:06
以下引用越前リョーマ于2008-5-31 8:51:41的发言:

不大明白怎么用……

for i in 0..4
edit(1,2,2+i,1,488+(i*8))
edit(1,3,2+i,1,489+(i*8))
edit(1,4,2+i,1,490+(i*8))
edit(1,5,2+i,1,491+(i*8))
edit(1,6,2+i,1,492+(i*8))
end
edit(地图id,x,y,层,元件id(去掉自动元件第一个元件是386))再不会看范例 [LINE]1,#dddddd[/LINE]版主对此帖的评论:『鼓励点错了』,积分『-150』。这些被扣积分的一半会用于对本帖正确答案的悬赏。 [LINE]1,#dddddd[/LINE]系统信息:本贴由本区版主认可,66RPG感谢您的热情解答~
作者: 暴风の龙    时间: 2008-5-31 17:44
哦哦,不错啊,支持个,我正烦恼着类似的问题,看看是不是我要的系统……

-口- 范例脚本出错……

自行修改过后终于能运行了……
效果不错,不过貌似会和我手头的游戏冲突,整合又麻烦- -#
作者: yangff    时间: 2008-5-31 22:58
以下引用暴风の龙于2008-5-31 9:44:53的发言:

哦哦,不错啊,支持个,我正烦恼着类似的问题,看看是不是我要的系统……

-口- 范例脚本出错……

自行修改过后终于能运行了……
效果不错,不过貌似会和我手头的游戏冲突,整合又麻烦- -#


[本贴由作者于 2008-5-31 9:52:52 最后编辑]

我帮你吧 {/wx}
错误是脚本少拷贝了一个 {/ll}
现在好了~~
作者: 柳之一    时间: 2008-6-1 05:05
好东西,不过新加的图块能不能保留原有事件?
作者: ′InjuReㄍ、    时间: 2008-6-1 05:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: yangff    时间: 2008-6-1 06:06
以下引用柳之一于2008-5-31 21:05:21的发言:

好东西,不过新加的图块能不能保留原有事件?

理论上有的
以下引用′InjuReㄍ、于2008-5-31 21:15:38的发言:

有VX的么

因该不会,vx的修改太大了,我不大习惯的 {/gg}
作者: 暴风の龙    时间: 2008-6-1 06:17
突然想到个问题,要是建房子的那时候,一些重要NPC随机移动到房子范围内……不就出不来了?

作者: yangff    时间: 2008-6-1 21:29
范例更新!
增加功能:
          editbymap(mapid,x,y,mapid1,x1,y1,w1,h1)
          实现:edit功能只能一格一格修改,不方便。
                这个程序可以从其他地图拷贝一块到当前地图。
          使用:
                mapid:要修改的地图id
                x,y:要修改的地图的x,y
                mapid1:地图库
                x1,y1,w1,h1:从x1,y1开始复制大小为w1,h1的地图元件到mapid的x,y
newmap(h,w,tileset)
          实现:创建新地图
          使用:
              h,w:新地图大小
              tileset:地图所使用图块的 ID。
作者: 沉影不器    时间: 2008-6-2 00:58
提示: 作者被禁止或删除 内容自动屏蔽
作者: yangff    时间: 2008-6-2 01:01
以下引用沉影不器于2008-6-1 16:58:40的发言:

很强大的样子...好像是替换map_data部分数据?我还没找到那些数据的规律来着

每个存档文件独立保存一份地图数据.
至于结构可以参考帮助,以前研究过.66的2远景也有说过。
实际修改量不大,主要就是开始游戏时读入所有地图,放到一个array里,game_map读取的是array里的内容。
array在每次存档时自动保存,不过有时会导致存档过于臃肿。

作者: 沉影不器    时间: 2008-6-2 01:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: 柳之一    时间: 2008-6-2 07:36
我准备用这个实现像暗黑那样随即的道路和出口,虽然可以弄四个地图,不过这个方法可以节省体积{/tp}
作者: yangff    时间: 2008-6-2 19:24
以下引用柳之一于2008-6-1 23:36:14的发言:

我准备用这个实现像暗黑那样随即的道路和出口,虽然可以弄四个地图,不过这个方法可以节省体积

我倒有个主意,三远景脚本+这个脚本+newmap方法=大小〉500的无敌迷宫 {/hx}(ms会很卡 {/gg})
添加事件。。。



使用newmap制作大地图(这里测试200*200没问题)必须把newmap的:
for x in 0..w
for y in 0..h
edit($mapdat.size,x,y,0,384)
end
end
注释掉,否则。。。。

作者: yangff    时间: 2009-6-12 08:00
以下引用暴风の龙于2008-5-31 22:17:41的发言:

突然想到个问题,要是建房子的那时候,一些重要NPC随机移动到房子范围内……不就出不来了?

建房子前没有npc移动到那该死的位子就行了

睡了,明天再说吧 {/jy}
作者: 暴风の龙    时间: 2009-6-12 08:00
以下引用yangff于2008-6-1 13:29:17的发言:

范例更新!
增加功能:
         editbymap(mapid,x,y,mapid1,x1,y1,w1,h1)
         实现:edit功能只能一格一格修改,不方便。
               这个程序可以从其他地图拷贝一块到当前地图。
         使用:
               mapid:要修改的地图id
               x,y:要修改的地图的x,y
               mapid1:地图库
               x1,y1,w1,h1:从x1,y1开始复制大小为w1,h1的地图元件到mapid的x,y
newmap(h,w,tileset)
         实现:创建新地图
         使用:
             h,w:新地图大小
             tileset:地图所使用图块的 ID。

这个功能好很多,支持!




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1