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

Project1

 找回密码
 注册会员
搜索
查看: 4313|回复: 17
打印 上一主题 下一主题

[推荐问答] 优先级可否设置大于5

[复制链接]

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
跳转到指定楼层
1
发表于 2017-3-4 13:51:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 89444640 于 2017-3-4 13:52 编辑

默认最大优先级是5,遮挡向上5格,对于默认人物没事,我这个超标严重,一直因为不会脚本只能忽略了。

后果就是只要角色图片高度大于32*5=160像素的,全都破皮了。如下所示

因为这个,当时设定好的骑马穿越森林的地图我都废弃了……

请教各位如何设置能让优先级大于5
最好可以调节到999什么的,就是相当于作为前景使用的地图原件,遮挡后方所有。

最好直接可以调节带星号的遮挡,比如6789A~Z显示遮挡高度,
如果不行可否考虑用地形标志解决。地形标志是0~7 所有0都是默认不能用,用所有为7的,怎么弄一下,让地形标志位7的,遮挡度为999,话说地图最高多少来着……500
那就直接设定成遮挡500吧。

希望能帮一下忙~谢谢~

评分

参与人数 1星屑 +100 收起 理由
RyanBern + 100 精品文章

查看全部评分

Lv5.捕梦者 (版主)

梦石
1
星屑
24004
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

来自 2楼
发表于 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 互糖了嘞

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
3
 楼主| 发表于 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格,这样无论角色在哪里,前方的原件肯定会挡住角色
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
24004
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

4
发表于 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
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
5
 楼主| 发表于 2017-3-5 00:40:21 | 只看该作者
本帖最后由 89444640 于 2017-3-5 01:06 编辑
guoxiaomi 发表于 2017-3-4 23:42
不是很懂你的描述……你说的“事件”是指我上面的“标记”吗?

我的想法是,可以把角色能踩到的地方全都 ...


好像用了这个方法后,都不用管地形标记了 只要遮挡大于1的都会遮挡角色全身……
横版情况下。如果是从地面长出来的树柱子 墙壁之类的还好,因为没有角色从下方接触图块的可能,
如果是这种雕挂花纹,断壁之类的,跳跃接触的瞬间依然会出现遮挡异常

还得多测试测试。

我还是弄个素材工程,你边改脚本边调节吧,
Project2.rar (384.9 KB, 下载次数: 105)
横版森林中前景树木应该遮挡全部人物
接触的时候依然是遮挡不全,什么时候头自始至终被树木遮挡,这剧情就能用了。否则只能大草原跑马。

点评

我看看  发表于 2017-3-5 09:03
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
24004
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

6
发表于 2017-3-5 22:13:12 | 只看该作者
看这里吧~

XP版 ULDS

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

点评

看着都头疼- -b我还是用直观可见的吧。图层少点可以把大场景分散成小场景,地图遮挡单调。  发表于 2017-3-7 09:10
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36497
在线时间
10811 小时
注册时间
2009-3-15
帖子
4815
7
发表于 2017-3-6 09:21:31 | 只看该作者
LZ自己解決了..但一直没有回复..

点评

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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
8085
在线时间
7346 小时
注册时间
2010-7-16
帖子
4915

开拓者

8
发表于 2017-3-6 09:41:17 | 只看该作者
这个我也没找到办法解决。如果用脚本调到大于5游戏会崩溃。

点评

握爪~所以我才会考虑修改角色的 Z 坐标  发表于 2017-3-6 09:44
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

9
发表于 2017-3-6 12:41:57 | 只看该作者
无限图层
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

10
发表于 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

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-12-4 03:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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