ノベルゲームのサイズでは大部分を画像ファイルが占めています。そのためこのサイズを縮めようと様々な方法が試みられてきました。そのひとつであり代表的な方法として差分画像の使用があります。これは複数の画像に共通する部分がある場合それを省略するというものです。
立ち絵を例にして説明します。通常は表情ごとに画像を用意するのですが、差分画像ではのっべらぼうの体を1枚用意し、目と口のみの画像を必要なだけ作ります。実際に表示するときは体に目口を貼り付けるだけです。これだけでかなりサイズが縮みます。
Ren’Py には複数の画像から 1 枚の画像を合成する方法がいくつかあります。LiveCompositeまたはim.Compositeを使用する方法と、FlattenとFixedを組合せる方法です。
211231 追記
Ren’Py本体にレイヤー画像という差分画像用の新機能が追加されました
Ren’Pyのレイヤー画像解説または複数パーツにわたる画像の宣言とRen’Pyの画像定義あれこれ
LiveComposite
ドキュメントを読んで一番最初に目につくのはLiveCompositeでしょう。これには作成する画像のサイズを第一引数にとったら、後は貼り付ける位置と画像をいくつでも指定できます。
image eileen composite = LiveComposite(
(300, 600), #最終的なサイズ
(0, 0), "body.png", #体パーツ
(0, 0), "clothes.png", #服パーツ
(50, 50), "expression.png") #表情パーツ
この方法の欠点として、これで作成した画像に透明化や加算合成をすると、パーツごとに透明化具合がズレてしまうことがあるという問題があります。また、最終的なサイズがわからないといけないというのも面倒です。
im.Composite
第二の方法として im.Composite の使用があります。使用方法はLiveCompositeとまったく同じなのですが、LiveCompositeが複数のテクスチャを持つ displayable を作成するのに対し、こちらは複数の画像を 1 つに合成した画像の画像マニピュレータを作成します。
image eileen composite = im.Composite(
(300, 600), #最終的なサイズ
(0, 0), "body.png", #体パーツ
(0, 0), "clothes.png", #服パーツ
(50, 50), "expression.png") #表情パーツ
こちらで作成した画像では透明化や加算合成が正常に動作します。
FixedとFlattenを組合せる方法
第三の方法としてFixedとFlattenを組合せる方法があります。Fixedも複数の画像を1つにまとめるクラスなのですが、こちらは面倒なサイズ
指定をする必要がありません。一番最初に指定した要素のサイズで作成されます。ただこれだと透明化時に問題が出るため、複数のテクスチャを持つ displayable を 1 つのテクスチャにまとめてくれるFlattenを使用する必要があります。
image eileen composite = Flatten(Fixed(
"body.png", #体パーツ
"clothes.png", #服パーツ
"expression.png", #表情パーツ
fit_first=True))
ちなみに差分画像を自動定義するスクリプトも作成しました。合成画像自動定義