查看: 4493|回复: 14

[已经解决] VA可以实现类似塞尔达的滚动式地图切换吗?

[复制链接]
梦石
0
星屑
1290
在线时间
52 小时
注册时间
2017-2-2
回帖
25
发表于 2019-8-1 16:04:26 | 显示全部楼层 |阅读模式

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

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

×
wqe.gif

用缩小帽录制了一下gif,想知道VA的话能实现这样子滚动样式的地图切换特效吗?
之前有在貌似是梦2记的游戏实况上看到类似的地图切换,但是也不知道是怎么做的,搜索了一下也没找到类似的问题,所以好奇想来问一下

评分

参与人数 1赞 +1 收起 理由
sdgn + 1 画面拆分成好几个单独的地图會問題比較少~.

查看全部评分

梦石
0
星屑
17038
在线时间
6058 小时
注册时间
2011-7-18
回帖
152

开拓者

发表于 2019-8-2 03:00:11 | 显示全部楼层
本帖最后由 gqxastg 于 2019-8-3 18:35 编辑

脚本
  1. #==============================================================================
  2. # ■ Game_Map
  3. #==============================================================================

  4. class Game_Map
  5.   #--------------------------------------------------------------------------
  6.   # ● 定义实例变量
  7.   #--------------------------------------------------------------------------
  8.   attr_accessor :zelda_scroll
  9.   #--------------------------------------------------------------------------
  10.   # ● 初始化对象
  11.   #--------------------------------------------------------------------------
  12.   alias initialize_zelda_old initialize
  13.   def initialize
  14.     initialize_zelda_old
  15.     @zelda_scroll = false
  16.   end
  17.   #--------------------------------------------------------------------------
  18.   # ● 设置
  19.   #--------------------------------------------------------------------------
  20.   def zelda_scroll_setup(style, param = 1)
  21.     @zelda_scroll = style ? [style, param] : false
  22.   end
  23. end
  24. #==============================================================================
  25. # ■ Scene_Map
  26. #==============================================================================

  27. class Scene_Map < Scene_Base
  28.   #--------------------------------------------------------------------------
  29.   # ● 处理场所移动
  30.   #--------------------------------------------------------------------------
  31.   alias perform_transfer_zelda_old perform_transfer
  32.   def perform_transfer
  33.     if $game_map.zelda_scroll
  34.       style = $game_map.zelda_scroll[0]
  35.       param = $game_map.zelda_scroll[1]
  36.       case style
  37.       when 0,1,2,3
  38.         $sprite1 = Sprite.new; $sprite1.z = 300
  39.         $sprite1.bitmap = Graphics.snap_to_bitmap.clone
  40.         $sprite1.visible = false
  41.         perform_transfer_zelda_old
  42.         @spriteset.update
  43.         $sprite2 = Sprite.new; $sprite2.z = 300
  44.         $sprite2.bitmap = Graphics.snap_to_bitmap.clone
  45.         $sprite1.visible = true
  46.         case style
  47.         when 0; $sprite2.y = Graphics.height
  48.         when 1; $sprite2.x = -Graphics.width
  49.         when 2; $sprite2.x = Graphics.width
  50.         when 3; $sprite2.y = -Graphics.height; end
  51.         loop do
  52.           break if (style == 0 && $sprite2.y <= 0) ||
  53.           (style == 1 && $sprite2.x >= 0) ||
  54.           (style == 2 && $sprite2.x <= 0) ||
  55.           (style == 3 && $sprite2.y >= 0)
  56.           case style
  57.           when 0; $sprite1.y = [$sprite1.y - param, -Graphics.height].max
  58.                   $sprite2.y = [$sprite2.y - param, 0].max
  59.           when 1; $sprite1.x = [$sprite1.x + param, Graphics.width].min
  60.                   $sprite2.x = [$sprite2.x + param, 0].min
  61.           when 2; $sprite1.x = [$sprite1.x - param, -Graphics.width].max
  62.                   $sprite2.x = [$sprite2.x - param, 0].max
  63.           when 3; $sprite1.y = [$sprite1.y + param, Graphics.height].min
  64.                   $sprite2.y = [$sprite2.y + param, 0].min; end
  65.           Graphics.update
  66.         end
  67.         $sprite1.bitmap.dispose; $sprite1.dispose
  68.         $sprite2.bitmap.dispose; $sprite2.dispose
  69.       end
  70.       $game_map.zelda_scroll_setup(false)
  71.     else
  72.       perform_transfer_zelda_old
  73.     end
  74.   end
  75. end
复制代码

临时随便写了一个,跨地图的仿塞尔达式屏幕卷动
在场所移动前用事件中的脚本功能调用
$game_map.zelda_scroll_setup(style, param)

即可(淡入淡出要选择“无”)
style为屏幕卷动的风格序号,目前有4种,从0到3分别为向下、向右、向左、向上的匀速普通卷动(比如门在地图最右边就应该向左卷动)【废话
param为屏幕卷动的风格参数,目前为每帧卷动的像素数,数字越大速度越快(最好是能被分辨率整除的数)
以防本人表达能力太差导致听不懂,最后附上范例工程
跨地图仿塞尔达屏幕滚动.7z (292.96 KB, 下载次数: 49)
【原理很简单,就是分别获取场所移动前后的屏幕截图来卷动显示,所以兼容性不好,如果场所移动时画面上有窗口、图片等都会被截到,请在用该脚本场所移动前暂时关闭【或者有特殊需要的话告诉我用的脚本等我更新【Pia


RGD专用改进版(范例没更新)
8/2 不用特别隐藏窗口、图片、计时器、之类的了
8/3 追加保持场景切换前远景图位置的机能,以防止场景切换时滚动远景图割裂的违和感,默认不使用,想使用的话像这样在后面加个true即可
$game_map.zelda_scroll_setup(style, param, true)

脚本
  1. #==============================================================================
  2. # ■ Spriteset_Map
  3. #==============================================================================

  4. class Spriteset_Map
  5.   #--------------------------------------------------------------------------
  6.   # ● 定义实例变量
  7.   #--------------------------------------------------------------------------
  8.   attr_accessor :viewport1; attr_accessor :viewport2; attr_accessor :viewport3
  9. end
  10. #==============================================================================
  11. # ■ Game_Map
  12. #==============================================================================

  13. class Game_Map
  14.   #--------------------------------------------------------------------------
  15.   # ● 定义实例变量
  16.   #--------------------------------------------------------------------------
  17.   attr_accessor :zelda_scroll
  18.   attr_accessor :parallax_x; attr_accessor :parallax_y
  19.   #--------------------------------------------------------------------------
  20.   # ● 初始化对象
  21.   #--------------------------------------------------------------------------
  22.   alias initialize_zelda_old initialize
  23.   def initialize
  24.     initialize_zelda_old
  25.     @zelda_scroll = false
  26.   end
  27.   #--------------------------------------------------------------------------
  28.   # ● 设置
  29.   #--------------------------------------------------------------------------
  30.   def zelda_scroll_setup(style, param = 1, keep_bg_pos = false)
  31.     @zelda_scroll = style ? [style, param, keep_bg_pos] : false
  32.   end
  33. end
  34. #==============================================================================
  35. # ■ Scene_Map
  36. #==============================================================================

  37. class Scene_Map < Scene_Base
  38.   #--------------------------------------------------------------------------
  39.   # ● 处理场所移动
  40.   #--------------------------------------------------------------------------
  41.   alias perform_transfer_zelda_old perform_transfer
  42.   def perform_transfer
  43.     if $game_map.zelda_scroll
  44.       style = $game_map.zelda_scroll[0]
  45.       param = $game_map.zelda_scroll[1]
  46.       keep_bg_pos = $game_map.zelda_scroll[2]
  47.       old_bg_pos = [$game_map.parallax_x, $game_map.parallax_y] if keep_bg_pos
  48.       case style
  49.       when 0,1,2,3
  50.         $sprite1 = Sprite.new; $sprite1.z = 49
  51.         $sprite1.tone = $game_map.screen.tone
  52.         $sprite1.bitmap = @spriteset.viewport1.snap_to_bitmap
  53.         perform_transfer_zelda_old
  54.         $game_map.parallax_x = old_bg_pos[0] if keep_bg_pos
  55.         $game_map.parallax_y = old_bg_pos[1] if keep_bg_pos
  56.         @spriteset.update
  57.         $sprite2 = Sprite.new; $sprite2.z = 49
  58.         $sprite2.tone = $game_map.screen.tone
  59.         $sprite2.bitmap = @spriteset.viewport1.snap_to_bitmap
  60.         case style
  61.         when 0; $sprite2.y = Graphics.height
  62.         when 1; $sprite2.x = -Graphics.width
  63.         when 2; $sprite2.x = Graphics.width
  64.         when 3; $sprite2.y = -Graphics.height; end
  65.         loop do
  66.           break if (style == 0 && $sprite2.y <= 0) ||
  67.           (style == 1 && $sprite2.x >= 0) ||
  68.           (style == 2 && $sprite2.x <= 0) ||
  69.           (style == 3 && $sprite2.y >= 0)
  70.           case style
  71.           when 0; $sprite1.y = [$sprite1.y - param, -Graphics.height].max
  72.                   $sprite2.y = [$sprite2.y - param, 0].max
  73.           when 1; $sprite1.x = [$sprite1.x + param, Graphics.width].min
  74.                   $sprite2.x = [$sprite2.x + param, 0].min
  75.           when 2; $sprite1.x = [$sprite1.x - param, -Graphics.width].max
  76.                   $sprite2.x = [$sprite2.x - param, 0].max
  77.           when 3; $sprite1.y = [$sprite1.y + param, Graphics.height].min
  78.                   $sprite2.y = [$sprite2.y + param, 0].min; end
  79.           Graphics.update
  80.         end
  81.         $sprite1.bitmap.dispose; $sprite1.dispose
  82.         $sprite2.bitmap.dispose; $sprite2.dispose
  83.       end
  84.       $game_map.zelda_scroll_setup(false)
  85.     else
  86.       perform_transfer_zelda_old
  87.     end
  88.   end
  89. end
复制代码

点评

膜拜技術宅  发表于 2019-8-4 05:57
真的是太感谢了!和预期的效果完美符合!之前正因为两张地图有不同的滚动远景而苦恼,这个真的完美的解决了我的问题!!(跪谢)  发表于 2019-8-2 19:08

评分

参与人数 5星屑 +80 赞 +4 收起 理由
Cupidk爱呗茶 + 1 塞糖
sdgn + 1 精品文章
VIPArcher + 80 效果赞哦
Arfies + 1 塞糖
吉吉阿茶 + 1 认可答案

查看全部评分

这里岚风·雷,任饭、PM理性粉、UT/DR原作粉、(Trans)Furry自萌,半吊子技术一枚_(:з」∠)_    游戏制作交流工(liao)作(tian)室欢迎来玩!
【无偿/有偿】RGSS3(VA)脚本定制 + 合作招募/同好交友    修正Firefox/火狐浏览器的代码框复制问题(油猴脚本)
Click→←Click
回复 1 0

使用道具 举报

梦石
0
星屑
2885
在线时间
93 小时
注册时间
2019-7-21
回帖
24
发表于 2019-8-1 16:37:45 | 显示全部楼层
纯事件党表示有个方法,把这个事件放到门的地方就好了,大概原理就是在接触到门的时候角色会变成透明的并且可以穿透图块,然后移动到指定的地方
事件页.png

点评

不是过门时的动作,是整个地图的切换Orz  发表于 2019-8-1 16:43
麒乐遐世界第一!
回复

使用道具 举报

梦石
0
星屑
6830
在线时间
1251 小时
注册时间
2011-12-18
回帖
1127
发表于 2019-8-1 16:59:16 | 显示全部楼层
本帖最后由 sdgn 于 2019-8-1 17:03 编辑

感覺用事件可以...旦角色鏡頭需要改腳本...
樓上的方法會有問題~ 如果地圖原本就是2開~ 根據預設的運鏡腳本~ 畫面會跟著腳色移動~ 建議要推薦方法之前自己先測試過~
用腳本限制行動的話也會有言身問題和增家後續製作問題或減少製做的自由度~
且那個做法不符合樓主GIF展現出來的效果~
回复

使用道具 举报

梦石
0
星屑
2885
在线时间
93 小时
注册时间
2019-7-21
回帖
24
发表于 2019-8-1 16:59:44 | 显示全部楼层
Kirosa 发表于 2019-8-1 16:37
纯事件党表示有个方法,把这个事件放到门的地方就好了,大概原理就是在接触到门的时候角色会变成透明的并且 ...

那我可能就不是很懂了……我这个方法适用于两张地图合在一起┐(゚~゚)┌

点评

阿不是~ 是說你誤會或看錯樓主意思  发表于 2019-8-1 19:03
我覺得他誤會或沒看清楚你的意思  发表于 2019-8-1 17:02
麒乐遐世界第一!
回复

使用道具 举报

梦石
0
星屑
6830
在线时间
1251 小时
注册时间
2011-12-18
回帖
1127
发表于 2019-8-1 19:01:24 | 显示全部楼层
本帖最后由 sdgn 于 2019-8-1 19:03 编辑
Kirosa 发表于 2019-8-1 16:59
那我可能就不是很懂了……我这个方法适用于两张地图合在一起┐(゚~゚)┌  ...


他的意思是畫面不跟隨
回复

使用道具 举报

梦石
0
星屑
6830
在线时间
1251 小时
注册时间
2011-12-18
回帖
1127
发表于 2019-8-1 19:04:39 | 显示全部楼层
本帖最后由 sdgn 于 2019-8-1 19:24 编辑

樓主試試看這個~  

我用事件只能靠操作 "事件" 來實現~ 而且會有問題~ 要操縱主角的話要改腳本把畫面跟隨腳色的腳本刪掉~
建議樓主乖乖用切換場景或改腳本

ZALDA MAP SYSTEM DEMO(VXA).zip

1.43 MB, 下载次数: 89

点评

画面拆分成好几个单独的地图會問題比較少~ 不改腳本要做那樣會很麻煩  发表于 2019-8-1 19:25
哦哦!纯事件的效果意外的不错,可惜这边已经把画面拆分成好几个单独的地图了,不过的确提供了一种思路之后可以试试,谢谢了  发表于 2019-8-1 19:13

评分

参与人数 1星屑 +30 收起 理由
VIPArcher + 30 塞糖

查看全部评分

回复

使用道具 举报

梦石
3
星屑
2793
在线时间
500 小时
注册时间
2018-6-28
回帖
18
发表于 2019-8-1 23:24:58 | 显示全部楼层
个人有一种思路!
可以尝试把把所有房间画在同一个地图上,
然后结合2L的方法和VIPArcher的【隐藏地图遮罩】脚本:
https://rpg.blue/thread-377103-1-1.html
感觉可以把不同的房间做成不同的遮罩,再利用门一样的原理让角色自动移动来实现大致效果。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部