Ren’Pyのレイヤー画像解説または複数パーツにわたる画像の宣言とRen’Pyの画像定義あれこれ

 キャラクターの画像を表情毎、服装毎と用意していくと倍々算どころではなく増えていくため、Ren’Pyには複数パーツに分かれた画像ファイルをまとめて一つの画像として使用するレイヤー画像機能がありますがいろいろややこしいのでここで補足解説します。

 レイヤー画像について説明する前に画像名について説明します。Ren’Pyでは画像を表示するときに画像ファイルパス直接ではなく、画像名を定義してから扱います。直接扱うこともできますが取り敢えずそういうものと思いましょう。画像名はスペース区切りの一つ以上の要素で構成され、一つ目はタグ、二つ目以降は属性(attribute)と呼び、imageステートメントで定義します。

image tarou smile jeans=”ファイルパス”

 この例ではtarouがタグでsmile, jeansが属性です。一度定義すれば画像名でshow, sceneステートメント等から呼び出せます。

 Ren’Pyでは画像名を自動定義する方法が二つ用意されています

 一つ目はgames/imagesディレクトリー下の画像ファイルの自動定義です。これはディレクトリー名は無視し、ファイル名で画像名を定義します。ファイル名にスペースがあればタグと属性にも分けられます。

game/images/eileen happy.png
game/images/Eileen Happy.jpg
game/images/eileen/eileen happy.png

 これらはすべてeileen happyという画像名になります。

 もう一つの方法はconfig.automatic_imagesの使用です。この設定変数に区切り文字 [ ' ', '_', '/' ]を入れるとgamesディレクトリー下の画像で設定した区切り文字で二つ以上の要素に分けられる物は画像名が定義されます。

 例の区切り文字で例えばimages/character/tarou/jeans/smile.pngという画像ファイルがあればimages character tarou jeans smileという画像名になります。これでは使いにくいので先頭から任意の文字を取り除くconfig.automatic_images_stripも併せて使いますこの設定変数に”images/character/”と入れておけばその文言が除去されtarou jeans smileという画像名になります。

 自動定義は手動定義の名前と被らなければ定義されます。

 以上をふまえて以下のレイヤー画像のサンプルスクリプトを見てください。太郎というタグのレイヤー画像を定義しています。サンプル中では日本語で服とか使っていますがわかりやすさのためなので本番ではアルファベットにしましょう。

補足 python3では2バイト文字の変数が使えるので3モードでなら日本語で定義してもいけると思いますが、その場合でも安全のためよくチェックした方がよいです。

layeredimage 太郎:
always:
"裸ののっぺらぼう画像"
group 服:
attribute スーツ:
"太郎_服_スーツ"
attribute ジーンズ:
"太郎_服_ジーンズ"
group 目:
pos (100, 100)
attribute オープン default:
"太郎_目_オープン"
    attribute ウィンク:
"太郎_目_ウィンク"

 この辺はわかりやすいと思います。showステートメントで太郎 ジーンズ オープンと呼ぶ出すと"裸ののっぺらぼう画像", "太郎_服_ジーンズ", "太郎_目_オープン"が順に被さって表示され、結果はジーンズを着て目を開いた太郎君の画像になります。 ここでalwaysブロックに記述した"裸ののっぺらぼう画像"はつねに表示されます。属性(attribute)名の後にデフォルトをつけるとその属性がデフォルトになるので特に目グループの属性を指定しなければ太郎君は目を開けたままです。一方服グループにはデフォルトが設定されていないのでジーンズかスーツ属性を表示する画像名に含めないと裸になります。またそれぞれのブロックにはtransformプロパティーが指定できるので目の例のように、目画像の表示位置を指定できます。レイヤー画像のサイズは各画像の最大サイズになります。

 ここで注意するべきなのは、”太郎_服_ジーンズ”のような文字列は画像名であって画像ファイル名ではないことです。先述の方法で画像名を定義しておかないと各画像は表示されません。

補足 layerdimageステートメントにimage_formatプロパティーで”images/{image}.png”のような文字列を指定すれば直接ファイルも呼べますが、まず使う機会はないでしょう。

 さらに属性毎に直接画像名を指定しなくてもRen’Pyはタグ、グループ名、あればグループバリエーション名、属性名の順にアンダーバーで繋げたものを画像名として推定してくれます。グループ名にautoを続ければ、この法則で解釈出来る画像名を勝手に探して定義してもくれます。これを踏まえると先のサンプルコードが以下のように簡単に出来ます。

layeredimage 太郎:
always:
"裸ののっぺらぼう画像"
group 服 auto
group 目 auto:
pos (100, 100)
attribute オープン default

 デフォルト属性のみは明示的に指定する必要がありますが他の属性は自動で定義してくれます。

補足 グループにはvariantとprefixの二つのプロパティーも任意で指定できます。

 前者は画像名の推測や自動定義時にのみ影響し、グループのバリエーション名となります。例えば服グループにvariantプロパティー ”青”を追加すると太郎_服_青_ジーンズと太郎_服_青_スーツを追加で検索、定義してくれるような気がしますがそんなことはなく普通に青バージョンしか定義してくれません。

 後者はアンダーバーを挟んで属性名の接頭辞になりますが存在意義が不明です。

 いまいち何をしたいのか謎の機能ですが、グループを入れ子に出来ないのでこの二つで何とかしなさいということなのかと思われます。