見出し画像

ティラノスクリプトでゲームを作ろう!特定テーマ⑨入手順のアイテム表示方法

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

はじめに

ティラノ製の脱出ゲーム等を遊んでいて『多分敢えてやっているのではなくアイテムが入手順じゃない順番で表示されているな』と感じたことが何度かあります。自作『修学旅行』ではアイテム要素があるのですが、その際のやり方をご紹介します。なお、内容としてはかなり初心者向けっぽいですが、他の方のゲームを遊んでいる限りそれなりにニーズがある気もします。


入手順にならない所持アイテムの表示方法

一番簡単な変数の管理方法としては、
"f.item_1"というフラグをアイテム①の所持判定変数、
"f.item_2"というフラグをアイテム②の所持判定変数という風にセットし、
"true"なら所持、"false"なら非所持とするやり方です。

そして画面上の特定の場所(メイン画面やオプション画面)に、
アイテム①から順に表示スペースを用意しておき、
[image storage="item_1.png" cond="f.item_1 == true"]等とすれば完了です。

これで無事に入手したアイテムの画像が表示されますが、
ここまでの説明の通りこれだと表示位置が固定になります。
例えばアイテム③を先に入手したらアイテム①と②の欄が空欄になります。
(その方がむしろ良さそうなパターンもありますが)


入手順の表示にするには

で、アイテムを入手した順の表示にしたい場合ですが、
メチャクチャ簡単です。以下のようにするだけです。

"f.item_1"というフラグを1つめに入手したアイテムの判定変数、
"f.item_2"というフラグを2つめに入手したアイテムの判定変数とするだけ。
1つめにアイテム①を入手したら"f.item_1 = 1"とし、
アイテム②を入手したなら"f.item_1 = 2"とすれば良いだけです。

そして画面上の特定の場所(メイン画面やオプション画面)に、
入手したアイテムを表示するスペースを用意しておき、
例えば1つめに入手したアイテムの欄には以下を並べるだけです。

[image storage="item_1.png" cond="f.item_1 == 1"]
[image storage="item_2.png" cond="f.item_1 == 2"]
[image storage="item_3.png" cond="f.item_1 == 3"]
[image storage="item_4.png" cond="f.item_1 == 4"]
[image storage="item_5.png" cond="f.item_1 == 5"]
[image storage="item_6.png" cond="f.item_1 == 6"]

アイテムが全部で6種類ある場合はこれで良し

2つめ、3つめに入手したアイテムの欄も似たような形で並べるだけです。
※もちろん表示場所は適切に変えないと表示が重複します

なお、入手したアイテムが2つめなのか3つめなのかの判定の仕方はいくつかありますが、一番考え方として簡単なのはアイテム所持数の変数を用意することかと思います。
ゲーム冒頭で"f.item_number = 0"としておき、
アイテムを入手する度に"f.item_number = f.item_number + 1"とするだけ。
例えばアイテム③を入手した際の変数の処理は以下となります。

[eval exp="f.item_1 = 3" cond="f.item_number == 0"]
[eval exp="f.item_2 = 3" cond="f.item_number == 1"]
[eval exp="f.item_3 = 3" cond="f.item_number == 2"]
[eval exp="f.item_4 = 3" cond="f.item_number == 3"]
[eval exp="f.item_5 = 3" cond="f.item_number == 4"]
[eval exp="f.item_6 = 3" cond="f.item_number == 5"]

[eval exp="f.item_number = f.item_number + 1"]

アイテム所持数の変更はアイテム変数の変更の後で


アイテムを使った時の処理

さて、アイテムを入手した時はここまでの処理で問題ないのですが、アイテムを使った場合についても変数での対応が必要です。

例えばアイテムを4つ持っていて1つめのアイテムを使った場合、
[f.item_1 = 0"]に変数処理をするだけだと、結局1つめのアイテム入手欄が空欄となってしまいます。従い、アイテムを詰める処理が必要となります。
その処理については以下のような形となります。

;以下、1つめのアイテムを使用する際のマクロ
[macro name="use_item_1"]

;アイテム所持数を1つ減らす
[eval exp="tf.item = tf.item - 1"]

;アイテムを詰める
[eval exp="tf.item1 = tf.item2"]
[eval exp="tf.item2 = tf.item3"]
[eval exp="tf.item3 = tf.item4"]
[eval exp="tf.item4 = tf.item5"]
[eval exp="tf.item5 = tf.item6"]
[eval exp="tf.item6 = tf.item7"]
[eval exp="tf.item7 = tf.item8"]
[eval exp="tf.item8 = 0"]
[endmacro]

アイテム所持数最大8つのケース

こちら、見てお分かりの通り単純に詰めるだけです。
なお、アイテム未入手は0とどこかで事前に規定しているため、
持ってない箇所は単純に0が繰り上がっていくだけです。
(規定していなくてもundefined(未規定)が繰り上がるだけなので良いはず)

2つめ以降のアイテムを使う場合も同じようにそのアイテム以降の変数を残さず詰めていくだけなので非常に簡単です。


【ちょい応用】マクロ化について

修学旅行のアイテムは『つかう』だけでなく、『わたす』、『すてる』ことも可能でしたし、それがコマンド選択の任意のいつでもできるという形でした。従って、各ステージでスクリプトを用意しまくるのは現実的ではなく、全てマクロで用意することになりました。大体どんな構成だったかを以下に記載します。

★どうぐコマンドを選んだ時のマクロ
[macro name="choice_item"]

[boutou]←シーンに応じてまみちゃんのセリフを表示させるマクロ
[cm]
[freeimage layer=4]
[freeimage layer=5]
[layopt layer=4 visible=true]

;1つめのアイテムの表示
[ptext size=30 layer=5 x="650" y="80" text="りょこうのしおり" cond="tf.item1 == 11"]
[ptext size=30 layer=5 x="650" y="80" text="とまらないおかき" cond="tf.item1 == 12"]
[ptext size=30 layer=5 x="650" y="80" text="のりべんとう" cond="tf.item1 == 21"]
[ptext size=30 layer=5 x="650" y="80" text="まくのうちごぜん" cond="tf.item1 == 22"]
[ptext size=30 layer=5 x="650" y="80" text="カニまるごとどん" cond="tf.item1 == 23"]
[ptext size=30 layer=5 x="650" y="80" text="しかせんべい" cond="tf.item1 == 31"]
[ptext size=30 layer=5 x="650" y="80" text="ペナント" cond="tf.item1 == 51"]
[ptext size=30 layer=5 x="650" y="80" text="ペナント100こ" cond="tf.item1 == 52"]
[ptext size=30 layer=5 x="650" y="80" text="ぼくとう" cond="tf.item1 == 53"]
[ptext size=30 layer=5 x="650" y="80" text="きょうとのじざけ" cond="tf.item1 == 54"]

;1つめのアイテムを選ぶボタン
[button graphic="transparent.png" enterimg="arrow.png" target=*item1 name="select,item1" x=620 y="80" width=20 height=30 clickse="pi.ogg"]

;2つめのアイテムの表示
[ptext size=30 layer=5 x="650" y="120" text="りょこうのしおり" cond="tf.item2 == 11"]
[ptext size=30 layer=5 x="650" y="120" text="とまらないおかき" cond="tf.item2 == 12"]
[ptext size=30 layer=5 x="650" y="120" text="のりべんとう" cond="tf.item2 == 21"]
[ptext size=30 layer=5 x="650" y="120" text="まくのうちごぜん" cond="tf.item2 == 22"]
[ptext size=30 layer=5 x="650" y="120" text="カニまるごとどん" cond="tf.item2 == 23"]
[ptext size=30 layer=5 x="650" y="120" text="しかせんべい" cond="tf.item2 == 31"]
[ptext size=30 layer=5 x="650" y="120" text="ペナント" cond="tf.item2 == 51"]
[ptext size=30 layer=5 x="650" y="120" text="ペナント100こ" cond="tf.item2 == 52"]
[ptext size=30 layer=5 x="650" y="120" text="ぼくとう" cond="tf.item2 == 53"]
[ptext size=30 layer=5 x="650" y="120" text="きょうとのじざけ" cond="tf.item2 == 54"]

;2つめのアイテムを選ぶボタン
[button graphic="transparent.png" enterimg="arrow.png" target=*item2 name="select,item2" x=620 y="120" width=20 height=30 clickse="pi.ogg"]

※3~7つめのアイテムは省略※

;どうぐの選択をやめて戻る
[ptext size=30 layer=5 x="650" y="360" text="もどる"]
[button graphic="transparent.png" enterimg="arrow.png" target=*itemback name="select,itemback" x=620 y="360" width=20 height=30 clickse="pi.ogg"]

[endmacro]

★1つめのアイテムを使った場合の処理(各シーンに配置)
*item1
[eval exp="tf.choice_item = 1"]←1つめのどうぐ選択中変数(カーソル用)
;以下、1つめのアイテムがなんだったかによってjump
[jump target=*item_shiori cond="tf.item1 == 11"]
[jump target=*item_okaki cond="tf.item1 == 12"]
[jump target=*item_noriben cond="tf.item1 == 21"]
[jump target=*item_makunouchi cond="tf.item1 == 22"]
[jump target=*item_kani cond="tf.item1 == 23"]

★1つめのアイテム「のりべんとう」を使った場合の処理
*item_noriben
[choice_noriben]←マクロを設定

★[choice_noriben]の中身
[macro name="choice_noriben"]

[ptext size=30 layer=5 x="650" y="80" text="たべる"]
[ptext size=30 layer=5 x="650" y="120" text="わたす"]
[ptext size=30 layer=5 x="650" y="160" text="すてる"]
[ptext size=30 layer=5 x="650" y="360" text="もどる"]

[layopt layer=4 visible=true]

[button graphic="transparent.png" enterimg="arrow.png" target=*noriben_use name="select,noriben_use" x=620 y="80" width=20 height=30 clickse="pi.ogg"]
[button graphic="transparent.png" enterimg="arrow.png" target=*noriben_pass name="select,noriben_pass" x=620 y="120" width=20 height=30 clickse="pi.ogg"]
[button graphic="transparent.png" enterimg="arrow.png" target=*noriben_poi name="select,noriben_poi" x=620 y="160" width=20 height=30 clickse="pi.ogg"]
[button graphic="transparent.png" enterimg="arrow.png" target=*itemback name="select,itemback" x=620 y="360" width=20 height=30 clickse="pi.ogg"]

[endmacro]

ちなみに「のりべん」は使えるシーンが限定されているので、各シーンに対応するスクリプトを用意しておりますが、冒頭から最後まで所持できる「りょこうのしおり」なんかはマクロ内でjumpさせてシーンに応じて反応を返すような内容になっています。各シーンのksファイルとマクロksを行ったり来たりするような構成です。


おわりに

と言うわけでいかがでしたでしょうか。
今回も相変わらずややこなれている方からすればしょうもない話ですが、触りたてで予備知識がない初心者の方には参考になるかもしれないと思われます。網羅性は一切ないので、非公式wikiや公式掲示板の検索なんかと合わせてご参照ください。

マクロが苦手な方の話をよく聞きますが、まずは一般的なゲームでは何度も必要となってくる場面転換などからマクロ化に慣れていけば良いと思います。マクロ化はしすぎると逆にマクロ内分岐が多くなったりするので変数+マクロを各ksに配置するなど工夫が必要ではありますが、自分のやり方が合っているとは到底思えないので自己流は良くないの典型な気もしています。

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


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


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


👇他にもゲームいくつか公開してます👇


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