Automapper/zh: Difference between revisions
No edit summary |
Zerol Acqua (talk | contribs) No edit summary |
||
(42 intermediate revisions by 3 users not shown) | |||
Line 2: | Line 2: | ||
<languages /> | <languages /> | ||
'''自动贴图'''是一个方便作者制作地图的工具。只需在贴图层简单地制定一些[[#Rules File|贴图规则]]编纂成组运用,就能省去诸如手动在冻结区域边角放置圆角贴图此类的麻烦。每组贴图规则需要指定一个贴图资源文件 | '''自动贴图'''是一个方便作者制作地图的工具。只需在贴图层简单地制定一些[[Special:MyLanguage/Automapper#Rules File|贴图规则]]编纂成组运用,就能省去诸如手动在冻结区域边角放置圆角贴图此类的麻烦。每组贴图规则需要指定一个贴图集(tileset),一般由一个导入的贴图资源文件构成;单个贴图集可以预设多种规则以备选用。所有规则文件位于游戏路径'''data/editor/automap/'''下<ref name="Automapper">[https://forum.ddnet.org/viewtopic.php?t=2428 自动贴图教程]</ref><ref name="ddnet-automapperfiles">[https://github.com/ddnet/ddnet/tree/master/data/editor/automap 自动贴图文件]</ref>。 | ||
Line 8: | Line 8: | ||
==贴图规则文件== | ==贴图规则文件== | ||
作为贴图 | 作为贴图集的图片资源文件,其自动贴图规则通常会写在另一个文本文件中,后缀固定为'''.rules''',规则文件名必须和资源文件名相同;每个'''贴图规则'''文件内可以写入多组自动贴图规则。此规则文件大致遵循 [https://en.wikipedia.org/wiki/INI_file INI 文件格式],文件中每组贴图规则以方括号括住规则组的名字为首行,并附带多行具体规则于其后,首行语法为<code>[规则组名]</code>。例如,在文件'''grass_main.rules'''中,有一组名为'''Grass''' 的贴图规则,它在文件中以 <code>[Grass]</code> 开头。要使用这组规则,您需要在地图编辑器中创建一个使用'''grass_main'''文件作为贴图集的贴图层:首先要新建一个[[Special:MyLanguage/Mapping#Layers|贴图层]](tile layer),然后右键单击此贴图层并选择资源图片(Image)为'''grass_main''',在此图层画好主体部分后,再次打开刚才的右键菜单并点击'''Auto Rule''',然后在下拉选项中选择'''Grass'''规则组,最后点击'''Auto map'''自动贴图。 | ||
强调:贴图规则的文件名'''必须'''和贴图资源的文件名保持一致。 | 强调:贴图规则的文件名'''必须'''和贴图资源的文件名保持一致。 | ||
Line 28: | Line 28: | ||
自动贴图时,从上往下读取规则组的每条规则依次自动执行替换: | 自动贴图时,从上往下读取规则组的每条规则依次自动执行替换: | ||
* 规则一般以方块编号开头,并尾随一系列位置关系描述; | * 规则一般以方块编号开头,并尾随一系列位置关系描述等替换条件; | ||
* | * 扫描图层,将同时符合此条规则所有替换条件的图块替换成句首指定的编号贴图(此时可能会覆盖先前规则替换好的方块位置,最后表现为同一位置只执行了最后一条规则)。 | ||
[[Special:MyLanguage#Syntax|除非禁用]],否则会先将替换贴图的步骤放入缓存 | [[Special:MyLanguage/Automapper#Syntax|除非禁用图层缓存]],否则在同组规则执行时,会先暂时将替换贴图的每个步骤放入缓存而非立即改变图层,先前执行规则发生的改变不会立即被后续规则扫描到,最后再将所有变化应用于图层。 | ||
[[File:Indices.png|thumb|227x227px|资源文件分块编号一览]] | [[File:Indices.png|thumb|227x227px|资源文件分块编号一览]] | ||
Line 36: | Line 37: | ||
==方块索引== | ==方块索引== | ||
每个资源文件导入后会被分割成16行16列,以左上角为0号方块,之后从左往右由0到15依次给第一行方块编号,每行编号完毕再到下一行,第二行左边开头为16号方块,依此类推。容易看出方块每次向右一格+1,向下一格+16,对应计算公式为<code>'''编号 = 16 * 行数 + 列数'''</code>(注意第一行和第一列在计算机中默认为第0行和第0列)。资源文件中0号方块的位置通常留空,贴图规则会将它称为<code>EMPTY</code>(空);其余位置的方块无论置空与否都会被当作<code>FULL</code>(满)。 | 每个资源文件导入后会被分割成16行16列的贴图集,以左上角为0号方块,之后从左往右由0到15依次给第一行方块编号,每行编号完毕再到下一行,第二行左边开头为16号方块,依此类推。容易看出方块每次向右一格+1,向下一格+16,对应计算公式为<code>'''编号 = 16 * 行数 + 列数'''</code>(注意第一行和第一列在计算机中默认为第0行和第0列)。资源文件中0号方块的位置通常留空,贴图规则会将它称为<code>EMPTY</code>(空);其余位置的方块无论置空与否都会被当作<code>FULL</code>(满)。 | ||
在规则文件中,编号的关键字是<code>INDEX</code>。 | 在规则文件中,编号的关键字是<code>INDEX</code>。 | ||
Line 49: | Line 50: | ||
<code>[您的规则组名]</code> | <code>[您的规则组名]</code> | ||
多个编号选择及其替换条件可以作为一个段落。 | |||
'''如何注释''' | '''如何注释''' | ||
Line 78: | Line 79: | ||
方块必须在选中的同时进行微调。 | 方块必须在选中的同时进行微调。 | ||
''' | '''替换条件''' | ||
在编号选择的语句下方 | 在编号选择的语句下方有一系列替换条件,如果一个图块符合所有条件就会被该编号贴图替换。 | ||
例如下方采用相对坐标的位置描述: | 例如下方采用相对坐标的位置描述: | ||
<code>POS 0 -1 FULL</code> | <code>POS 0 -1 FULL</code> | ||
这条规则描述在X坐标为0、Y坐标为-1的图块属性是<code>FULL</code>,也就是说[[Special:MyLanguage#Processing|相对位置]]上方一格有<code>FULL</code>图块的方块会被编号方块替换(其它位置条件也满足时)。如果上方是<code>EMPTY</code>则不会。 | 这条规则描述替换条件是在X坐标为0、Y坐标为-1的图块属性是<code>FULL</code>,也就是说[[Special:MyLanguage/Automapper#Processing|相对位置]]上方一格有<code>FULL</code>图块的方块会被编号方块替换(其它位置条件也满足时)。如果上方是<code>EMPTY</code>则不会。 | ||
除了<code>FULL</code>或<code>EMPTY</code>之外,您还可以直接指定方块编号<code>INDEX</code>: | |||
<code>POS 0 -1 INDEX 12</code> | <code>POS 0 -1 INDEX 12</code> | ||
如果[[Special:MyLanguage/Automapper#Processing|相对位置]]上方存在12号方块,就会满足替换条件。使用<code>OR</code>连接编号来扩大判断条件,例如判断上方有没有12或13号方块其中之一: | |||
<code>POS 0 -1 INDEX 12 OR 13</code> | <code>POS 0 -1 INDEX 12 OR 13</code> | ||
类似可以用<code>NOTINDEX</code>来反选一个编号。 | |||
'''随机规则''' | |||
''' | |||
通过添加随机规则,您可以让一些方块按照一定概率出现在贴图中: | |||
<code>RANDOM 20%</code> | <code>RANDOM 20%</code> | ||
随机规则可以从0到100%取值,这个值是此编号的替换概率<ref name="RandomRule">[https://github.com/ddnet/ddnet/blob/0abb32514b6e9643154dc6bcdc4a754defbf2321/src/game/editor/auto_map.cpp#L312 随机规则的实现]</ref> | |||
</ | 如果您在取值的时候'''忘记'''添加<code>%</code>,概率计算时不会除以100,而是按照如下公式: | ||
<code>概率 = 1.0 / 取值</code> | |||
取值大于100时可以表示更稀有的处于0和1%之间的概率。 | |||
例如:<code>RANDOM 150</code>得到的概率大约是<code>1.0 / 150 ≈ 0.67</code>。 | |||
'''模运算''' | |||
< | 使用<code>MODULO x的重复周期 y的重复周期 x的偏移坐标 y的偏移坐标</code>,你可以根据图块的X和Y坐标创建一个重复的图案。例如,<code>MODULO 2 3 0 -1</code>使用[https://en.wikipedia.org/wiki/Modular_arithmetic 模运算] 来设置X轴每2个图块重复一次(<code>x的重复周期</code>)上和Y轴每3个图块重复一次(<code>y的重复周期</code>)。第三和第四个参数可以用来X的偏移坐标(这里是0)和Y的偏移坐标(这里是-1),从而移动图案。只有当以下两个规则都成立时,图块才会被放置: | ||
</ | |||
<code>(x + x的偏移坐标) % x的重复周期 == 0</code> | |||
<code> | |||
< | <code>(y + y的偏移坐标) % y的重复周期 == 0</code> | ||
</ | |||
这里<code>%</code>是[https://en.wikipedia.org/wiki/Modulo 模运算符]。 | |||
'''默认规则''' | |||
''' | |||
游戏会自动在所有规则下默认添加一条替换条件,用于判断被替换处原本是否有方块,如果原本就是空的,默认也不会更改此处。即默认添加如下条件: | |||
<code>POS 0 0 FULL</code> | <code>POS 0 0 FULL</code> | ||
如果你想把图层空白处也纳入替换范围,可以添加'''下方'''的替换条件: | |||
<code>NoDefaultRule</code> | <code>NoDefaultRule</code> | ||
'''释放缓存''' | |||
''' | |||
通过在段落中添加代码<code>NewRun</code>,当自动贴图执行到这一行时,会立即将缓存好的变化应用于图层,后续规则会受到前面贴图改变情况的影响。简单用法是在这一行前面完成基础造型,后面进行细致装饰(例如在一些边角额外添加可能会超出原有贴图范围的装饰)。 | |||
'''禁用图层缓存''' | |||
''' | |||
通过在段落中添加代码<code>NoLayerCopy</code>可以[https://en.wikipedia.org/wiki/In-place_algorithm 快速替换贴图],显著改善性能,因为自动贴图每条规则替换都直接应用于图层,而不会暂时缓存。但是也可能会造成一些意外结果! | |||
<span id="Tools"></span> | <span id="Tools"></span> | ||
==工具== | ==工具== | ||
下面是一些方便制作贴图规则的工具: | |||
*[https://github.com/AssassinTee/SimpleDDNetAutomapper SimpleDDNetAutomapper]:一个带图形界面的简单应用,有助于处理基本贴图规则和贴图集。但是它只支持<code>EMPTY</code>和<code>FULL</code>,不支持随机贴图和<code>POS INDEX</code>规则。 | |||
* [https://github.com/AssassinTee/SimpleDDNetAutomapper SimpleDDNetAutomapper] | *[https://github.com/k2d222/twwe Teeworlds Web Editor]:自动贴图编辑和实时预览<ref name="twwe">[https://github.com/k2d222/twwe/blob/main/README.md#unique-features Teeworlds web editor 特色功能]</ref>。 | ||
* [https://github.com/k2d222/twwe Teeworlds Web Editor] | *[https://github.com/Aerll/rpp rpp]:rules++是一个小尝试,致力于通过激发DDNet贴图规则的潜能把地图作者变成懒狗。也就是说它非常简单、易读并极重视正确性,就别管其它了<ref name="rpp">[https://github.com/Aerll/rpp/blob/main/README.md#about rules++ 介绍]</ref>。 | ||
* [https://github.com/Aerll/rpp rpp] | |||
<span id="Resources"></span> | <span id="Resources"></span> |
Latest revision as of 06:28, 2 March 2025
自动贴图是一个方便作者制作地图的工具。只需在贴图层简单地制定一些贴图规则编纂成组运用,就能省去诸如手动在冻结区域边角放置圆角贴图此类的麻烦。每组贴图规则需要指定一个贴图集(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°,可以同时使用XFLIP
和YFLIP
,而不是ROTATE
。
如果您要将方块旋转270°,可以同时使用XFLIP
、YFLIP
和ROTATE
。
方块必须在选中的同时进行微调。
替换条件
在编号选择的语句下方有一系列替换条件,如果一个图块符合所有条件就会被该编号贴图替换。 例如下方采用相对坐标的位置描述:
POS 0 -1 FULL
这条规则描述替换条件是在X坐标为0、Y坐标为-1的图块属性是FULL
,也就是说相对位置上方一格有FULL
图块的方块会被编号方块替换(其它位置条件也满足时)。如果上方是EMPTY
则不会。
除了FULL
或EMPTY
之外,您还可以直接指定方块编号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
。
模运算
使用MODULO x的重复周期 y的重复周期 x的偏移坐标 y的偏移坐标
,你可以根据图块的X和Y坐标创建一个重复的图案。例如,MODULO 2 3 0 -1
使用模运算 来设置X轴每2个图块重复一次(x的重复周期
)上和Y轴每3个图块重复一次(y的重复周期
)。第三和第四个参数可以用来X的偏移坐标(这里是0)和Y的偏移坐标(这里是-1),从而移动图案。只有当以下两个规则都成立时,图块才会被放置:
(x + x的偏移坐标) % x的重复周期 == 0
(y + y的偏移坐标) % y的重复周期 == 0
这里%
是模运算符。
默认规则
游戏会自动在所有规则下默认添加一条替换条件,用于判断被替换处原本是否有方块,如果原本就是空的,默认也不会更改此处。即默认添加如下条件:
POS 0 0 FULL
如果你想把图层空白处也纳入替换范围,可以添加下方的替换条件:
NoDefaultRule
释放缓存
通过在段落中添加代码NewRun
,当自动贴图执行到这一行时,会立即将缓存好的变化应用于图层,后续规则会受到前面贴图改变情况的影响。简单用法是在这一行前面完成基础造型,后面进行细致装饰(例如在一些边角额外添加可能会超出原有贴图范围的装饰)。
禁用图层缓存
通过在段落中添加代码NoLayerCopy
可以快速替换贴图,显著改善性能,因为自动贴图每条规则替换都直接应用于图层,而不会暂时缓存。但是也可能会造成一些意外结果!
工具
下面是一些方便制作贴图规则的工具:
- SimpleDDNetAutomapper:一个带图形界面的简单应用,有助于处理基本贴图规则和贴图集。但是它只支持
EMPTY
和FULL
,不支持随机贴图和POS INDEX
规则。 - Teeworlds Web Editor:自动贴图编辑和实时预览[5]。
- rpp:rules++是一个小尝试,致力于通过激发DDNet贴图规则的潜能把地图作者变成懒狗。也就是说它非常简单、易读并极重视正确性,就别管其它了[6]。