Studio ついんくる ||Lesson-Lesson8 選択肢とセーブ編||

Lesson8 選択肢とセーブ編

ラベル

ラベルとは、ソースの中での目印のようなもので、先頭に*をつけて記述します。 後から詳しく触れますが、これはセーブポイントにも出来るものなので、物語の展開にあわせて作るといいかもしれません。 ラベルは下のように記述します。
*hogehoge|セーブされるときの題名

*のすぐ後ろに書かれている"hogehoge"がラベルの名前です。 どのような名前でも自由ですが、ここは半角英数のみで名前をつけることをオススメします。 ラベルの役割は大まかにわけると二つあり、シナリオファイル内で動作を移動させる際の目印、 そして先程触れたセーブとロードを行う位置の役割があります。 しかし、セーブポイントではないラベルもあったほうが便利ですよね? それについてはラベル名を書いた後の、|(半角パイプ)でラベルの効果が変わってきます。 これについてはこのページの後半で説明します。 では、|を使用した場合と使用しない場合の違いを見て見ましょう。

*ravel01
;"ravel01"に属するのはこの位置。

*ravel02|ラベルの名前
;"ravel02"に属するのはこの位置。

上のソースにはラベルが2つ存在しています。 これらのラベルは別々の働きをします。 "*ravel01"には|が書かれていませんよね? 書かれていないラベルはセーブポイントになれません。 反対に"*ravel02"はセーブに使用できます。 |以降の文字はセーブファイルの題名に使用されます。 では、|を書いてしまったら、ソースの中の目印にはなれないのでしょうか? ラベルはパイプを書いても書かなくても目印になれるのです。 セーブポイントをさせたい場所に、追加機能として、|を書くといいでしょう。

ラベルの移動

ラベルについて、冒頭でソースの目印になると言いましたね? その目印とjumpタグを使えば、動作の途中で他のラベルへ移動することができるようになります。

*Ravel1|ラベル1
[er]
ラベル1[l][r]
[jump target="*Ravel3"]

*Ravel2|ラベル2
[er]
ラベル2[l][r]

*Ravel3|ラベル3
[er]
ラベル3[l][r]

今までの経験上ソースは上から順に"*Ravel1"→"*Ravel2"→ "*Ravel3"と実行されるはずですがこのソースではこれが通用しません。 今回のソースは"*Ravel1"終了部分からいきなり"*Ravel3"へと実行が移ってしまいます。もうお気づきですね? jumpタグは追加記述targetで指定されたラベルに即座に移動するタグなのです。 ひとまず、エンディング後にメニューに戻らせるために物語の一番最後に書いておくといいかもしれませんね。

Tip

このソースにあるように、ラベルを作った次の行には[er]タグをかくことが原則です。 それはセーブをロードしたときは、ラベルから再開されるためラベルから途中実行しても 不具合を起こさない必要があるためです。

選択肢

画面上に選択肢が現われ、自分が選んだ選択によってその後の結果が変化する という方式は既におなじみかと思います。 ここではlinkタグendlinkタグを使用して 選択肢を表示し、それに対応したラベルに飛ばすことをやってみようかと思います。 下のソースを見てください。

*choice|決断
[er]
人の流れを読むんだ…。[l][r]
俺がはじめに訪れるべき方向はどっちなのか…。[l][r]
[link target="*east"]東だ![endlink][r]
[link target="*west"]いや、西へ行こう。[endlink]
[s]

*east|東
東に来た。やはり混んでいる。[l][r]

*weat|西
西に来た。やはり混雑は無い。[l][r]

このソースでは、"どっちなのか…。"まで文字が表示されたあと2つの選択肢が表示され、 プログラムの流れが停止します。 選択肢として現われるのはlinkタグとendlinkタグに囲まれた文字で、 クリックするとtragetで指定したラベルまで移動することになります。 ここでは"東だ!"と"いや、西へ行こう。"の二つが選択肢として表示されるわけですが、 プログラムの流れが止まるとは何のことなのでしょうか? その役割を持っているのがsタグです。 このタグはソースの流れを停止してしまうのです。 停止させるというとなんだか、悪いタグのように思われがちですが、 このタグを記述しないと、選択肢が表示されて間もなくラベル*eastへ進んでしまうのです。 なので、選択肢を表示するときは必ずこのタグを使用して、ユーザーのクリックをまつ必要があるのです。

Tip

行き先ごとに脇へ道(link)を作ったんです。 だけどみんな無視して直進してしまうのです。 あまりにもを道を辿る人が少ないので私は直進方向に警備員(s)を雇ったんです。 それからは皆、それぞれの道を辿るようにしてくれました。

条件による式の実行

ゲームでは、選んだ行動がすぐに反映されず、後に展開へ影響を及ぼすことがあります。 これを行う場合、前回学習した変数とlinkタグendlinkタグを使用します。
*choice|決断
[er]
人の流れを読むんだ…。[l][r]
俺がはじめに訪れるべき方向はどっちなのか…。[l][r]
[link target="*east"]東だ![endlink][r]
[link target="*west"]いや、西へ行こう。[endlink][r]
[s]

*east|東
[er]
東に来た。やはり混んでいる。[l][r]
[eval exp="f.flag = 1"]
[jump target=*which]
*west|西
[er]
西に来た。やはり混雑は無い。[l][r]
[eval exp="f.flag = 0"]
[jump target=*which]
*which
俺は…
[if exp="f.flag == 1"]
お世辞にも勝ち組とはいえないようだ。
[endif]
[if exp="f.flag == 0"]
いい判断をしたようだ。
[endif]

このソースでは東を選んだ場合、変数f.flagが1になり西を選ぶと変数f.flagは0になります。 さて、両者ともその後jumpタグでラベル*whichへ移動するわけですが、ここでifタグが出現します。 ifタグは「変数***が***だった場合、ifタグendifタグで囲まれたソースを実行しなさい」 という意味を持ちます。上のソースでは 「f.flagが1だったら」「f.flagが0だったら」ということになります。 ifタグでは、〜だったらの部分(条件)に合わなかった場合はそこからendifタグまでのソースは無視されます。 実際にこのソースを実行した場合、
選択肢:東
人の流れを読むんだ…。
俺がはじめに訪れるべき方向はどっちなのか…。
東に来た。やはり混んでいる。
俺は…お世辞にも勝ち組とはいえないようだ。

選択肢:西
人の流れを読むんだ…。
俺がはじめに訪れるべき方向はどっちなのか…。
西に来た。やはり混雑は無い。
俺は…いい判断をしたようだ。
と出力されます。

Tip

ifタグとendifタグの間にはラベルを作ることができません。

セーブ・ロード

さて、ゲームを行ううえで内容のセーブ、ロードは必ず必要になってきます。 吉里吉里では、初期状態でメニューバーに表示されている 「栞をはさむ」、「栞をたどる」というセーブ、ロード機能を使用することができます。 しかし、私達がセーブポイントを作らなければこれらの機能は 活用することができません。
;これはセーブができません。
*ravel01

;これはセーブができます。
*ravel02|セーブポイント

前述したとおり、|以降を書くか書かないかでそのラベルがセーブ、ロードに対応するかが決まります。 単純に言えば、|が書かれているラベルはセーブ、ロードができる、ということでした。 そしてこのとき、|の後ろに書かれた文字が、「栞をはさむ」、「栞をたどる」 を行ったときに表示される見出しとなって表示されます。 よって、できる限り物語の内容がわかり易いものがいいでしょう。 また、「栞をたどる」を行うことでできるロードですが、 これはセーブした場所から完全に再開されるものではなく、 「栞をはさむ」が行われた時点で最後に通過したセーブ可能な(|が書かれた)ラベルから再開されることになります。

Tip

ここまでセーブとロードができる場合の解説をしてきましたが、 セーブをさせたくないという状況も出て来ることかと思います。 普通ゲームを起動してまずでてくるメニュー画面なんかがそうです。 メニュー画面でセーブされてもしょうがないですよね? このような場合はラベル名に|を書かず、セーブ機能を使えなくするとよいでしょう。

[次へ進む]

Back to the Lesson([top]>[Lesson]>[Lesson8 選択肢とセーブ編])