Jump to content

自动贴图

From DDraceNetwork
Revision as of 17:14, 8 February 2025 by Darkh (talk | contribs) (Created page with "通过在段落中添加代码<code>NewRun</code>,当自动贴图执行到这一行时,会立即将缓存好的变化应用于图层,后续规则会受到前面贴图改变情况的影响。简单用法是在这一行前面完成基础造型,后面进行细致装饰(例如在一些边角额外添加可能会超出原有贴图范围的装饰)。")

自动贴图是一个方便作者制作地图的工具。只需在贴图层简单地制定一些贴图规则编纂成组运用,就能省去诸如手动在冻结区域边角放置圆角贴图此类的麻烦。每组贴图规则需要指定一个贴图集(tileset),一般由一个导入的贴图资源文件构成;单个贴图集可以预设多种规则以备选用。所有规则文件位于游戏路径下data/editor/automap/[1][2]


贴图规则文件

作为贴图集的图片资源文件,其自动贴图规则通常会写在另一个文本文件中,后缀固定为.rules,规则文件名必须和资源文件名相同;每个贴图规则文件内可以写入多组自动贴图规则。此规则文件大致遵循 INI 文件格式,文件中每组贴图规则以方括号括住规则组的名字为首行,并附带多行具体规则于其后,首行语法为[规则组名]。例如,在文件grass_main.rules中,有一组名为Grass 的贴图规则,它在文件中以 [Grass] 开头。要使用这组规则,您需要在地图编辑器中创建一个使用grass_main文件作为贴图集的贴图层:首先要新建一个贴图层(tile layer),然后右键单击此贴图层并选择资源图片(Image)为grass_main,在此图层画好主体部分后,再次打开刚才的右键菜单并点击Auto Rule,然后在下拉选项中选择Grass规则组,最后点击Auto map自动贴图。

强调:贴图规则的文件名必须和贴图资源的文件名保持一致。

示例的 Grass 自动贴图规则如下[3]:

[Grass]
Index 1

#top
Index 16
Pos 0 -1 EMPTY
...

贴图规则执行过程

自动贴图时,从上往下读取规则组的每条规则依次自动执行替换:

  • 规则一般以方块编号开头,并尾随一系列位置关系描述等替换条件;
  • 扫描图层,将同时符合此条规则所有替换条件的图块替换成句首指定的编号贴图(此时可能会覆盖先前规则替换好的方块位置,最后表现为同一位置只执行了最后一条规则)。

除非禁用图层缓存,否则在同组规则执行时,会先暂时将替换贴图的每个步骤放入缓存而非立即改变图层,先前执行规则发生的改变不会立即被后续规则扫描到,最后再将所有变化应用于图层。

资源文件分块编号一览

方块索引

每个资源文件导入后会被分割成16行16列的贴图集,以左上角为0号方块,之后从左往右由0到15依次给第一行方块编号,每行编号完毕再到下一行,第二行左边开头为16号方块,依此类推。容易看出方块每次向右一格+1,向下一格+16,对应计算公式为编号 = 16 * 行数 + 列数(注意第一行和第一列在计算机中默认为第0行和第0列)。资源文件中0号方块的位置通常留空,贴图规则会将它称为EMPTY(空);其余位置的方块无论置空与否都会被当作FULL(满)。

在规则文件中,编号的关键字是INDEX

语法

将您的规则组命名

与INI文件类似,您可以给贴图规则分段:

[您的规则组名]

多个编号选择及其替换条件可以作为一个段落。

如何注释

请使用#号开头,例如: #这是一条注释。

选择要用于贴图替换的方块编号

INDEX 42

这一行选中了42号方块(第三行第11列)。使用OR可以同时选中多个编号,例如同时选中42和43号:

INDEX 42 OR 43

对贴图微调

将42号方块做水平和竖直翻转:Index 42 XFLIP YFLIP ROTATE

XFLIP 水平翻转; YFLIP 竖直翻转; ROTATE 90°旋转。

如果您要将方块旋转180°,可以同时使用XFLIPYFLIP,而不是ROTATE

如果您要将方块旋转270°,可以同时使用XFLIPYFLIPROTATE

方块必须在选中的同时进行微调。

替换条件

在编号选择的语句下方有一系列替换条件,如果一个图块符合所有条件就会被该编号贴图替换。 例如下方采用相对坐标的位置描述:

POS 0 -1 FULL

这条规则描述替换条件是在X坐标为0、Y坐标为-1的图块属性是FULL,也就是说相对位置上方一格有FULL图块的方块会被编号方块替换(其它位置条件也满足时)。如果上方是EMPTY则不会。

除了FULLEMPTY之外,您还可以直接指定方块编号INDEX

POS 0 -1 INDEX 12

如果相对位置上方存在12号方块,就会满足替换条件。使用OR连接编号来扩大判断条件,例如判断上方有没有12或13号方块其中之一:

POS 0 -1 INDEX 12 OR 13

类似可以用NOTINDEX来反选一个编号。

随机规则

通过添加随机规则,您可以让一些方块按照一定概率出现在贴图中:

RANDOM 20%

随机规则可以从0到100%取值,这个值是此编号的替换概率[4]

如果您在取值的时候忘记添加%,概率计算时不会除以100,而是按照如下公式:

概率 = 1.0 / 取值

取值大于100时可以表示更稀有的处于0和1%之间的概率。

例如:RANDOM 150得到的概率大约是1.0 / 150 ≈ 0.67

默认规则

游戏会自动在所有规则下默认添加一条替换条件,用于判断被替换处原本是否有方块,如果原本就是空的,默认也不会更改此处。即默认添加如下条件:

POS 0 0 FULL

如果你想把图层空白处也纳入替换范围,可以添加下方的替换条件:

NoDefaultRule

释放缓存

通过在段落中添加代码NewRun,当自动贴图执行到这一行时,会立即将缓存好的变化应用于图层,后续规则会受到前面贴图改变情况的影响。简单用法是在这一行前面完成基础造型,后面进行细致装饰(例如在一些边角额外添加可能会超出原有贴图范围的装饰)。

禁用图层缓存

通过在段落中添加代码NoLayerCopy可以快速替换贴图,显著改善性能,因为自动贴图每条规则替换都直接应用于图层,而不会暂时缓存。但是也可能会造成一些意外结果!

工具

下面是一些方便制作贴图规则的工具:

  • SimpleDDNetAutomapper:一个带图形界面的简单应用,有助于处理基本贴图规则和贴图集。但是它只支持EMPTYFULL,不支持随机贴图和POS INDEX规则。
  • Teeworlds Web Editor:自动贴图编辑和实时预览[5]
  • rpp:rules++是一个小尝试,致力于通过激发DDNet贴图规则的潜能把地图作者变成懒狗。也就是说它非常简单、易读并极重视正确性,就别管其它了。[6].

参考资料