本帖最后由 guoxiaomi 于 2017-3-5 11:18 编辑 有一个思路是,利用地形标记,如果角色或事件踩在了被标记的图块上,就把角色或事件的 Z 坐标拉低,这样就能显示在所有的图块之下。 将这段代码插入到Main前,覆写了 Game_Character 原来的 screen_z(height = 0) 方法,这个方法是改变角色/事件的 Z 坐标。 RUBY 代码复制
然后设置一个元件的地图标记为 7 ,打开 10 号开关。这里添加开关,是为了防止这种奇葩脚本带来更多的麻烦,如果不需要用到这个功能,就把 10 号开关关掉。 下面,把踩在此元件之上的事件/角色,称之为“被标记”。这段代码的意思是,如果事件/角色被标记,那么事件/角色的 Z 坐标会被设置为 一个比 32 小的值。但如果此事件的行走图是地图元件,那么 Z 坐标会被设置为优先级 * 32。 1. 所有优先级为 0 的元件,高度都是 0,所以一定会被事件/角色遮挡。 2. 如果角色被标记,所有优先级不为 0 的元件,都会遮挡角色。 3. 如果角色被标记,某事件(非元件图块)也被标记,会根据 Y 坐标决定遮挡,Y 坐标小的被遮挡 4. 如果角色被标记,某事件(元件图块)也被标记,如果图块的优先级为 0,会被角色遮挡,如果图块的优先级为 1,会遮挡角色。 范例里面按下 Shift 键打开 10 号开关。白色的花被标记了 7 ,并且设置了某些元件的优先级为 1 ,请自行查看 F9 。 ![]() 为什么不修改Tilemap的各图块高度,因为我根本没有找到怎么定义每层每个图块元件的 Z 属性。 以及地图最高高度为 800(来源 F1) 可以把这个脚本的 4 - 10 行插入到 Game_Character 的 screen_z(height = 0) 方法里,在该方法已有的内容前。 讨论之后的结果是,整张地图都要用到特殊的遮挡效果,干脆就不判断地图标记,改为开关打开时使用特殊的遮挡效果,让角色的 Z 坐标 = 角色在屏幕上的 Y 坐标 RUBY 代码复制
这里所谓的特殊的遮挡效果,就把原来的图块成以下 7 层,3层在角色脚下(优先级为0),3层在角色/事件上方(优先级不为0),而且遮挡的效果与角色在屏幕上的 Y 坐标没有关系。 ![]() |
Tilemap 类是 RGSS1 为数不多不可被修改的一个类,我们无从得知它内部的实现究竟是怎样的。不过从测试的情况来看,数据库的“优先级”的确是起着一个高度的作用,也就是说,优先级为5的图快,它就盖不住从地面往上数的第六块的位置。需要注意的是,如果主角在地图上上下移动的话,坐标覆盖的情况应当有所调整(因为表示角色的图形是一个整体,具有统一的 z 坐标)。 最正规的办法当然是设置更高优先级的图快,但上面回帖已经说明不可行,更改为6以上会造成游戏的崩溃(可能库只考虑到5的情况)。 用 ULDS 直接画一层遮罩层应该说是一个不错的解决办法,但是 XP 的 ULDS,别说楼主了,作为作者的我都不怎么愿意用,因为,太难用。 不过,我们可以利用事件来把这个遮罩层铺出来(设置为“在最前面显示”即可),但是考虑到地图太大,一个个复制事件不是一个好主意,所以我们可以利用脚本来做这件事。 RUBY 代码复制
用法还是一样,地形标志设置为 7 的图快将会无条件出现在最上面。如果同一个位置有两个这样的图快,则只会考虑最高图层上地形标志为 7 的块。 当然,事件铺多了可能会造成掉帧,楼主给出的测试工程铺了 300 多个事件,帧率降低了 2 帧左右。不过这个可以通过修改 Game_Map#update 来防止卡机。在 Game_Map 的 392 行起可以加上一个防卡机判定。在我的代码中,用来铺遮罩层的事件的 ID 从 1000 开始算(因此不会和地图事件冲突)。 RUBY 代码复制
楼主可以比较一下我和 guoxiaomi 的方案,选出一个适合自己的使用。 |
无限图层 |
本帖最后由 guoxiaomi 于 2017-3-4 23:45 编辑 89444640 发表于 2017-3-4 23:19 不是很懂你的描述……你说的“事件”是指我上面的“标记”吗? 我的想法是,可以把角色能踩到的地方全都标记上。然后把遮挡角色的地图元件优先级设为 1 ,把被角色遮挡的地图元件优先级设为 0 。 这样不管走到哪里,优先级为 1 的元件都会挡住角色。 |
本帖最后由 89444640 于 2017-3-4 23:22 编辑 guoxiaomi 发表于 2017-3-4 18:54 我想了一下,好像不太行,因为角色体积横向宽度大于32,如果角色脚下没有踩到事件上,就不能算激活这个遮挡,然后会出现破皮的现象,当角色脚下的32格踩到事件上,会出现遮挡,然后走出事件,又没有遮挡 最容易想的就是马,骑马时候肯定宽度大于高度,然后只遮挡角色32*32位置与事件重合的时候,其他时候依然破皮。 看来还是想想办法找怎么定义那个星号5的高度。 而且说不准图像的长宽高,相当于说不准角色会有几个32*32格子,因为是变化的……或者这样,扩大角色的X轴判定,扩大到反正全屏也就480,32*12这么大不可能角色全屏……不对,有可能 飞空艇! 所以如果实在找不到那个改变星号5地图编号的地方,扩大角色的X轴判定为横向12格,这样无论角色在哪里,前方的原件肯定会挡住角色 |
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2025-2-19 00:43
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.