aceprite)スクリプトで色を変換する

  godotではありませんが、ゲームで使用するアニメーション用のドット絵を、acepriteというソフトで作っています。

 元々、フルカラーで絵を作っていました。しかし、『都市伝説解体センター』、というゲームで、色を青と赤のみに絞り、その濃淡のみでドット絵を作って作っていたのに感銘を受け(美しく、かつ、色を決める手間がだいぶ省けます)、途中から青と黄色で作るようになりました。
 しかし、途中まで作っていたフルカラーの絵の素材は膨大で、その一つ一つのacepriteのファイルについて、一個ずつ色を指定、変換していくのは、かなり大変です。

(同じ敵でも、方向やアクションごとにファイルを作っているため、同じ色変換でも、色を選択する作業が大変です)

そこで、スクリプトで色の変換内容を事前に指定、実行できないか、試してみました。

スクリプトはluaというスクリプト言語で書く必要があります。ただ、何か特別な物をインストールする必要は無く、テキストファイルに書いたソースの拡張子を、luaにして、所定の場所に置くだけです。以下手順です。


■スクリプトの配置方法

https://zenn.dev/ail/scraps/99f60dd6152801

①以下、file⇒scripts⇒open script folder、をクリック、開いたフォルダにスクリプトファイルを置きます(スクリプトについては後で述べます)
②同様に、file⇒scripts⇒rescan scripts folder、をクリック、acepriteに配置したスクリプトを認識させます。

③スクリプト名がaceprite内で表示されることを確認

(ここでは後で述べますが、replace_color、というこちらで付けたスクリプト名が表示されます、任意の名称です。①、②の時点では表示されませんが、以下のように、③の時点になると、file⇒scripts⇒replace_color、と表示されます。)

④replace color、をクリックすると、通常であれば、edit⇒replace color、で手動で行っていた色の置換が、自動で、スクリプト内で事前に指定した色について、できます。










■スクリプトの書き方

以下、公式の記載を参照して書きました。

https://www.aseprite.org/api/command/ReplaceColor


・スクリプトの記載
テキストファイルに、以下内容を記入。拡張子を.luaに変えます。

パレットの14番の色を、26番の色に変えます。uiの部分は、false、にすると、aceprite内で、replace colorの確認windowが表示されなくなります。

app.command.ReplaceColor {

  ui=true,

  channels=FilterChannels.INDEX,

  from=Color{index=14},

  to=Color{index=26},

  tolerance=0

}


■カラーモードも併せて変更が必要

やってみると、以下のように、手動の場合同様、確認画面が出ますが・・・

OKボタンを押しても、色が変わりません・・・

これは、以下赤枠の箇所で、RGBA、の各色と透明度の要素について、色変換を反映させるか選択する欄があるのですが、この箇所が全て灰色で、「変換しない」という指定になっているから、です。

この箇所は、手動で色変換を起動した場合、初期値で全て白色の、「変換する」、という指定になっているのですが、なぜかスクリプトで起動すると、「変換しない」、になってしまっているんですよね・・・

acepriteのコミュニティに入って、慣れない英語でbag repot のところに記載したので、もしかしたら今後のバージョンで何か対応してくれるのかもしれません。

とりあえず今は、色指定は自動で行えるので引き続きスクリプトを使用し、マウスで赤枠部分をクリックして、変換していこうと思います。
⇒と書いたのですが、色々設定を見ていて、自己解決しました。
以下、別の箇所にaceprite自身の色モード設定があり、それがRGBカラーでした。
しかし、自分のスクリプトはindexを使っているので、おそらくこれをindexにして、合わせたほうが良いのでしょう。

実際合わせてみると、色変換に成功しました。
すると、あたらしいindex、というボタンが現れ、これが、”modify index component”、となっており、さきほどのRGBA同様、indexについて色を変更する、という意味のようです。


■カラーモード選択と、layer, frameの全選択を、スクリプト化
また、カラーモードを事前に設定するスクリプトがあり、indexedを設定する場合、以下の記載です。

(CahngePixcelFormatは、選択したlayer, frameのみで有効のようで、自分の場合全体を対象にしたかったため、処理を追加しています、一部を選択する場合、layerやframeの名称を指定することも可能です)。


--全層の名称を格納したテーブルを作成
local t_layers = {}
for i, layer in ipairs(app.activeSprite.layers) do
    --app.alert (layer.name)
    table.insert(t_layers, layer.name)
end

--全フレームの名称を格納したテーブルを作成
local t_frames = {}
for i, frame in ipairs(app.activeSprite.frames) do
    --app.alert (frame.frameNumber)
    table.insert(t_frames, frame.frameNumber)
end

--テーブル指定のレイヤー・フレーム
--(全レイヤー・フレーム)を選択
app.range.layers = t_layers
app.range.frames = t_frames

--カラーモードをindexedに設定
app.command.ChangePixelFormat{
  format="indexed"
}

※)参考サイト
https://github.com/aseprite/api/blob/main/api/range.md#rangetype
https://roblox-starter.com/programing-lua/lua-lesson20-operate-table/
https://unity-yuji.xyz/aseprite-lua-scripts-api/


■最終的な色変換スクリプト


--全層の名称を格納したテーブルを作成
local t_layers = {}
for i, layer in ipairs(app.activeSprite.layers) do
    --app.alert (layer.name)
    table.insert(t_layers, layer.name)
end

--全フレームの名称を格納したテーブルを作成
local t_frames = {}
for i, frame in ipairs(app.activeSprite.frames) do
    --app.alert (frame.frameNumber)
    table.insert(t_frames, frame.frameNumber)
end

--テーブル指定のレイヤー・フレーム
--(全レイヤー・フレーム)を選択
app.range.layers = t_layers
app.range.frames = t_frames

--カラーモードをindexedに設定
app.command.ChangePixelFormat{
  format="indexed"
}

--色をパレット14⇒26に変更(ui=trueにすれば変更時確認可能)
app.command.ReplaceColor {
  ui=false,
  channels=FilterChannels.INDEX,
  from=Color{index=14},
  to=Color{index=26},
  tolerance=0
}


バグレポートで伝えてしまったコミュニティの方には余計な調査をさせてしまったかもしれず、謝罪と結果を報告しておきました。

コメント

このブログの人気の投稿

プラグイン(godot sqlite)を含めてエクスポートすると、データの更新ができない問題

初心者に良い本は? → 『 ゆるっとはじめるGodot Engine ゲームプログラミング 』

他シーンからシグナルを送る方法