DecalRegistry
参考/引用
- 摘自b站 Wiki (描述不详细, 但很全, 含 helper 自定义的 DecalRegistry 内容)
- celeste 地图制作指南 (装饰, decals)(适合新手, 有配图)
- 摘自 Everest Wiki (描述详细, 且提供了自定义 DecalRegistry 的教程)
- DecalRegistry 使用 by 底龙
如果你有留意过原版的 Decal, 可能会发现一些 Decal 放置后就自带特殊效果, 无需额外设置.
这是因为官方会通过代码中的硬编码路径规则, 自动为特定的 Decal 添加效果. 例如:
Gameplay/decals/7-summit/cloud_*下的云 Decal 自动获得视差效果0-prologue/house房子自动获得烟囱冒烟效果10-farewell/cliffside等很多 9a 的 Decal 自动获得浮动效果 (像月亮块一样)
官方硬编码是爽了, 但是 Mapper 就无法直接让自己的 Decal 享受这些预设效果了.
因此, Everest 提供了 DecalRegistry.xml 这一配置文件, 将这些原本写死在代码中的 Decal 效果开放为配置项. Mapper 只需要在其中注册对应的 Decal 路径, 就可以使用这些效果.
注意
DecalRegistry.xml 与砖块的 XML 不同, DecalRegistry.xml 的应用范围是你整个 mod 项目, 而不是单个章节, 因此你一旦设置好一个 decal 属性, 你在你的 mod 中的任何章节使用它的属性都会生效, 不能实现在一个章节中它有特效一个章节中它没有特效.
DecalRegistry.xml 的设置
你可能需要了解一下什么是XML
首先, 在你的项目根文件夹 (蔚蓝本体/Mods/你的项目)中, 创建一个 DecalRegistry.xml (可以先创建一个 .txt 文本文档, 然后再重命名), 像这样
打开它, 在其中输入
1 2 3 4 | |
在上述容器中, 我们可以对装饰物添加属性, 针对每一个装饰物, 我们需要先建立一个 decal 容器:
1 2 3 | |
这样, 基本结构就已经设置好了, 也就是说你的 DecalRegistry.xml 的完整结构应该是类似于:
1 2 3 4 5 6 7 8 9 10 11 | |
现在, 我们来介绍每一个单独的 Decal 属性
Decal 属性
animation 和 animationSpeed
1 2 | |
动画控制器, 可以控制你的 decal 动画播放.
frames 中的帧数对应动画的数字序号, 假设你的动画有 60 帧, 你的文件命名应当是 name00.png 一直到 name59.png, 而这里面每一帧的序号就分别是0到59.
frames 书写是每个数字使用英文逗号隔开, 同时可以使用如下符号:
- m-n: 表示从序号为 m 的帧播放到序号为 n 的帧.
- m*n: 表示将序号为 m 的帧播放 n 次.
例如对于 1, 2, 4-6, 3*2 的展开就是 1, 2, 4, 5, 6, 3, 3
banner
1 | |
相当于按 sliceSize 间距横着将图片切分成若干份, 之后每一段会随正弦函数摆动, 常用于小草等装饰物的随风摆动
拟合函数图像 \(f(x) = \mathrm{amplitude} \times \sin(\mathrm{sliceSinIncrement} \times \mathrm{speed} + \mathrm{offset})\)
floaty
1 | |
让装饰物可以有上下漂浮的效果
smoke
1 | |
offsetX 和 offsetY 都是基于装饰的画布中心来计算的
parallax
1 | |
这个参数可以让装饰有视差, 和 bg 一样, amount 参数可正可负的, 相当于 bg 从 scroll=1 开始计算
sound
1 | |
event 里面填 event 名字
bloom
1 | |
发光 offset 从画布中心开始计算
light
1 | |
lightOcclude
1 | |
阻挡光线的区域
overlay
1 | |
相当于把 decal 作为 Tile(不受缩放影响) 替换掉 decal 对应位置的 Tile, 比如把你的 decal 放在 Dash Block 上, Dash Block 身上的部分区域就会被替换(建议 decal 长宽为 8px 倍数)
使用上感觉不如用 staticMover 或者 Eevee Helper 直接把 decal 粘在对象上
scale
1 | |
装饰放缩
randomizeFrame
1 | |
装饰会从随机的一帧开始
coreSwap
1 | |
flagSwap
1 | |
path 从 Gameplay 往后填写
mirror
1 | |
给装饰添加一个镜面反射效果, decals/modname/mytexture.png 对应的镜面贴图是 mirrormasks/modname/mytexture.png 用彩色图像来定义镜面的远近
- 红色值表示 X 方向偏移
- 绿色值 Y 方向偏移
白色(颜色值为 255)表示最近, 黑色(颜色值为 0)表示最远
staticMover
1 | |
将装饰连接在实体的判定箱上, Y 方向向下
scared
1 | |
- hideRange: 当玩家距离 decal 小于该值时, decal 进入 hide 状态并播放 hide 动画, 使用 hiddenFrames 里的帧序列
- showRange: 当玩家距离 decal 大于该值时, decal 进入 show 状态并播放 show 动画, 使用 showFrames 里的帧序列
其他情况正常播放 idleFrames 里的帧序列
solid
1 | |
给装饰加一个可以交互的碰撞箱, 但是不能和 container 起作用
- x 和 y 从装饰中间开始计算, Y 方向向下
- index 是交互的材质音效
- safe 用于判定草莓能否被收集
depth
1 | |
可以规定装饰的层级
由Adam’s Add-Ons提供的属性
rotate
1 | |
- rotate 允许装饰物围绕其自身中心旋转
- speed 控制旋转速度
- addX 与 addY 允许装饰沿轴进行位移运动
- addWind 允许装饰按倍率受风的影响被吹动
oscillate
1 | |
- oscillate 允许装饰沿 Y 坐标轴进行转动, 像立体旋转一样
- speed 定义旋转速度, offset 定义位差
- backPath 表示旋转时背面对应的图片路径(相对于
decals文件夹), 不填默认跟正面用的一样
举例: 你的装饰文件如果放在 Celeste/Mods/yourMap/Graphics/Atlases/Gameplay/decals/yourName/yourMap 文件夹内,
文件名叫做 flower.png 此处的写法就应该是: yourName/yourMap/flower
aim
1 2 | |
- aim 会让装饰朝向玩家所在的方向
- theo 参数控制是否响应 theo 水晶所在的方向
pendulum
1 | |
pendulum 允许装饰像钟摆一样摆动
- speed 定义摆动速度
- offset 定义起始位差
- angle 定义摆动角度
shake
1 2 | |
shake 会使得装饰随机“颤抖”
- width 与 height 控制随机颤抖的区域大小
- delay 是出现颤抖的间隔
move
1 | |
move 本质是让装饰相对于所在的位置发生偏离, 但是结合前文 adamsaddons.rotate 一起就可以做出类似于风车一样的效果,
由于 rotate 会使得装饰本身也产生旋转, 因此可以在此用 locked 参数锁定旋转, width 与 height 就是装饰相对于装饰所在点产生的位移
randomize
1 | |
randomize 可以将你的装饰随机化变换!
- frame 应用于你的装饰原本是一个动画序列的情况, 它将会取消装饰的动画播放, 转而变成随机从这些帧数里面挑一张展示
- flipX 与 flipY 决定随机处理装饰时是否会让他出现上下或者左右翻转
- rotations 的整数表示这个装饰将会以几个不同的角度出现, 比如
rotations="4", 则这个装饰在地图中可能以旋转0, 90, 180, 270度的形态随机出现 - colors 中填入的是若干 hex 颜色代码, 如
colors="ffffff,ff0000,00ff00,0000ff", 等同于“白, 红, 绿, 蓝”, 不同颜色的 hex 代码用英文逗号隔开 - shrink 表示随机处理装饰的时候其最小放缩的倍数, 设置完成后在地图中装饰会以
shrink ~ 1倍随机大小出现在地图中 - chance 决定随机处理装饰的概率, 比如
chance="0.25", 则地图中约有四分之一的装饰可能会被随机化处理
fade
1 2 | |
fade 属性可以让装饰以匀速不透明度进行闪烁
- alphaFrom 为起始不透明度
- alphaTo 为终止不透明度
- randomize 将其随机化 offset 表示起始位差
wobble
1 | |
wobble 会让装饰产生像原版泡泡一样的鼓动效果
width 和 height 控制的是在对应方向的挤压变形倍率 如 width="0.25" 时,
宽度就会在 75%-125% 之间鼓动, height 同理
depthChange
1 2 3 | |
playerAttach
1 2 3 4 | |
cameraAttach
1 2 3 | |
debris (一般和Static Mover属性一起用)
1 | |
global
1 | |
让装饰物既便在玩家离开房间的状态下也能持续刷新, 类似于全局 decal 的效果
- transitionUpdate 是否在房间过渡阶段刷新
- frozenUpdate 是否在冻结帧刷新
- pauseUpdate 是否在游戏暂停时刷新
animateOnFlag
1 | |
让 decal 在特定 flag 激活时才会播放动画 (控制动画播放)
- singleFrame: 每当 flag 激活一次, decal 才会前进一帧
mouseAttach
1 2 3 | |
字面意思, 将 decal 粘在鼠标上
- offsetX 和 offsetY 设置 decal 的偏移量
- flag 属性存在时需要 flag 才会将装饰物粘到鼠标上
由 Frost Helper 提供的属性
rainbow
1 | |
让 decal 进行彩虹变化, 可以被能改变彩虹刺颜色的实体改变变化的颜色.
由 Jungle Helper 提供的属性
rainbow
1 | |
让 decal 进行彩虹变化, 可以被能改变彩虹刺颜色的实体改变变化的颜色.
由 Xaphan Helper 提供的属性
flagsHide
1 | |
默认情况下 flags 中只要存在一个这个 decal 就会被隐藏
由 Kosei Helper 提供的属性
kill
1 | |
装饰会刺杀玩家
moving
1 2 3 | |
装饰运动
trail
1 2 | |
装饰运动 + 轨迹


