見出し画像

ティラノスクリプトでゲームを作ろう!特定テーマ⑧作ったキャラの表示方法

おはこんにちばんは! ここではお久しぶりの富井サカナです!
今日も元気にゲームを作りましょう!

はじめに

今回は前回の記事でやり方を説明したキャラメイクで作ったキャラをどうやって表示するかのご紹介です。今回のやり方はとんでもなく原始的な物量作戦でスクリプトの行数がいくつあっても足りないやり方ですので、中上級者の方からの「こうすれば簡単だぜ?」のアドバイスもお待ちしております!

修学旅行のモブおやモブこのほか、自作キャラのおまかせやタイマン学園のザコ敵などで頻繁に使っているランダムキャラ生成についても説明します!

繰り返しますがキャラメイクで大変なのはスクリプトではなく素材の準備でして、どんな組み合わせになってもパーツ毎に整合性の取れる形で素材を準備するのが大変なのです。こちらについては担当外なので私から言えることはズバリありません!

はい!今回もまずは引用する2つのゲーム。
以下に並べますので未プレイの方はまず遊んでやってください!



生成キャラ表示の考え方の整理

メチャクチャ簡単です。

①パーツ毎に対応する変数を設定しておく(前段階)
②変数に応じた画像を表示させる
③パーツの数だけこれを並べる
※パーツごとのzindex(表示の重なりの前後)を正しく設定することに留意

これだけです!
ちょっとパーツとパターンをそれぞれ少な目で以下に記載します。


「顔」の表示のスクリプトを打ってみる

それでは修学旅行を例にスクリプトを打ってみます。
実際のパーツは大量ですが、ここでは各種3パターンで並べます。
※表示位置は別途変数で設定しています。

ちなみに、超力技ですので他にやりようがあるような気がしてなりません。
というか絶対ありますがロード時間が長くなきゃいいやの精神です。
容量の少ないドット絵だからできる特殊技の可能性もあります。

■りんかく
[image storage="../fgimage/chara/parts/rinkaku/rinkaku_01_A.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.rinkaku == 1 && tf.color == 1" name=me zindex=%zindex|92]
[image storage="../fgimage/chara/parts/rinkaku/rinkaku_01_B.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.rinkaku == 1 && tf.color == 2" name=me zindex=%zindex|92]
[image storage="../fgimage/chara/parts/rinkaku/rinkaku_01_C.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.rinkaku == 1 && tf.color == 3" name=me zindex=%zindex|92]

[image storage="../fgimage/chara/parts/rinkaku/rinkaku_02_A.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.rinkaku == 2 && tf.color == 1" name=me zindex=%zindex|92]
[image storage="../fgimage/chara/parts/rinkaku/rinkaku_02_B.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.rinkaku == 2 && tf.color == 2" name=me zindex=%zindex|92]
[image storage="../fgimage/chara/parts/rinkaku/rinkaku_02_C.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.rinkaku == 2 && tf.color == 3" name=me zindex=%zindex|92]

[image storage="../fgimage/chara/parts/rinkaku/rinkaku_03_A.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.rinkaku == 3 && tf.color == 1" name=me zindex=%zindex|92]
[image storage="../fgimage/chara/parts/rinkaku/rinkaku_03_B.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.rinkaku == 3 && tf.color == 2" name=me zindex=%zindex|92]
[image storage="../fgimage/chara/parts/rinkaku/rinkaku_03_C.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.rinkaku == 3 && tf.color == 3" name=me zindex=%zindex|92]

■まえがみ
[image storage="../fgimage/chara/parts/maegami/maegami_01_A.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.maegami == 1 && tf.haircolor == 1" name=me zindex=%zindex|96]
[image storage="../fgimage/chara/parts/maegami/maegami_01_B.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.maegami == 1 && tf.haircolor == 2" name=me zindex=%zindex|96]
[image storage="../fgimage/chara/parts/maegami/maegami_01_C.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.maegami == 1 && tf.haircolor == 3" name=me zindex=%zindex|96]

[image storage="../fgimage/chara/parts/maegami/maegami_02_A.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.maegami == 2 && tf.haircolor == 1" name=me zindex=%zindex|96]
[image storage="../fgimage/chara/parts/maegami/maegami_02_B.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.maegami == 2 && tf.haircolor == 2" name=me zindex=%zindex|96]
[image storage="../fgimage/chara/parts/maegami/maegami_02_C.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.maegami == 2 && tf.haircolor == 3" name=me zindex=%zindex|96]

[image storage="../fgimage/chara/parts/maegami/maegami_03_A.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.maegami == 3 && tf.haircolor == 1" name=me zindex=%zindex|96]
[image storage="../fgimage/chara/parts/maegami/maegami_03_B.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.maegami == 3 && tf.haircolor == 2" name=me zindex=%zindex|96]
[image storage="../fgimage/chara/parts/maegami/maegami_03_C.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.maegami == 3 && tf.haircolor == 3" name=me zindex=%zindex|96]

■うしろがみ
[image storage="../fgimage/chara/parts/ushirogami/ushirogami_00.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 0" name=me zindex=%zindex|90]

[image storage="../fgimage/chara/parts/ushirogami/ushirogami_01_A.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 1 && tf.haircolor == 1" name=me zindex=%zindex|90]
[image storage="../fgimage/chara/parts/ushirogami/ushirogami_01_B.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 1 && tf.haircolor == 2" name=me zindex=%zindex|90]
[image storage="../fgimage/chara/parts/ushirogami/ushirogami_01_C.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 1 && tf.haircolor == 3" name=me zindex=%zindex|90]

[image storage="../fgimage/chara/parts/ushirogami/ushirogami_02_A.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 2 && tf.haircolor == 1" name=me zindex=%zindex|90]
[image storage="../fgimage/chara/parts/ushirogami/ushirogami_02_B.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 2 && tf.haircolor == 2" name=me zindex=%zindex|90]
[image storage="../fgimage/chara/parts/ushirogami/ushirogami_02_C.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 2 && tf.haircolor == 3" name=me zindex=%zindex|90]

[image storage="../fgimage/chara/parts/ushirogami/ushirogami_03_A.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 3 && tf.haircolor == 1" name=me zindex=%zindex|90]
[image storage="../fgimage/chara/parts/ushirogami/ushirogami_03_B.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 3 && tf.haircolor == 2" name=me zindex=%zindex|90]
[image storage="../fgimage/chara/parts/ushirogami/ushirogami_03_C.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.ushirogami == 3 && tf.haircolor == 3" name=me zindex=%zindex|90]

■め
[image storage="../fgimage/chara/parts/eye/eye_01.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.eye == 1" name=me zindex=%zindex|94]
[image storage="../fgimage/chara/parts/eye/eye_02.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.eye == 2" name=me zindex=%zindex|94]
[image storage="../fgimage/chara/parts/eye/eye_03.png" layer=2 time=10 left=&tf.me_left top=&tf.me_top cond="tf.eye == 3" name=me zindex=%zindex|94]

注:りんかくと髪は色パターンがあるので色×形でパーツを用意し、
  それぞれ変数を設定して組み合わせに応じて表示しています。
注:表示時間を10ミリ秒にしているのは
  0にすると挙動が怪しいことがあるという噂を聞いたためです。
注:もちろん上記のようなスクリプトはマクロを組んでおくべきです。

こんな感じで一気に各パーツの表示コマンドを並べていきます。
まゆより後ろは内容がほぼ同じなので省略します。


ランダムキャラの表示のやりかた

キャラメイクの場合は各パーツの変数をプレイヤーに決めてもらいますが
ランダムの場合は変数をランダムの自動設定にするだけです。簡単です。

①まずはランダム変数を生成する
[getrand_rinkaku min="1" max="5"]
[getrand_color min="1" max="9"]
[getrand_maegami min="1" max="100"]
[getrand_ushirogami min="1" max="30"]
[getrand_haircolor min="1" max="130"]
[getrand_eye min="1" max="40"]
[getrand_mayu min="1" max="20"]
[getrand_nose min="1" max="20"]
[getrand_mouth min="1" max="40"]
[getrand_glasses min="1" max="60"]
[getrand_clothes min="1" max="100"]
[getrand_other1 min="1" max="40"]
[getrand_other2 min="1" max="100"]

②ランダム変数に応じてパーツの変数を決める
■各パーツの確率が等分で良い場合
[eval exp="tf.rinkaku = tf.rand_rinkaku"]

■各パーツの確率に重みづけをしたい場合
例:髪の毛は奇抜な色の確率を低くしたい
[eval exp="tf.haircolor = 1" cond="tf.rand_haircolor >= 1 && tf.rand_haircolor <= 30"]
[eval exp="tf.haircolor = 2" cond="tf.rand_haircolor >= 31 && tf.rand_haircolor <= 50"]
・・以降、徐々に確率を下げていく

注:ランダム変数に対応するパーツ変数がない場合は何も表示されません

注:[getrand~]はマクロです。内容は以下のようになります。

注:ランダム変数については以前の記事で説明したことがあります。
  例として以下のようなマクロを組むとランダム変数が生成できます。
  この段階で各数字の確率の重みづけをすることも可能ですが、
  1~100の数字を同確率で吐き出させて、
  その数字をベースに他の変数を割り振るほうが使い勝手は良いはず。

[macro name="getrand_rinkaku"]
[iscript]
var max = mp.max || '100'
var min = mp.min || '1'
max = Number(max)
min = Number(min)
tf.rand_rinkaku = min + Math.floor(Math.random() * (max - min + 1))
if (mp['var']) eval(mp['var'] + ' = ' + tf.rand_rinkaku)
[endscript]
[endmacro]


細かく調整を行うことで見た目のランダムの振れ幅や確率を決められます。
例えば『修学旅行』に登場するモブおとモブこの見た目は
当初完全ランダム表示にしていたところモンスター生成機となりました。
変なパーツを排除したり確率の重みづけをした結果として、
ある程度見た目が安定するようになりました。
なお、服装は主人公が選んだ服装によって選択肢が変わるようにしてます。


応用の可能性について

今回は設定したorランダム選択のパーツ変数に応じて、
キャラクターの見た目を表示させる方法を公開してみました。
同じようなやり方をグラフィックだけでなく、
音楽やテキストでも表現することは可能だったりします。
設定した複数のキーワードに応じてストーリーが変わるとか、
ランダムでストーリーが分岐するとかも余裕でできちゃいます。
SLGなんかだと季節や前日の天気に応じて気温や天気が変わるとか!


おわりに

と言うわけでいかがでしたでしょうか。
今回もややこなれている方からすればしょうもない話ですが、触りたてで予備知識がない初心者の方には参考になるかもしれないと思われます。

以前もご紹介したランダムで変数生成はマジで使い勝手抜群です。
オーソドックスなADVやノベルでも、
・アイキャッチを複数用意してランダムで表示させる
・汎用イベントの会話にランダム性を持たせたい
なんて時には重宝するかと思います。

以上、富井サカナでした。
みなさまもよき制作ライフを。


↓↓ティラノスクリプトでゲームを作ろう!記事一覧はこちら↓↓


👇改めまして本記事で参照したゲームはこちらから遊べます👇


この記事が気に入ったらサポートをしてみませんか?