设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

优先级可否设置大于5

查看数: 4086 | 评论数: 9 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-3-4 13:51

正文摘要:

本帖最后由 89444640 于 2017-3-4 13:52 编辑 默认最大优先级是5,遮挡向上5格,对于默认人物没事,我这个超标严重,一直因为不会脚本只能忽略了。 因为这个,当时设定好的骑马穿越森林的地图我都废弃了…… ...

回复

guoxiaomi 发表于 2017-3-4 18:54:00
本帖最后由 guoxiaomi 于 2017-3-5 11:18 编辑

有一个思路是,利用地形标记,如果角色或事件踩在了被标记的图块上,就把角色或事件的 Z 坐标拉低,这样就能显示在所有的图块之下。

将这段代码插入到Main前,覆写了 Game_Character 原来的 screen_z(height = 0) 方法,这个方法是改变角色/事件的 Z 坐标。
RUBY 代码复制
  1. class Game_Character
  2.   alias _66RPG_screen_z screen_z
  3.   def screen_z(height = 0)
  4.     if $game_switches[10] && terrain_tag == 7
  5.       if @tile_id > 0
  6.         return $game_map.priorities[@tile_id] * 32
  7.       else
  8.         return (@real_y - $game_map.display_y) / 128
  9.       end
  10.     end
  11.     return _66RPG_screen_z(height)
  12.   end
  13. end


然后设置一个元件的地图标记为 7 ,打开 10 号开关。这里添加开关,是为了防止这种奇葩脚本带来更多的麻烦,如果不需要用到这个功能,就把 10 号开关关掉。

下面,把踩在此元件之上的事件/角色,称之为“被标记”。这段代码的意思是,如果事件/角色被标记,那么事件/角色的 Z 坐标会被设置为 一个比 32 小的值。但如果此事件的行走图是地图元件,那么 Z 坐标会被设置为优先级 * 32。
1. 所有优先级为 0 的元件,高度都是 0,所以一定会被事件/角色遮挡。
2. 如果角色被标记,所有优先级不为 0 的元件,都会遮挡角色。
3. 如果角色被标记,某事件(非元件图块)也被标记,会根据 Y 坐标决定遮挡,Y 坐标小的被遮挡
4. 如果角色被标记,某事件(元件图块)也被标记,如果图块的优先级为 0,会被角色遮挡,如果图块的优先级为 1,会遮挡角色。

范例里面按下 Shift 键打开 10 号开关。白色的花被标记了 7 ,并且设置了某些元件的优先级为 1 ,请自行查看 F9 。
修改角色Z坐标.zip (201.88 KB, 下载次数: 102)



为什么不修改Tilemap的各图块高度,因为我根本没有找到怎么定义每层每个图块元件的 Z 属性。
以及地图最高高度为 800(来源 F1)
可以把这个脚本的 4 - 10 行插入到 Game_Character 的 screen_z(height = 0) 方法里,在该方法已有的内容前。


讨论之后的结果是,整张地图都要用到特殊的遮挡效果,干脆就不判断地图标记,改为开关打开时使用特殊的遮挡效果,让角色的 Z 坐标 = 角色在屏幕上的 Y 坐标
RUBY 代码复制
  1. class Game_Character
  2.   alias _66RPG_screen_z screen_z
  3.   def screen_z(height = 0)
  4.     if $game_switches[10]
  5.       if @tile_id > 0
  6.         return $game_map.priorities[@tile_id] * 32
  7.       else
  8.         return (@real_y - $game_map.display_y) / 128
  9.       end
  10.     end
  11.     return _66RPG_screen_z(height)
  12.   end
  13. end

这里所谓的特殊的遮挡效果,就把原来的图块成以下 7 层,3层在角色脚下(优先级为0),3层在角色/事件上方(优先级不为0),而且遮挡的效果与角色在屏幕上的 Y 坐标没有关系。

评分

参与人数 1梦石 +2 收起 理由
RyanBern + 2 互糖了嘞

查看全部评分

RyanBern 发表于 2017-3-7 22:38:58
Tilemap 类是 RGSS1 为数不多不可被修改的一个类,我们无从得知它内部的实现究竟是怎样的。不过从测试的情况来看,数据库的“优先级”的确是起着一个高度的作用,也就是说,优先级为5的图快,它就盖不住从地面往上数的第六块的位置。需要注意的是,如果主角在地图上上下移动的话,坐标覆盖的情况应当有所调整(因为表示角色的图形是一个整体,具有统一的 z 坐标)。

最正规的办法当然是设置更高优先级的图快,但上面回帖已经说明不可行,更改为6以上会造成游戏的崩溃(可能库只考虑到5的情况)。

用 ULDS 直接画一层遮罩层应该说是一个不错的解决办法,但是 XP 的 ULDS,别说楼主了,作为作者的我都不怎么愿意用,因为,太难用。

不过,我们可以利用事件来把这个遮罩层铺出来(设置为“在最前面显示”即可),但是考虑到地图太大,一个个复制事件不是一个好主意,所以我们可以利用脚本来做这件事。
RUBY 代码复制
  1. class Game_Map
  2.   def create_mask_events
  3.     @mask_event_count = 0
  4.     (0...width).each do |x|
  5.       (0...height).each do |y|
  6.         [2, 1, 0].each do |z|
  7.           tile_id = data[x, y, z]
  8.           if tile_id != nil && @terrain_tags[tile_id] == 7
  9.             ev = RPG::Event.new(x, y)
  10.             ev.id = 1000 + @mask_event_count
  11.             ev.pages[0].graphic.tile_id = tile_id
  12.             ev.pages[0].always_on_top = true
  13.             events[ev.id] = Game_Event.new(map_id, ev)
  14.             @mask_event_count += 1
  15.             break
  16.           end
  17.         end
  18.       end
  19.     end
  20.   end
  21.   alias rb_setup_20170317 setup
  22.   def setup(map_id)
  23.     rb_setup_20170317(map_id)
  24.     create_mask_events
  25.   end
  26. end

用法还是一样,地形标志设置为 7 的图快将会无条件出现在最上面。如果同一个位置有两个这样的图快,则只会考虑最高图层上地形标志为 7 的块。

当然,事件铺多了可能会造成掉帧,楼主给出的测试工程铺了 300 多个事件,帧率降低了 2 帧左右。不过这个可以通过修改 Game_Map#update 来防止卡机。在 Game_Map 的 392 行起可以加上一个防卡机判定。在我的代码中,用来铺遮罩层的事件的 ID 从 1000 开始算(因此不会和地图事件冲突)。
RUBY 代码复制
  1. for event in @events.values
  2.   event.update if event.id < 1000
  3. end

楼主可以比较一下我和 guoxiaomi 的方案,选出一个适合自己的使用。

点评

非常感谢,也是一个不错的方法,但是单位机子太老,估计跑不动。谢谢您的热心回答~  发表于 2017-3-7 22:47

评分

参与人数 2星屑 +270 收起 理由
guoxiaomi + 150 塞糖
89444640 + 120

查看全部评分

yang1zhi 发表于 2017-3-6 12:41:57
无限图层
熊的选民 发表于 2017-3-6 09:41:17
这个我也没找到办法解决。如果用脚本调到大于5游戏会崩溃。

点评

握爪~所以我才会考虑修改角色的 Z 坐标  发表于 2017-3-6 09:44
soulsaga 发表于 2017-3-6 09:21:31
LZ自己解決了..但一直没有回复..

点评

O....这样啊..祝身体安康..  发表于 2017-3-7 13:42
是guoxiaomi帮忙解决的,昨天感冒前兆,赶紧单位拿药喝水躺了一天休息。要是重了至少得一个礼拜才能恢。复。  发表于 2017-3-7 09:13
guoxiaomi 发表于 2017-3-5 22:13:12
看这里吧~

XP版 ULDS

这个确实可以提供无限多的图层

点评

看着都头疼- -b我还是用直观可见的吧。图层少点可以把大场景分散成小场景,地图遮挡单调。  发表于 2017-3-7 09:10
guoxiaomi 发表于 2017-3-4 23:42:45
本帖最后由 guoxiaomi 于 2017-3-4 23:45 编辑
89444640 发表于 2017-3-4 23:19
我想了一下,好像不太行,因为角色体积横向宽度大于32,如果角色脚下没有踩到事件上,就不能算激活这个遮 ...


不是很懂你的描述……你说的“事件”是指我上面的“标记”吗?

我的想法是,可以把角色能踩到的地方全都标记上。然后把遮挡角色的地图元件优先级设为 1 ,把被角色遮挡的地图元件优先级设为 0 。
这样不管走到哪里,优先级为 1 的元件都会挡住角色。

点评

有bug就截个图吧  发表于 2017-3-5 00:20
我还是先整进去测试一下吧……  发表于 2017-3-5 00:19
89444640 发表于 2017-3-4 23:19:21
本帖最后由 89444640 于 2017-3-4 23:22 编辑
guoxiaomi 发表于 2017-3-4 18:54
有一个思路是,利用地形标记,如果角色或事件踩在了被标记的图块上,就把角色或事件的 Z 坐标拉低,这样就 ...


我想了一下,好像不太行,因为角色体积横向宽度大于32,如果角色脚下没有踩到事件上,就不能算激活这个遮挡,然后会出现破皮的现象,当角色脚下的32格踩到事件上,会出现遮挡,然后走出事件,又没有遮挡
最容易想的就是马,骑马时候肯定宽度大于高度,然后只遮挡角色32*32位置与事件重合的时候,其他时候依然破皮。
看来还是想想办法找怎么定义那个星号5的高度。
而且说不准图像的长宽高,相当于说不准角色会有几个32*32格子,因为是变化的……或者这样,扩大角色的X轴判定,扩大到反正全屏也就480,32*12这么大不可能角色全屏……不对,有可能 飞空艇!
所以如果实在找不到那个改变星号5地图编号的地方,扩大角色的X轴判定为横向12格,这样无论角色在哪里,前方的原件肯定会挡住角色
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-21 12:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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