DecalRegistry
阅读
2024-08-09更新
最新编辑:分隔符个awa
阅读:
更新日期:2024-08-09
最新编辑:分隔符个awa
在制图过程中,想必大家经常碰到类似于这样的问题:
为什么在别人的地图中,装饰可以附着在机关上?
为什么别人的装饰可以摆动,但是在文件中却没有相应的动画?
为什么有些装饰能发光?为什么有些装饰能变化?诸如此类的问题。
这些问题的答案,全部都是因为mapper赋予了这些装饰物特殊的属性,而为了实现这些属性,本文将会介绍一个神奇的工具,装饰物注册表(Decal Registry)。
注册表文件建立
如果需要在你的地图中开启装饰物注册表,只需要在你的Mod文件夹(Celeste/Mods/你的Mod文件夹名)内,everest.yaml旁边新建一个文本文档,之后将创建的这个文本文档xxx.txt的名字改为DecalRegistry.xml(注意大小写)即可。
注册表书写示例
装饰物注册表为xml格式,但是在windows系统中可以使用系统自带“记事本”打开。
下面提供一个装饰物注册表,即上述创建的DecalRegistry.xml文件的示例:
<decals>
<decal path="path1">
<function parameter1="value1" parameter2="value2" parameter3="value3"/>
</decal>
<decal path="path2">
<function parameter="value"/>
</decal>
<decal path="path3">
<function parameter="value"/>
</decal>
......
</decals>
下面将针对上述内容进行解析。
xml基本结构
<decals>
......(此处插入:装饰的xml录入语句)
</decals>
两行构成装饰物注册表的基本结构,<decals>置顶,</decals>置底。
装饰的xml录入语句
在上述xml基本结构的中间省略号处,可以插入装饰的xml录入语句。
针对一个装饰的xml录入语句如下:
<decal path="path">
<function parameter="value"/>
</decal>
path :此处填写装饰文件相对于Celeste/Mods/你的Mod文件夹名/Graphics/Atlases/Gameplay/decals的位置
举例 :你的装饰文件如果放在Celeste/Mods/yourMap/Graphics/Atlases/Gameplay/decals/yourName/yourMap文件夹内,文件名叫做flower.png
此处的写法就应该是:
<decal path="yourName/yourMap/flower">
function :属性名称,下一节介绍。
parameter :针对需要的function底下的参数进行设置,下一节会做介绍。
特别注意:每一行function的末尾一定是以/>结尾。
装饰注册表属性函数
这一节我们将会展开讲述所有可用的装饰注册表属性函数,对应前文的function部分。
animation 和 animationSpeed
<animation frames="帧数"/>
<animationSpeed value="整数"/>
动画控制器, 可以控制你的decal动画播放。
frames中的帧数对应动画的数字序号, 假设你的动画有60帧, 你的文件命名应当是name00.png一直到name59.png, 而这里面每一帧的序号就分别是0到59.
frames书写是每个数字使用英文逗号隔开, 同时可以使用如下符号:
m-n, 表示从序号为m的帧播放到序号为n的帧。
m*n, 表示将序号为m的帧播放n次。
value单位为帧/秒。
banner
<banner speed="小数" amplitude="小数" sliceSize="整数" sliceSinIncrement="小数" easeDown="true或者false" offset="小数" onlyIfWindy="true或者false"/>
拟合函数图像 f(x)=amplitude*sin(sliceSinIncrement*speed+offset)
等价于 f(x)=Asin(wt+p)
amplitude 表示这个摆动的最大幅度处距离中心线的距离,也就是说amp如果设置为10,那么banner效果的摆动范围就是-10到+10,也就是范围为20的摆动。
sliceSize 设置的是分割整体的大小,因为banner效果的渲染实际上是将这个装饰分为多个小的部分然后再设置它的位移,举例说明,你的装饰如果是一个10px * 10px的正方形,sliceSize设置为1的话,那么你就会看见这个正方形在游戏中从下到上每1px的高度处都被划开然后分开摆动。
sliceIncrement 即从起点随着sliceSize数量(也就是距离摆动起点的距离)的增加,摆动幅度的增加速度。
easeDown 会改变起点的位置,蔚蓝默认摆动起点在下面,但是有了这个参数后,摆动的起点可以改成在上面。
floaty 和 smoke
<floaty/>
<smoke offsetX="小数" offsetY="小数" inbg="true或者false"/>
floaty 和 smoke就是字面意思,分别能够让装饰出现类似月亮块的悬浮效果, 以及冒烟。
offsetX和offsetY都是基于装饰的画布中心来计算的
inbg 即是否让烟雾只出现在背景层上(让烟雾成为bgdecal)
parallax
<parallax amount="小数"/>
这个参数可以让装饰有视差, 和bg一样, amount参数可正可负的, 相当于bg从scroll=1开始计算
sound
<sound event=""/>
event里面填event名字
bloom
<bloom offsetX="小数" offsetY="小数" alpha="小数" radius="小数"/>
装饰发光
offset 从画布中心开始计算
light 与 lightOcclude
<light offsetX="小数" offsetY="小数" color="hex" alpha="小数" startFade="整数" endFade="整数"/>
与bloom不同,light的作用是在装饰的某个位置添加一个点光源,因此其参数设置都是和光源的设置一样。
其中几个参数设置的都是位置,其位置大概如下:
光源 -->alpha<-- startFade -->alpha衰减到0<-- endFade
<lightOcclude x="整数" y="整数" width="整数" height="整数" alpha="小数"/>
overlay
<overlay/>
让装饰变成类似于材质贴图的作用
scale
<scale multiply="小数" multiplyY="小数"/>
装饰放缩
randomizeFrame
<randomizeFrame/>
装饰会从随机的一帧开始
coreSwap
<coreSwap coldPath="" hotPath=""/>
装饰可以根据8a的冷热模式来变化
flagSwap
<flagSwap flag="" offPath="" onPath=""/>
path从Gameplay往后填写
mirror
<mirror keepOffsetsClose="true或者false"/>
给装饰添加一个镜面反射效果, decals/modname/mytexture.png 对应的镜面贴图是 mirrormasks/modname/mytexture.png
用彩色图像来定义镜面的远近, 红色值=X方向偏移, 绿色值=Y方向偏移
白色(颜色值为255)表示最近, 黑色(颜色值为0)表示最远
staticMover
<staticMover x="整数" y="整数" width="整数" height="整数"/>
装饰连接于实体的判定箱, +Y 方向向下
scared
<scared hideRange="整数" showRange="整数" hideFrames="帧数" showFrames="帧数" idleFrames="帧数" hiddenFrames="帧数" />
物体 >>> hideFrames <<< hideRange --- showRange >>> showFrames <<< 远处
solid
<solid x="小数" y="小数" width="小数" height="小数" index="整数" blockWaterfalls="true或者false" safe="true或者false"/>
给装饰加一个可以交互的碰撞箱, 但是不能和container起作用
x和y从装饰中间开始计算, +Y方向向下
index是交互的材质音效
safe用于判定草莓能否被收集
index: None = 0, Asphalt = 1 ,Car = 2 ,Dirt = 3 ,Snow = 4 ,Wood = 5 ,Bridge = 6 ,Girder = 7 ,Brick = 8 ,Zip Mover = 9 ,Space Jam (Inactive) = 11 ,Space Jam (Active) = 12 ,Resort Wood = 13 ,Resort Roof = 14 ,Resort Platform = 15 ,Resort Basement = 16 ,Resort Laundry = 17 ,Resort Boxes = 18 ,Resort Books = 19 ,Resort Forcefield = 20 ,Resort Clutterswitch = 21 ,Resort Elevator = 22 ,Cliffside Snow = 23 ,Cliffside Grass = 25 ,Cliffside Whiteblock = 27 ,Gondola = 28 ,Glass = 32 ,Grass = 33 ,Cassette Block = 35 ,Core Ice = 36 ,Core Rock = 37 ,Glitch = 40 ,Internet Café = 42 ,Cloud = 43 ,Moon = 44
depth
<depth value="整数"/>
可以规定装饰的层级
values: BGTerrain = 10000 ,BGMirrors = 9500 ,BGDecals = 9000 ,BGParticles = 8000 ,SolidsBelow = 5000 ,Below = 2000 ,NPCs = 1000 ,TheoCrystal = 100 ,Player = 0 ,Dust = -50 ,Pickups = -100 ,Seeker = -200 ,Particles = -8000 ,Above = -8500 ,Spinners = -8500 ,Solids = -9000 ,FGTerrain = -10000 ,FGDecals = -10500 ,DreamBlocks = -11000 ,PlayerDreamDashing = -12000 ,Enemy = -12500 ,FakeWalls = -13000 ,FGParticles = -50000 ,Top = -1000000 ,FormationSequences = -2000000
Helper提供的属性函数
Adam's Add-Ons
adamsaddons.rotate
<adamsaddons.rotate speed="小数" addX="小数" addY="小数" addWind="小数"/>
rotate允许装饰物围绕其自身中心旋转
speed控制旋转速度,addX与addY允许装饰沿轴进行位移运动,addWind允许装饰按倍率受风的影响被吹动
adamsaddons.oscillate
<adamsaddons.oscillate speed="小数" offset="小数" backPath="decals/路径"/>
oscillate允许装饰沿Y坐标轴进行转动,像立体旋转一样
speed定义旋转速度,offset定义位差,
backPath里面填装饰文件相对于Celeste/Mods/你的Mod文件夹名/Graphics/Atlases/Gameplay/decals的位置
举例 :你的装饰文件如果放在Celeste/Mods/yourMap/Graphics/Atlases/Gameplay/decals/yourName/yourMap文件夹内,文件名叫做flower.png
此处的写法就应该是:yourName/yourMap/flower
adamsaddons.aim
<adamsaddons.aim/>
<adamsaddons.aim theo="true或者false"/>
aim会让装饰朝向玩家所在的方向,theo参数控制是否响应theo水晶所在的方向
adamsaddons.pendulum
<adamsaddons.pendulum speed="小数" offset="小数" angle="整数"/>
pendulum允许装饰像钟摆一样摆动,speed定义摆动速度,offset定义起始位差,angle定义摆动角度
adamsaddons.shake
<adamsaddons.shake/>
<adamsaddons.shake delay="小数" height="整数" width="整数"/>
shake会使得装饰随机“颤抖”,width与height控制随机颤抖的区域大小,delay是出现颤抖的间隔
adamsaddons.move
<adamsaddons.move amount="整数" width="整数" height="整数" locked="true或者false"/>
move本质是让装饰相对于所在的位置发生偏离,但是结合前文adamsaddons.rotate一起就可以做出类似于风车一样的效果
由于rotate会使得装饰本身也产生旋转,因此可以在此用locked参数锁定旋转
width与height就是装饰相对于装饰所在点产生的位移
adamsaddons.randomize
<adamsaddons.randomize frame="" flipX="true false" flipY="true false" rotations="整数" colors="" shrink="小数" chance="小数"/>
randomize可以将你的装饰随机化变换!
frames应用于你的装饰原本是一个动画序列的情况,它将会取消装饰的动画播放,转而变成随机从这些帧数里面挑一张展示
flipX与flipY决定随机处理装饰时是否会让他出现上下或者左右翻转
rotations的整数表示这个装饰将会以几个不同的角度出现,比如rotations="4",则这个装饰在地图中可能以旋转0,90,180,270度的形态随机出现
colors中填入的是若干hex颜色代码,如colors="ffffff,ff0000,00ff00,0000ff",等同于“白,红,绿,蓝”,不同颜色的hex代码用英文逗号隔开
shrink表示随机处理装饰的时候其最小放缩的倍数,设置完成后在地图中装饰会以 shrink ~ 1倍 大小随机出现在地图中
chance决定随机处理装饰的概率,比如chance="0.25",则地图中约有四分之一的装饰可能会被随机化处理
adamsaddons.fade
<adamsaddons.fade alphaFrom="小数"/>
<adamsaddons.fade alphaFrom="小数" alphaTo="小数" randomize="布尔值" speed="小数" offset="小数"/>
fade属性可以让装饰以匀速不透明度进行闪烁
alphaFrom为起始不透明度,alphaTo为终止不透明度,randomize将其随机化,offset表示起始位差
adamsaddons.wobble
<adamsaddons.wobble width="小数" height="小数" speed="小数" offset="小数" randomize="布尔值"/>
wobble会让装饰产生像原版泡泡一样的鼓动效果,width和height控制的是在对应方向的挤压变形倍率
如width="0.25"时,宽度就会在75%-125%之间鼓动,height同理
Frost Helper
frosthelper.rainbow
<frosthelper.rainbow/>
让decal进行彩虹变化,可以被能改变彩虹刺颜色的实体改变变化的颜色。
Jungle Helper
jungleHelper_rainbow
<jungleHelper_rainbow/>
让decal进行彩虹变化,可以被能改变彩虹刺颜色的实体改变变化的颜色。