近期评论

    今日最热

    No top posts yet

    RMMV 昼夜系统

    这个插件目前实现了随时间流逝的昼夜日照变化,以及基于Tile的固定光源。

    多说无益,直接上图:

    白昼

    正午

    黄昏

    夜晚

    清晨

     

    我想,明眼人应该已经看出来了,这里的日光变化是用类似Tint Screen的方式靠滤镜(Filter)实现的,而不是像TerraxLight那样在Spriteset_Map的上方绘制一层黑幕。事实上,本插件是在正常的ScreenToneChanger的下方增加了一层光照滤镜,Tint Screen的操作还是可以正常执行。我个人感觉这样的视觉效果会更好,当然见仁见智。

    Game Maker们可以用插件的参数来定义一天之中的时段,并设置每个时段的“起止时间”、“光照效果”、“灯光效果”和“Tileset替换功能”。具体如下:

    如上所见,时段的定义是一个列表,可以在其中创建任意多的项。发挥想象力吧!

    每一个时段的具体信息如下:

    “Start Time”和“End Time”应该不需要解释了。“Screen Tone”定义了该时段使用的光照滤镜,数值的意义和设置Tint Screen的时候完全一直,可以照抄过来。

    第四行可能让人有点费解,其实就是给光照滤镜的作用范围下一个定义。比如,灯火通明的室内显然不会受到外部日光变化的影响。

    第五行“Available lightings”是一个列表,定义了这个时段会起作用的灯光。其中每一项是一个Id,对应灯光设置中的一项,这个后面再说。

    第六行又有点让人费解了。先看看效果吧:

            

    看出区别了吗?就是窗户。

    室内虽然不容易受到日光的影响,但有些细节还是需要根据时段而变化。这个选项的作用就是定义一些Tileset对,让它们在进入特定的时段后会互换,从而产生时间变化的感觉。

    最后一行“Indicator”指定了一个Switch作为特定时段的标识,如果在该时段内则该Switch变成On,否则变成Off。也可以设为0,也就是不需要这个指示器,因为插件内部会保留自己的指示器。但是,如果你需要根据不同的时段触发不同的事件时,就有必要定义这个量。

     

     

    有了时段的定义之后,产生时间流逝的视觉效果的工作就完成了一大半了。下面需要考虑的就是灯光。

    本插件实现灯光效果的方式和TerraxLight的类似,都不是画上灯光,而是去改变“夜幕”。不过,因为本插件使用滤镜来实现光照变化,所以实现细节和TerraxLight不同。而且……现在只实现了基于Tile的静止圆形光源,功能上不如TerraxLight那么丰富。

    先看看效果:

    事实上,灯光的作用主要是取消特定范围内的滤镜效果,实现方式是改写PIXI的ColorMatrixFilter类,用新的FragmentShader来实现带掩码(Mask)的滤镜效果。

    所以,同样是白光,不同的强度(色彩的明度)会使取消滤镜的程度不同,如下(三个光源分别是街灯、井口和路中间的花):

    灯光的颜色也会影响滤镜的过滤结果,实际上可以认为是加上了色彩滤镜,如下:

    本插件和TerraxLight的目标略有不同,基本只是以烘托气氛为主,所以不容易得到恐怖游戏式的阴暗感。不过,如果把夜色加深或许也会有类似的效果吧,比如:

    见仁见智。

     

    好,说了这么多效果,下面来介绍灯光的设置。之前介绍时段的时候已经提到,时段当中能够设置生效的灯光列表,用来让灯光在不同时段产生不同的行为。

    下面是如何设置特定的灯光效果:

    如上所见,灯光效果也是一个列表,可以添加任意多的项。不过,因为现在插件使用的是Terrain Tag触发,而RMMV的Terrain Tag最多只能到7,所以也不可能太多。

     

    第一行“Terrain tag”是触发这个灯光效果的Terrain Tag(就是Tileset设置里面最下面的一个选项,平时很少用到)。只要在有效的时段内绘制具有这个Terrain Tag的Tile,就会自动在这个Tile上绘制相应的灯光效果。

    第二行和第三行是灯光的颜色和范围,因为现在只有圆形灯光,所以范围就是半径。色彩的值虽然有四个子项,但那是为了能复用四通道色彩结构,其实最后一项gray是无效的。

    最后一行“Blink”决定这个灯光是静态还是动态。一般电灯可以设为静态,而火光则基本是动态比较好。动态的灯光会每隔一秒重绘一次,产生微微晃动闪烁的感觉。

    虽然看上去好像一个Terrain Tag只能设置一种灯光效果,但其实也可以创建很多拥有相同Terrain Tag的灯光项,只要让它们在不同的时段生效就行了,还能产生同一组灯在不同时间效果不同的感觉。

     

    那么,本插件的主要功能就介绍完了……好像还忘了什么……

    对了,设置里面还有两项没介绍。就是这两个:

     

    这两项各代表一个变量(Variable),用来保存当前的时间。本插件只会读取这个时间,而永远不会去修改这两个值!也就是说,本插件并不负责控制游戏中时间的流逝,这个需要游戏制作者自己控制。最简单的方法是用一个并行Common Event按特定时间间隔改写这两个值。

    之所以使用这种方式,是因为我觉得这样比较灵活,也能减少插件的设置参数(绝对不是我做不出来时间流逝喔)。因为变量的值和时段的起止时间都没有限定,所以你完全可以让一天有200个小时,一个小时只有10分钟,而且也可以根据需要在不同地图使用不同的时间流逝速度。比如,在房间里和在大地图上行走同样的距离显然不可能用同样长的时间,对吧?

    好了,这样本插件的所有细节基本都介绍了。最后一点温馨提示:

    为了能做出带掩码的滤镜效果,所以直接改写PIXI的类和渲染代码,因此兼容性难以保证,请有兴趣的同学测试之后告诉我,谢谢。另外,因为这只是0.1版,肯定会有Bug,如果遇到问题可以在这里或者我的主页留言。

    下载:

    http://warmbloodedsnake.com/blog/wp-content/uploads/2018/01/WBS_daynight.zip

    这里面有三个文件,常用插件的人应该很容易分辨。

    js文件是插件主体,放在plugins目录下。

    两个png文件是对应的Tileset的夜间版本,可以拷贝到img/tilesets目录下,然后创建对应的夜间版Tileset,就可以测试。