查看: 3758|回复: 2

[已经解决] 【VA】如何使玩家的视野到不了地图的某些区域?

[复制链接]
梦石
0
星屑
976
在线时间
121 小时
注册时间
2019-3-2
回帖
32
发表于 2019-8-12 16:23:49 | 显示全部楼层 |阅读模式
悬赏60星屑已解决
本帖最后由 VIPArcher 于 2019-8-15 00:43 编辑

如题,例如一个30x30的地图,我想让玩家的视野(即RM窗口大小范围)只能在28x28里移动,而周围的2格宽的位置可以安放事件之类的东西。
这样子具体想要的效果是:
1.当玩家走到28x28的边缘时就像是到了整个地图的边缘一样,镜头停止向外移动。
2.可以做出事件走出了这张地图的效果,而同时玩家也可以自由移动,不需要用剧情的方式固定玩家位置来做到。
事件在视野外运作的问题已经解决,现在就只有这个问题了。
拜托各位大大了~

最佳答案

查看完整内容

虽然楼上也给出了另一种解法 这里还是按照楼主要求写了这么一个限制视野的脚本 默认所有非循环地图的四周一列/行(即横纵坐标为0和最大的格子) 正常手段屏幕不会卷动到 玩家无法看到 如果只有横向循环或纵向循环 则不循环的方向两侧也会留一列/行无法看到的格子 [line]3[/line] 8/13 追加可以单独配置每张地图四周隐藏格数的机能 ...
梦石
0
星屑
17059
在线时间
6059 小时
注册时间
2011-7-18
回帖
153

开拓者

发表于 2019-8-12 16:23:50 | 显示全部楼层
本帖最后由 gqxastg 于 2019-8-13 00:43 编辑

虽然楼上也给出了另一种解法
这里还是按照楼主要求写了这么一个限制视野的脚本
默认所有非循环地图的四周一列/行(即横纵坐标为0和最大的格子)
正常手段屏幕不会卷动到 玩家无法看到
如果只有横向循环或纵向循环 则不循环的方向两侧也会留一列/行无法看到的格子
脚本[pre lang="ruby"]#==============================================================================
# ■ Game_Map
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # ● 设置显示位置 Overwrite
  #--------------------------------------------------------------------------
  def set_display_pos(x, y)
    ######################
    x = [1, [x, width - screen_tile_x - 1].min].max unless loop_horizontal?
    y = [1, [y, height - screen_tile_y - 1].min].max unless loop_vertical?
    ######################
    @display_x = (x + width) % width
    @display_y = (y + height) % height
    @parallax_x = x
    @parallax_y = y
  end
  #--------------------------------------------------------------------------
  # ● 向下卷动
  #--------------------------------------------------------------------------
  alias old_space_scroll_down scroll_down
  def scroll_down(distance)
    distance = [distance, height - screen_tile_y - @display_y - 1].min unless
    loop_vertical?
    old_space_scroll_down(distance) if distance > 0
  end
  #--------------------------------------------------------------------------
  # ● 向左卷动
  #--------------------------------------------------------------------------
  alias old_space_scroll_left scroll_left
  def scroll_left(distance)
    distance = [distance, @display_x - 1].min unless loop_horizontal?
    old_space_scroll_left(distance) if distance > 0
  end
  #--------------------------------------------------------------------------
  # ● 向右卷动
  #--------------------------------------------------------------------------
  alias old_space_scroll_right scroll_right
  def scroll_right(distance)
    distance = [distance, width - screen_tile_x - @display_x - 1].min unless
    loop_horizontal?
    old_space_scroll_right(distance) if distance > 0
  end
  #--------------------------------------------------------------------------
  # ● 向上卷动
  #--------------------------------------------------------------------------
  alias old_space_scroll_up scroll_up
  def scroll_up(distance)
    distance = [distance, @display_y - 1].min unless loop_vertical?
    old_space_scroll_up(distance) if distance > 0
  end
end[/pre]



8/13 追加可以单独配置每张地图四周隐藏格数的机能
脚本[pre lang="ruby"]module SnivyLei; module Map_Border_Space
  
  #地图ID对应留出格数的参数
  #地图ID => [地图下侧留出的格数, 左, 右, 上]
  #地图ID为0则代表未在此列出地图的默认参数 不同地图间用半角逗号分隔
  Map_Space_Parameters = { #不能删
                     0 =>[0, 0, 0, 0],
                     5 =>[1, 1, 1, 1],
                   } #不能删

end; end
#==============================================================================
# ■ Game_Map
#==============================================================================

class Game_Map
  include SnivyLei::Map_Border_Space
  #--------------------------------------------------------------------------
  # ● 设置显示位置 Overwrite
  #--------------------------------------------------------------------------
  def set_display_pos(x, y)
    ######################
    param = Map_Space_Parameters.include?(@map_id) ?
    Map_Space_Parameters[@map_id] : Map_Space_Parameters[0]
    x = [param[1], [x, width - screen_tile_x - param[2]].min].max unless
    loop_horizontal?
    y = [param[3], [y, height - screen_tile_y - param[0]].min].max unless
    loop_vertical?
    ######################
    @display_x = (x + width) % width
    @display_y = (y + height) % height
    @parallax_x = x
    @parallax_y = y
  end
  #--------------------------------------------------------------------------
  # ● 向下卷动
  #--------------------------------------------------------------------------
  alias old_space_scroll_down scroll_down
  def scroll_down(distance)
    unless loop_vertical?
      param = Map_Space_Parameters.include?(@map_id) ?
      Map_Space_Parameters[@map_id] : Map_Space_Parameters[0]
      distance = [distance, height - screen_tile_y - @display_y - param[0]].min
    end
    old_space_scroll_down(distance) if distance > 0
  end
  #--------------------------------------------------------------------------
  # ● 向左卷动
  #--------------------------------------------------------------------------
  alias old_space_scroll_left scroll_left
  def scroll_left(distance)
    unless loop_horizontal?
      param = Map_Space_Parameters.include?(@map_id) ?
      Map_Space_Parameters[@map_id] : Map_Space_Parameters[0]
      distance = [distance, @display_x - param[1]].min
    end
    old_space_scroll_left(distance) if distance > 0
  end
  #--------------------------------------------------------------------------
  # ● 向右卷动
  #--------------------------------------------------------------------------
  alias old_space_scroll_right scroll_right
  def scroll_right(distance)
    unless loop_horizontal?
      param = Map_Space_Parameters.include?(@map_id) ?
      Map_Space_Parameters[@map_id] : Map_Space_Parameters[0]
      distance = [distance, width - screen_tile_x - @display_x - param[2]].min
    end
    old_space_scroll_right(distance) if distance > 0
  end
  #--------------------------------------------------------------------------
  # ● 向上卷动
  #--------------------------------------------------------------------------
  alias old_space_scroll_up scroll_up
  def scroll_up(distance)
    unless loop_vertical?
      param = Map_Space_Parameters.include?(@map_id) ?
      Map_Space_Parameters[@map_id] : Map_Space_Parameters[0]
      distance = [distance, @display_y - param[3]].min
    end
    old_space_scroll_up(distance) if distance > 0
  end
end[/pre]

评分

参与人数 3星屑 +50 赞 +2 收起 理由
Cupidk爱呗茶 + 1 塞糖
VIPArcher + 50 认可答案
sansy + 1 认可答案

查看全部评分

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

使用道具 举报

梦石
0
星屑
4209
在线时间
1870 小时
注册时间
2010-12-21
回帖
2166
发表于 2019-8-12 18:05:13 | 显示全部楼层
本帖最后由 黄亦天 于 2019-8-12 18:23 编辑

事件走出地图外 一般的做法是走到地图边缘之后 然后设置事件行走图为透明 或者可以设计几个透明度来做个渐变效果
如果要执行某些内容 在透明的事件页放上并行/自动 执行的内容 其实也差不多了 或者可以用公共事件来执行

如果是倒过来用 可以先在不影响通行的位置设置一个透明的事件 在需要的时候 设置它的位置 然后设置它的行走图 再设置这个事件的行为

如果一定要事件走出去 还有个在框架内的暴力解决的方法就是 把行走图做成逐帧走出地图的图像【

以上就是一些利用原版性能做到的可以实现想要的效果的投机取巧的手法 都是在28×28的地图的情况下实现的

其实并不需要把地图做大然后限制玩家范围 让事件挪出地图外也是可行的
如果非要事件走出地图 稍微有点麻烦 非要扩大地图和限制玩家区域 其实更麻烦

如果要设置事件一定在地图外

Game_CharacterBase
  1. #--------------------------------------------------------------------------
  2.   # ● 移动到指定位置
  3.   #--------------------------------------------------------------------------
  4.   def moveto(x, y)
  5.     @x = x# % $game_map.width
  6.     @y = y# % $game_map.height
  7.     @real_x = @x
  8.     @real_y = @y
  9.     @prelock_direction = 0
  10.     straighten
  11.     update_bush_depth
  12.   end
复制代码



这里某两行后面的内容像这样注释掉 就可以把事件的XY设置成负数 放到地图外

如果要走出地图外的话

   
  1. return false unless $game_map.valid?(x2, y2)
复制代码

这行 用# 注释掉

就可以出地图了




我猜是你想让事件走出地图外 就试着做了 发现事件走不出去 然后就试着扩大地图让事件走出去 但是出现了玩家移动的时候会看到“黑边” 所以就想消除黑边所以才问了这个问题
绿坝娘素材库企划

素材库获取方法:暂时中止,需求者私聊。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部