Project1

标题: 地图无缝拼接(仿·暗黑破坏神) [打印本页]

作者: zh99998    时间: 2008-8-3 15:36
标题: 地图无缝拼接(仿·暗黑破坏神)
看了雪流星的【移动场所不淡出淡入】脚本后的想法:可以做出像暗黑破坏神那样的连贯的地图

我的语文水平不太高……所以就不多说废话了,看图

0.准备:找好移动场所不淡出淡入和地图名显示脚本放在main前,画出张需要拼接的地图

1.两张地图都拉长9格



2.把地图2的最边上8格弄到地图1里(注意用shift)


3.做好过渡处理


4.把地图1最边上的17格复制到地图2(注意用shift),会覆盖掉地图2上的一部分


5.在两张地图的过渡那一格设上【场所移动】事件,触发方式是【被主角接触】
  注意要错开一格



6.开启那两个脚本,这个需要根据自己的游戏来确定放在哪里,我的范例用的自动事件
  插入RGSS脚本语句:transfer_fade
  控制系统开关:6号 打开

7.完成了

一定要注意在“搬运”地图的时候按住shift截取按住shift话,否则效果很差

范例:http://rpg.blue/upload_program/d ... ��例_103652298.rar

附带那两个脚本

  1. #移动场所不淡出淡入 by 雪流星
  2. class Scene_Map < Scene_Base
  3.   def update_transfer_player
  4.     return unless $game_player.transfer?
  5.     if $transfer_location_fadeout
  6.       @spriteset.dispose              # Dispose of sprite set
  7.       $game_player.perform_transfer   # Execute player transfer
  8.       $game_map.autoplay              # Automatically switch BGM and BGS
  9.       $game_map.update
  10.       @spriteset = Spriteset_Map.new  # Recreate sprite set
  11.     else
  12.       fade = (Graphics.brightness > 0)
  13.       fadeout(30) if fade
  14.       @spriteset.dispose              # Dispose of sprite set
  15.       $game_player.perform_transfer   # Execute player transfer
  16.       $game_map.autoplay              # Automatically switch BGM and BGS
  17.       $game_map.update
  18.       Graphics.wait(15)
  19.       @spriteset = Spriteset_Map.new  # Recreate sprite set
  20.       fadein(30) if fade
  21.     end
  22.     Input.update
  23.   end
  24. end
  25. class Game_Interpreter
  26.   def transfer_fade(tf = true)
  27.     $transfer_location_fadeout = tf
  28.   end
  29. end
复制代码

  1. # ————————————————————————————————————
  2. # 本脚本来自www.66rpg.com,转载和使用请保留此信息
  3. # ————————————————————————————————————

  4. #==============================================================================
  5. # ■ 地图名显示脚本
  6. #     by Yuee
  7. #------------------------------------------------------------------------------
  8. # 在Main的上方插入一个页,将本脚本复制到那页中即可
  9. #==============================================================================

  10. #==============================================================================
  11. # ■ Window_MapName
  12. #------------------------------------------------------------------------------
  13. #  显示地图名字的窗口。
  14. #==============================================================================

  15. class Window_MapName < Window_Base
  16.   #--------------------------------------------------------------------------
  17.   # ● 类常量定义
  18.   #--------------------------------------------------------------------------

  19.   # 暂时屏蔽用的开关
  20.   SWITCH = 6
  21.   
  22.   # 窗口位置设定
  23.   NAME_X = 544-220      # 矩形左上顶点X坐标
  24.   NAME_Y = 0       # 矩形左上顶点Y坐标
  25.   NAME_W = 220      # 矩形宽
  26.   NAME_H = 60       # 矩形高
  27.    
  28.   # 显示时间设置
  29.   SHOW_TIME_0 = 10  # 地图名出现前等待的帧数
  30.   SHOW_TIME_1 = 10  # 地图名从不可见变成可见的帧数
  31.   SHOW_TIME_2 = 34  # 地图名完全可见的帧数
  32.   SHOW_TIME_3 = 16  # 地图名从可见变成不可见的帧数
  33.   
  34.   # 完全可见时的透明度设置
  35.   OPACITY_1 = 244   # 边框
  36.   OPACITY_2 = 100   # 背景
  37.   OPACITY_3 = 255   # 文字
  38.   
  39.   # 地图名字的颜色
  40.   TEXT_COLOR = Color.new(255, 255, 255, 255)
  41.    
  42.   #--------------------------------------------------------------------------
  43.   # ● 初始化状态
  44.   #--------------------------------------------------------------------------
  45.   def initialize
  46.     super(NAME_X , NAME_Y, NAME_W, NAME_H)
  47.     # 初始化窗口透明度
  48.     self.opacity = 0
  49.     self.back_opacity = 0
  50.     self.z = 9999
  51.     self.contents_opacity = 0
  52.     self.contents = Bitmap.new(width - 32, height - 32)
  53.     # 剩余帧数初始化
  54.     @show_time = 0
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 输出文字
  58.   #--------------------------------------------------------------------------
  59.   def setname
  60.     if $game_switches[SWITCH]
  61.       # 获取地图ID
  62.       newid = $game_map.map_id
  63.       time = SHOW_TIME_1 + SHOW_TIME_2 + SHOW_TIME_3  
  64.       # 如果现在的地图的ID不是刚才显示的地图ID则开始显示
  65.       if newid != @id
  66.         @id = newid
  67.         @show_time = SHOW_TIME_0 + SHOW_TIME_1 + SHOW_TIME_2 + SHOW_TIME_3
  68.       # 剩余帧数为0是时,全部窗口透明
  69.       elsif @show_time < 1
  70.         self.opacity = 0
  71.         self.back_opacity = 0
  72.         self.contents_opacity = 0
  73.         return
  74.       end      
  75.       self.contents.clear
  76.       self.contents.font.color = TEXT_COLOR
  77.       # 描绘地图名
  78.       self.contents.draw_text(4, 0 , width - 40, 32, $data_mapinfos[@id].name, 1)
  79.       # 根本帧数设定窗口透明度
  80.       if @show_time > (SHOW_TIME_2 + SHOW_TIME_3)
  81.         self.opacity = @show_time < time ? (((OPACITY_1 / SHOW_TIME_1) * (time - @show_time)).to_i) : 0
  82.         self.back_opacity = @show_time < time ? (((OPACITY_2 / SHOW_TIME_1 )* (time - @show_time)).to_i) : 0
  83.         self.contents_opacity = @show_time < time ? (((OPACITY_3 / SHOW_TIME_1) * (time - @show_time)).to_i) : 0
  84.       else
  85.         self.opacity = @show_time < (SHOW_TIME_3 / 16 * 14) ? ((OPACITY_1 / SHOW_TIME_3) * @show_time).to_i : OPACITY_1
  86.         self.back_opacity = @show_time < (SHOW_TIME_3 / 16 * 9) ? ((OPACITY_2 / SHOW_TIME_3) * @show_time).to_i : OPACITY_2
  87.         self.contents_opacity = @show_time < SHOW_TIME_3 ? ((OPACITY_3 / SHOW_TIME_3)* @show_time).to_i : OPACITY_3
  88.       end
  89.       @show_time -= 1
  90.       $game_switches[SWITCH] = false if @show_time < 0
  91.     end
  92.   end
  93. end

  94. #==============================================================================
  95. # ■ Scene_Map
  96. #------------------------------------------------------------------------------
  97. #  处理地图画面的类。(追加定义)
  98. #==============================================================================

  99. class Scene_Map
  100.   alias smn_start start
  101.   def start
  102.     @mapname = Window_MapName.new
  103.     smn_start
  104.   end
  105.   
  106.   alias smn_dispose terminate
  107.   def terminate
  108.     smn_dispose
  109.     @mapname.dispose
  110.   end
  111.   
  112.   alias smn_update update
  113.   def update
  114.     smn_update
  115.     @mapname.setname
  116.   end
  117. end

  118. #==============================================================================
  119. # ■ Scene_Title
  120. #------------------------------------------------------------------------------
  121. #  处理标题画面的类。(追加定义)
  122. #==============================================================================

  123. class Scene_Title
  124.   alias smn_load load_database
  125.   def load_database
  126.     # 读取地图信息文件
  127.     $data_mapinfos = load_data("Data/MapInfos.rvdata")
  128.     smn_load
  129.   end
  130. end

  131. #==============================================================================
  132. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  133. #==============================================================================
复制代码

作者: Beside    时间: 2008-8-3 17:00
1.应该发在技术区
2.这个不难
3.500*500的地图貌似不够-。-
作者: zh99998    时间: 2008-8-3 17:39
以下引用Beside于2008-8-3 9:00:47的发言:

1.应该发在技术区
2.这个不难
3.500*500的地图貌似不够-。-

因为不难,所以没发到技术区
第3条看不懂……
作者: ONEWateR    时间: 2008-8-3 20:05
确实很不错
作者: 风雪优游    时间: 2008-8-3 22:37
不过这个有什么用处呢?
作者: 风雪优游    时间: 2008-8-3 23:30
仿·暗黑...又有什么用处呢?

不过话说回来,地图太大了是会很卡的 吧?
作者: zh99998    时间: 2008-8-3 23:41
以下引用风雪优游于2008-8-3 15:30:44的发言:

仿·暗黑...又有什么用处呢?

不过话说回来,地图太大了是会很卡的 吧?

只是比原来扩大9格而已……会卡吗{/gg}
这个只是看起来是一张图,实际上还是多张地图的
(所以要设置好分割线附近的事件以免出BUG{/wx})[LINE]1,#dddddd[/LINE]对别人来说可能会有用的
作者: cheyenne    时间: 2008-8-3 23:50
……问题是,如果某张地图的边缘那几格有一个随机移动的NPC,不是会露馅么?
作者: 柳之一    时间: 2008-8-4 00:06
以下引用cheyenne于2008-8-3 15:50:40的发言:

……问题是,如果某张地图的边缘那几格有一个随机移动的NPC,不是会露馅么?

你想的情况还真多啊{/cy}

作者: cheyenne    时间: 2008-8-4 00:11
以下引用柳之一于2008-8-3 16:06:09的发言:

你想的情况还真多啊

因为以前有个类似的小地图无缝拼接成大地图的教程,里面就提到了NPC的设置……但范例里的NPC是固定的,于是我就一直在思考万一是随机移动的话要怎么办
就是这个教程:http://rpg.blue/web/htm/news481.htm,里面的第三个
作者: 柳之一    时间: 2008-8-4 00:23
以下引用cheyenne于2008-8-3 16:11:47的发言:


以下引用柳之一于2008-8-3 16:06:09的发言:

你想的情况还真多啊


因为以前有个类似的小地图无缝拼接成大地图的教程,里面就提到了NPC的设置……但范例里的NPC是固定的,于是我就一直在思考万一是随机移动的话要怎么办
就是这个教程:http://rpg.blue/web/htm/news481.htm,里面的第三个


可以改改脚本,让npc自动跳跃就是了。以前改过。
作者: 沉影不器    时间: 2008-8-5 00:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: zh99998    时间: 2008-8-5 03:20
以下引用沉影不器于2008-8-4 16:57:03的发言:

也就是说,画地图时,在场景转换的地方多画上目的地地图的边缘?

是的
作者: 火鸡三毛老大    时间: 2008-8-5 19:42
这个不会很难……
作者: zh99998    时间: 2008-8-5 20:50
以下引用天然呆神于2008-8-5 12:10:47的发言:

LZ在用RPGVX1.02呢。

对呀,火鸡的1.021还没弄出来,就先用着1.02……
作者: zh99998    时间: 2008-10-5 15:10
看到还有人问关于地图切换无淡入淡出的问题……于是就顶上来了 [LINE]1,#dddddd[/LINE]版主对此帖的评论:『好吧,不要挖坟,有人问的话,给链接就OK了。 -by 八云 紫』,积分『-0』。这些被扣积分的一半会用于对本帖正确答案的悬赏。
作者: 木葬枫    时间: 2008-10-5 16:19
呐…这种技巧我是从精灵那学来的………
[LINE]1,#dddddd[/LINE]
但是沉影那个华丽的效果又让我很难诀择……
作者: 精灵使者    时间: 2008-10-5 18:38
以下引用木葬枫于2008-10-5 8:19:37的发言:

呐…这种技巧我是从精灵那学来的………



但是沉影那个华丽的效果又让我很难诀择……

精灵除了这个无缝之外又考虑了走到边缘(传送)以后再回转的时候会出现地图错误的情况。
地图名脚本验证了,没有冲突(只要走过就自动显示下个地图的地图名(相当于区域名)哦~)
所以我设置了两行传送的位置。为了保证传送的正确性。
这个功能将会在我的正在挖的坑里面使用。
以下引用柳之一于2008-8-3 16:06:09的发言:


以下引用cheyenne于2008-8-3 15:50:40的发言:

……问题是,如果某张地图的边缘那几格有一个随机移动的NPC,不是会露馅么?


你想的情况还真多啊

设置好坐标再改过来吧。
那些地方我一般都会设计为不可通行的……

作者: zh99998    时间: 2008-10-5 19:08
我这个方法边缘回转也没有错误,传过去后是离开传送点的

★■      ■★
□■  →  ■□
□■      ■□

□ 空的格子
★ 主角
■ 传送点
作者: 英仙座    时间: 2008-10-5 22:33
无缝拼接……我想起了wow。
作者: 精灵使者    时间: 2008-10-5 23:32
我用了你的范例测试。走到008,005的位置不向外走而向相反方向走,结果发现拼接地图没有切换地图,出了错误。
如果想实现无缝对接的话需要两个传送点需要相互传送(而不是到外面)
你如果站到了黑色的方框上,被传送到了另外的黑色方框上,就容易出现这个错误。
我说得意思就是说,站到传送点上,被传送以后不往外走直接往回……
我使用的方法是

□●◎X-----    →  -----X●◎□
对应的传送点传送到对应的位置上……
同样方框是空格,xxx是地图边缘……
作者: zh99998    时间: 2008-10-5 23:42
传过去不是踩在传送点上的
两个地图的传送点不在一个位置
□★□      ■★□
□■□ →   ■□□
□■□      ■□□

这样画……
作者: 精灵使者    时间: 2008-10-5 23:58
这样中间突然缺少了一段,运行很突兀。整个画面会忽然跳动一下。(根据以前XP的经验。)
这是我的那个范例工程,顺手解决了在传送点处乱传的问题。
http://rpg.blue/upload_program/d ... ��例_103651037.rar
作者: zh99998    时间: 2008-10-6 00:03
果然……想的对……范例却有问题[LINE]1,#dddddd[/LINE]不过两排事件还是不需要的[LINE]1,#dddddd[/LINE]楼顶教程和范例已经更改,thx
作者: 精灵使者    时间: 2008-10-6 00:22
仔细想想,还是你的办法可行。
精灵按照我和你的思路综合起来的版本。
http://rpg.blue/upload_program/d ... ��例_103652494.rar
删去了中间的传送点,更加灵活而且解决了我说的BUG
作者: zh99998    时间: 2008-10-6 00:26
楼顶附件和教程已经修正了,修正后的范例与精灵大人的范例不同之处就在于……精灵大人的两个传送点中间隔着一格,而我的是靠起来的

也就是说,精灵大人的范例中中间那一格会同时属于两个地图(从哪边走来就是哪边的)
而我的两个图有明确的界限
作者: 精灵使者    时间: 2008-10-6 00:30
不过对于无缝衔接来说,似乎看不出来的……
我下下你的范例进行测试下……
[LINE]1,#dddddd[/LINE]
测试结果应该很不错,只要能够保证传送的顺序,而且错开,问题就不大了。
赶明修改我的工程去……
作者: zh99998    时间: 2008-10-6 00:58
扔到发布区了啊,那顺便把这个也扔进来吧
http://rpg.blue/viewthread.php?tid=98567&ntime=2008%2D10%2D5+16%3A58%3A15
作者: Glint    时间: 2008-10-13 10:18
感觉挺号的
作者: 小幽的马甲    时间: 2009-6-12 08:00
不错,积分+=150.
作者: zh99998    时间: 2009-6-12 08:00
以下引用风雪优游于2008-8-3 14:37:57的发言:

不过这个有什么用处呢?

最基本的用处是仿暗黑破坏神的地图效果
当然还有跟多的用处,比如【变异·地图回圈】之类的
作者: 仙剑RPG迷    时间: 2010-10-4 12:22
因为以前有个类似的小地图无缝拼接成大地图的教程,里面就提到了NPC的设置……但范例里的NPC是固定的,于 ...
cheyenne 发表于 2008-8-4 00:11




作者: 仙剑RPG迷    时间: 2010-10-4 12:22
好复杂的说法




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