Automapper/zh: Difference between revisions
Created page with "'''选择要用的贴图编号'''" |
Updating to match new version of source page |
||
(62 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 27: | Line 27: | ||
==贴图规则执行过程== | ==贴图规则执行过程== | ||
贴图 | 自动贴图时,从上往下读取规则组的每条规则依次自动执行替换: | ||
* 规则一般以方块编号开头,并尾随一系列位置关系描述等替换条件; | |||
* 扫描图层,将同时符合此条规则所有替换条件的图块替换成句首指定的编号贴图(此时可能会覆盖先前规则替换好的方块位置,最后表现为同一位置只执行了最后一条规则)。 | |||
[[Special:MyLanguage/Automapper#Syntax|除非禁用图层缓存]],否则在同组规则执行时,会先暂时将替换贴图的每个步骤放入缓存而非立即改变图层,先前执行规则发生的改变不会立即被后续规则扫描到,最后再将所有变化应用于图层。 | |||
[[File:Indices.png|thumb|227x227px|资源文件分块编号一览]] | [[File:Indices.png|thumb|227x227px|资源文件分块编号一览]] | ||
Line 33: | 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 46: | Line 50: | ||
<code>[您的规则组名]</code> | <code>[您的规则组名]</code> | ||
多个编号选择及其替换条件可以作为一个段落。 | |||
'''如何注释''' | '''如何注释''' | ||
Line 53: | Line 57: | ||
<code>#这是一条注释。</code> | <code>#这是一条注释。</code> | ||
'''选择要用 | '''选择要用于贴图替换的方块编号''' | ||
<code>INDEX 42</code> | |||
<code>INDEX 42</code | |||
这一行'''选中'''了42号方块(第三行第11列)。使用<code>OR</code>可以同时选中多个编号,例如同时选中42和43号: | |||
<code>INDEX 42 OR 43</code> | <code>INDEX 42 OR 43</code> | ||
'''对贴图微调''' | |||
''' | |||
</ | 将42号方块做水平和竖直翻转:<code>Index 42 XFLIP YFLIP ROTATE</code> | ||
< | <code>XFLIP</code> 水平翻转; | ||
<code> | <code>YFLIP</code> 竖直翻转; | ||
</ | <code>ROTATE</code> 90°旋转。 | ||
如果您要将方块旋转180°,可以同时使用<code>XFLIP</code>和<code>YFLIP</code>,而'''不是'''<code>ROTATE</code>。 | |||
<code>XFLIP</code> | |||
如果您要将方块旋转270°,可以同时使用<code>XFLIP</code>、<code>YFLIP</code>和<code>ROTATE</code>。 | |||
方块必须在选中的同时进行微调。 | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | <div lang="en" dir="ltr" class="mw-content-ltr"> | ||
If you want to select a tile without any rotations or flips, you can use <code>NONE</code>. Otherwise all tiles with the given <code>INDEX</code> will be selected. | |||
</div> | </div> | ||
'''替换条件''' | |||
''' | |||
在编号选择的语句下方有一系列替换条件,如果一个图块符合所有条件就会被该编号贴图替换。 | |||
例如下方采用相对坐标的位置描述: | |||
<code>POS 0 -1 FULL</code> | <code>POS 0 -1 FULL</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> |
Revision as of 17:29, 5 May 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
。
方塊必須在選中的同時進行微調。
If you want to select a tile without any rotations or flips, you can use NONE
. Otherwise all tiles with the given INDEX
will be selected.
替換條件
在編號選擇的語句下方有一系列替換條件,如果一個圖塊符合所有條件就會被該編號貼圖替換。 例如下方採用相對坐標的位置描述:
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]。