关于自定义照明效果
相关插件
基于核心:
◆Drill_CoreOfDynamicMask 系统 - 动态遮罩核心
插件本体:
◆Drill_LayerIllumination 地图 - 自定义照明效果
◆Drill_MouseIllumination 鼠标 - 自定义照明效果
你可以用自己画的照明资源图片,绑定在某些物体上,实现发光。
名词索引
以下你可以按住ctrl键点击下面的词,可以直接定位到想了解的名词:
黑暗层 | 黑暗层 黑暗层开关 黑暗层颜色 |
光源/照明 | 物体照明 高级照明 限时动态照明光源颜色 光源图片层级 遮挡设计 |
插件关系
照明效果的插件关系如下,实线表示必须插件,虚线表示可断开的扩展插件。
自定义照明
黑暗层
1) 定义
黑暗层: 指将地图全部涂黑的层级。
照明/光源: 指将涂黑的层级反向画亮的贴图对象,该贴图对象可以绑定事件,也可以单独控制变化,实现不同的光源照明效果。
2) 黑暗层开关
下面以一个实际的例子说明。
白天如下图。(白色的地图表示黑暗层关闭,蓝色的表示黑暗层开启。)
黑夜如下图。(白色的地图表示黑暗层关闭,蓝色的表示黑暗层开启。)
由图可知,无论外界如何变化,商店和小屋都是亮的,矿场和黑暗森林都是暗的。这四张地图 不受外界影响,所以是锁定的黑暗层状态。
那么,外界 和 锁定 分别对应插件中的 插件指令 和 地图备注 控制。
插件指令无法影响 锁定地图 的黑暗层。但是可以影响默认的黑暗层。
换句话说,就是临时锁定不会影响外面的昼夜运作,但是临时锁定无法修改。插件指令可以控制外面的昼夜运作,且在任何地图执行都有效。
比如,屋内添加锁定注释,屋外地图没有注释。
那么,在屋内执行插件指令,屋内不会变黑,去了屋外,会发现已经变黑。
3) 复杂黑暗层开关
如果你想制作:一个房间,可以开灯关灯,然后另一个房间,也可以开关灯。
按照黑暗层开关来设计,就变得复杂的多了,最好避免这种设计。
你应该使用 灯事件的大范围照明开关 来实现,而不是控制整个黑暗层开关。
想办法通过事件照明来绕开复杂情况,思路会清晰许多。
4) 黑暗层颜色
黑暗层的底层原理是滤镜,所以不能修改混合模式。
黑暗层默认是固定黑色"#000000",你可以设置整体为蓝色、红色、绿色。
比如黑暗层改为#000099:
注意,只有 黑暗层开启后 才能有黑色夜晚的效果。
另外,黑暗层不要设置太多的透光,否则与 直接地图滤镜 就没什么区别了。
照明
物体照明:指绑定在具体事件、玩家身上的照明对象,但每个玩家/事件只能绑定一个。物体照明可以用事件注释设置绑定,切换事件页后,需要添加关闭的注释。
高级照明:指独立的照明对象,可以依附于事件、玩家身上。多个高级照明可以绑定在同一个物体上,也可以单独控制移动、透明度变化。
高级照明需要用插件指令单独创建并控制属性。
限时动态照明:指只能存在一段时间的照明,时间结束后会被清除。
本质上来看限时动态照明就是 预设的高级照明 。该预设 会从100-200中获取未创建的编号,然后创建一个高级照明,并设置生命时间、绑定对象、透明度变化。
光源与颜色
1) 标准资源
标准照明资源为白色和透明色。
因为白色会作为黑暗层相减的颜色,在黑暗层中剪出一个区域。
按照一对一的资源,每个资源都对应一种光源,也就是说你要画很多资源。
你可以偷懒,用重复的资源进行缩放,达到不同程度的光源效果:
2) 多种颜色
插件与纯色滤镜的功能相似。
光的三原色是:红、绿、蓝。
黄=红+绿。紫=红+蓝。青=蓝+绿。白=红+绿+蓝。
注意,你可以在资源图片中画黑色,黑色和透明的效果一样,不影响黑暗层颜色。
但是基于之前光源相互盖住的问题,你会发现黑色会盖住别的光源,强行画黑。
光源叠加
1) 图片层级
光源之间是可以相互叠加的,但是叠加方式和资源图片的先后顺序有一定的关系。
你可以自定义光源的图片图层,也可以通过插件指令临时修改。
如果光源只是白色,上述先后关系是看不出来的,不需要区分。因为白色叠加后还是白色。而这里以红色光源和白色的为例:
因为玩家光源在1层,事件光源在2层,玩家光源处于下方,所以事件会盖住玩家的白色光源。
2) 遮挡设计
如果你需要设计室内的墙壁,很简单,绘制一个纯黑色图片资源,然后绑定到事件身上,即可实现遮挡效果。
但是,由于都是图片资源,这样存在一些局限性,比如,下图的情况。
如果目标墙壁太薄,玩家的照明是可以直接透过墙壁的。
这个问题是无解的,因为电脑无法识别两张 资源图片 之间怎样实现光线遮挡。
比如,下图的情况。
系统需要对中心点进行切割放射,只有矢量光线(点列表)才能做到,而对于图片资源(色彩矩阵)来说,这显然做不到。
该插件使用图片资源进行照明配置,能极大地节省光线计算的性能,还能完美自定义。而选择了图片资源,就必须抛弃 光线遮挡 这类消耗极大性能的计算算法。毕竟鱼和熊掌不可兼得。
总而言之,要绕开这个问题,可以把墙壁做成至少3个图块的厚度,这样看起来就不那么突兀了。
性能影响
因为黑暗层和光源是在整个地图画面的基础上,绘制一层遮罩。
照明效果与滤镜相比,滤镜是每个事件、图片都加上一层滤镜。所以如果事件一多,滤镜的性能消耗会上涨的特别快,而照明在事件多的情况下上涨不会那么明显。
经过数次优化,照明插件的性能还是比较难压下去,因为主要消耗GPU的能力,通过客户端打开的游戏没有掉帧问题,而用浏览器进行游戏会比较吃力。
从零开始设计(DIY)
建立黑暗地图并添加照明
1. 设置一个目标
这里作者我想建立一个地图,进入地图后为全黑,看不见玩家,但有部分照明。
2. 新建工程
新建一个工程,导入随机一张地图。
3. 添加插件
在列表中添加照明插件,照明插件中有一些默认的照明配置。
把示例中,img/Map__illumination 文件夹全部内容复制到工程文件下。
4. 开启黑暗层
在地图备注中,添加黑暗层指令,确保黑暗层被开启。
=>自定义照明:临时锁定:开启
5. 添加事件
在地图中添加几个事件,并且设置绑定照明1。
6. 测试游戏
进入游戏中,可以看到这些事件都能正常发光了。
7. 细节调整
照明设置中,可以对相关的配置进行设置。
你也可以在一些特殊情况下,用插件指令添加“限时动态照明”,创建只能发光一小会的光源。