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].

參考資料