Script Aseprite per esportare i livelli visibili in file separati

Oggi stavo lavorando ad uno sfondo da utilizzare per un effetto parallasse.

Parallax Background

Ho creato un file su Aseprite con tre livelli, uno per ogni ParallaxLayer che volevo realizzare.

Ho esportato i file come PNG e li ho integrati in Godot.

Poi ho voluto fare qualche modifica e ho dovuto riesportare i livelli uno per volta, manualmente.

Poi ho voluto fare altre modifiche... e ho capito che dovevo trovare una soluzione automatica.

Dopo una breve ricerca ho scoperto che Aseprite è scriptabile in LUA.

LUA è un linguaggio molto semplice, anche non conoscendolo, con la reference del linguaggio da una parte e le API di Aseprite dall'altra, ho abbozzato uno script.

Lo script esporta i livelli visibili di un file come PNG numerate nella stessa cartella del file aperto.

Questa funzione serve ad estrarre l'elenco dei livelli visibili.

function GetVisibleLayers()
    data = {}
    for _, layer in ipairs(app.activeSprite.layers) do
        if layer.isVisible then
            table.insert(data, layer)
        end
    end
    return data
end

Questa funzione ripristina lo stato visibile dei livelli.

function RestoreVisibleLayers(data)
    for _, layer in ipairs(data) do
        layer.isVisible = true
    end
end

Queste sono utility function utilizzate per il salvataggio.

function GetFileName(str)
    return str:match(".+[/\\](.+)%.")
end

function GetDirName(str)
    return str:match("(.*[/\\])")
end

Questo è lo script vero e proprio. Prende lo sprite attivo, salva l'elenco dei livelli visibili, nasconde tutti i livelli, poi cicla i livelli salvati riattivandoli uno alla volta e salvando il file con il nome filename-1.png dove filename è il nome del file aperto su aseprite e 1 in questo caso è il primo livello dell'elenco.

local sprite = app.activeSprite
visible_layers = GetVisibleLayers()

for _, layer in ipairs(sprite.layers) do
    layer.isVisible = false
end

for i, layer in ipairs(visible_layers) do
    layer.isVisible = true
    local dir = GetDirName(sprite.filename)
    local spriteName = GetFileName(sprite.filename)
    local layerFileName = dir .. spriteName .. "-" .. i .. ".png"
    app.activeSprite:saveCopyAs(layerFileName)
    layer.isVisible = false
end

RestoreVisibleLayers(visible_layers)

Avrei potuto usare i nomi dei livelli ma personalmente mi viene più comodo avere come base il nome del file aseprite, dato che molto spesso creo livelli e non li rinomino.

Installare uno script in Aseprite è molto semplice. Basta copiarlo nella cartella degli script ed effettuarne la scansione (F5 su Windows).

Aseprite script folder

Qui il file completo: Export Layers.lua