Calleigh’s blog

幸せは毎日の食卓から

前回指定した差分パーツを、再登場時にはリセットしたい

[chara_show]で反映できる差分は[chara_face]タグで定義した差分だけという話をこちらの記事でしました。 calleigh.hatenablog.com [chara_face]タグで定義したパーツは#name:face_idで表情の変更を反映できますので、表情差分については[chara_face]タグを積極的に使用した方が楽なのかなと思います。
ただ、私自身は、何が何でも名前欄の苗字と名前の間に半角スペースを入れたい病患者であるため、今のところ[chara_face]タグを使用していません。 calleigh.hatenablog.com

[chara_show]タグでキャラを表示して、[chara_part]タグで服装や表情を指定するようになります。

[chara_new]タグ、[chara_layer]タグでのキャラと差分パーツの定義

// 新しいキャラの定義
[chara_new name="taro" jname="山田太郎" storage="" width="" zindex="5"]
// キャラパーツbaseを定義
[chara_layer name="taro" part="base" id="default" storage="none" zindex="6"]
[chara_layer name="taro" part="base" id="uniform" storage=""]
[chara_layer name="taro" part="base" id="private" storage=""]
[chara_layer name="taro" part="base" id="club" storage=""]
[chara_layer name="taro" part="base" id="swim" storage=""]
// キャラパーツhairを定義
[chara_layer name="taro" part="hair" id="default" storage="" zindex="9"]
[chara_layer name="taro" part="hair" id="cap" storage=""]
[chara_layer name="taro" part="hair" id="swim" storage=""]
// キャラパーツfaceを定義
[chara_layer name="taro" part="face" id="default" storage="" zindex="7"]
[chara_layer name="taro" part="face" id="smile" storage=""]
[chara_layer name="taro" part="face" id="sad" storage=""]
[chara_layer name="taro" part="face" id="angry" storage=""]
// キャラパーツacceを定義
[chara_layer name="taro" part="acce" id="default" storage="none" zindex="8"]
[chara_layer name="taro" part="acce" id="blush" storage=""]

この例では、パーツを以下の4種類に分けてあります:

  • base = 胴体(服装)とのっぺらぼうの顔と後ろ髪
  • face = 表情
  • hair = 髪型(とあれば帽子等の頭にくっつくパーツ)
  • acce = 頬の紅潮を表すパーツや涙・汗といった普段は表示しないパーツ

分け方は自由です。一番シンプルなのはおそらく

  • 全身+デフォルトの表情の一枚絵
  • 表情差分を幾つか作る

が最少でバリエーションを付けやすい方法かと思います。デフォルトの表情を、差分パーツで覆い隠すことで別の表情にできますね。
キャラクター差分は好きなだけ登録できます。差分画像が増えるとその分、容量が増え、ロード時間も長くなります。その対策としては、パーツによっては画像サイズそのものを小さくする(透明な部分を切り取ってしまう)ことなんですが、同じ大きさの画像を重ねていく方が、表示位置の調整も必要なく、キャラを移動させたりした際に表示がズレたということが起きにくいのでそういう設定で書いています。

一行目の[chara_new]タグでは、切り替えない画像を指定します。ここでは、全てのパーツの画像を切り替える設定で作ってあるのでキャラ画像と同じサイズの透明な画像を指定します。width属性またはheight属性を指定することで、実際の画像サイズに関わらず、width属性で指定したサイズに引き伸ばしまたは圧縮して表示してくれます。width属性とheight属性のどちらか一方しか指定しないことにより、画像の縦横比率は維持したまま引き伸ばしまたは圧縮が行われます。[chara_new]タグで一回指定するだけでいいです。[zoom]タグなどでキャラを拡大表示させるときのことを考えて、作成するキャラ画像サイズを決めてもいいと思います。

二行目以下に続く[chara_layer]タグでのpart="base" id="default"の" "の中は自由に決められます。ここでは、partはどのパーツか、idはそのパーツを呼び出すときに使用する名前になります。同一パーツ内で、同一idを使用することはできません。同一パーツ内で、同一idを割り振ってしまうとどれを呼び出せばいいか特定ができなくなりエラーになります。別のパーツであれば、同一idを使用することができます。
上の例だと、part="base" id="swim"で水着を着た胴体の画像を表示し、part="hair" id="swim"で水泳キャップを被った頭の画像を表示するように設定しています。idを同じにすることで上下セットなんだとわかりやすく感じるか、idを同じすることで混乱して間違いやすくなるかは人によると思うので、自分の性格と相談してください。混乱しそうな場合は、part="hair" id="swimcap"id="swim_hair"などのように少しidを変えてみてもいいかもしれません。

part="acce"は普段は表示しない(デフォルトでは非表示にしたい)画像なので、id="default" storage="none"としてデフォルトでは表示する画像を指定していません。
part="base"は胴体なので山田太郎登場時は常に表示したい画像ですが、服装が数種類あるため、服装の指定漏れを見つけやすくする目的で、デフォルトは非表示にしてあります。同じ服装での登場が多い場合は、デフォルトにその服装を指定した方がいいと思います。

各パーツid="default"の行に入っているzindex=""は、各パーツが表示される階層を示しています。数が小さいと奥の階層、数が大きいと手前の階層に表示されます。パーツhairは前髪も含みますが、前髪がパーツbaseののっぺらぼうより奥の階層に表示されたり、パーツfaceがパーツbaseののっぺらぼうより奥に表示されりするとおかしいので指定していた方がいいです。各パーツの最初に一回書くだけでいいです。

[chara_show]タグの実行

[chara_show name="taro"]

で表示されるのは次の三枚の画像です:

  • [chara_new]タグで指定した透明な画像
  • パーツfaceのデフォルト画像
  • パーツhairのデフォルト画像

パーツbaseとパーツacceは、デフォルトでは何の画像も表示されません。

[chara_show name="taro"]
[chara_part name="taro" base="uniform"]

[chara_show]タグと[chara_part]タグを続けて実行することで、キャラ差分パーツbaseのid="uniform"を表示させることができます。
ただ、このまま実行してしまうと、[chara_show]タグで表示される三枚の画像が表示された後、[chara_part]タグで表示される画像が表示されるようになり、表示にタイムラグが生じます。こちらの記事では、[chara_show]タグでtime="0"を指定することで解消できると書きました。単純に私はキャラを一瞬で表示したいからです。 calleigh.hatenablog.com

他の方法として、[chara_show]タグでwait="false"を指定すると最初の三枚の画像が表示されるのを待たずに、パーツbaseの画像も表示されます。フェードイン効果などを使用したい場合は、こちらの方法を利用します。

[chara_show name="taro" time="2000" wait="false"]
[chara_part name="taro" base="uniform"]

マクロを作る

上記記事のキャラ退場後も差分パーツの指定が反映されたまま問題をもっと楽に解決できるはずと思い、その解決も盛り込んだマクロを作りました。

[macro name="cshow"]  // cshow という名前のマクロを定義
    [chara_show name="&mp.name" wait="false" time="&mp.time || '2000'"]
    [chara_part name="&mp.name" base="&mp.base" hair="&mp.hair || 'default'" face="&mp.face || 'default'" acce="&mp.acce || 'default'"]
[endmacro]

// マクロ cshow の実行
[cshow name="taro" base="uniform"]

// 水着姿、笑顔の太郎を、瞬時に表示させる場合
[cshow name="taro" base="swim" hair="swim" face="smile" time="0"]

&mp.はマクロ内変数の型(マクロ内でしか使用できない変数)です。
nameで表示するキャラクターの名前を指定します。
timeでキャラクターの表示にかける時間を指定できる。指定しなかった場合はデフォルト値として2000を代入します。
baseにはデフォルト値を設定していないので、マクロ実行時に指定していなかった場合、エラーが発生します。これも上記と同じ、服装の指定漏れを発見しやすくするための記述です。必要に応じてデフォルト画像を指定してください。
acceでは、指定しなかった場合、デフォルトの「画像を表示しない」が適用されます。
デフォルト値は' 'で囲まないとエラーになるので注意が必要です。

このマクロの利点

以前の記事だと、キャラ退場後の差分パーツのリセット方法について、

  • キャラ登場時にデフォルトパーツを指定する
  • キャラ退場後に[chara_part_reset]タグを実行する

の二点を挙げました。このマクロは、前者の方法を採ったものになりますが、「指定しないことが、デフォルトパーツを指定することになる」記述になっています。そのため、マクロ実行時に書かなければならない量が減ります。書かなければならない量が減るということは、記述ミスをする機会自体が減ります。

このマクロの問題点

次回登場時に、time="0"を指定したり、クリック(タップ)を連打して早送りしようとすると、一瞬だけ前回指定したパーツが表示されることがあります。これはもうどうしようもないと思います。
しかしながら、普通にプレイしている際には、発生しないことになるので大した問題でもないかと今のところは思っています。できたら改善したいです。

[wrap]タグの情報がなさすぎる

ティラノスクリプト公式サイトに存在をメンションされているだけの[wrap]タグを使用したくてネット検索したんですが、情報を見つけられませんでした。自分で試そうとしてみても、タグ:[wrap]は存在しません。とエラーが出るので試すことすらできませんでした。
他力本願が過ぎますが、誰か書いてくれないかな……。