投稿記事

ウディタ技術の記事 (2)

ミリノルト 2023/05/13 23:55

【ウディタ】会話イベント中にセーブする

ごきげんようなのです。
次回予告をしたからにはやらない訳にはいかない、ミリノルトです。

今回も技術発信、予告通りセーブ編!

前回(ロード編)はこちら
尚どちらの記事も、他の方法の存在を否定するものではありません。予めご了承ください。

結論 -始まりの見出しは-

通常変数を栞にして、その値に応じて処理を切り替える。

何がしたいのか -コント駆動開発-

あれは、"会話イベント中にロードする"の記事を書いていた際のこと……

( 'ω')「開発中の困ったこととその解決方法を書いて、ためになることをするぞっ。
需要あるかなあ? いや違う。なくてもやるのだ。"供給"であるがゆえに。
見出しも決めて、あとは清書だけ!」

かと思いきや……

( 'ω')「ロードするってことは、セーブされてるってことだよね。
会話イベント中にセーブできていること前提じゃん!! でもロードの記事では並列実行云々でのロードの話をしたいよー……
こんな時は、セーブのことはセーブの記事を書く私に任せて、今(当時)はロードに絞ろうっと」

……こうして、記事をもう1つ書くことになったのでした。

先月の私ったら、たまったもんじゃないね!今後の課題とします。


問題点 -セーブロード注意報-

解決前の状態について説明します。

ウディタでは、実行中のイベントは保存されません。
これはデフォルトの「文章を表示」でも自作メッセージ表示でも同じです。会話イベントの最初からロードされてしまうのです。
例えば本作では現在、シナリオをtxtファイルから読み込んでいます。つまり、その時々のtxtファイルの最初からになるということです。

また、後述のために本作のノベルパートのシステムそのものについても説明しておきます。
本作では、
①メインルーチン

②シナリオファイル読み込み

③シナリオ節読み込み
の順にコモンイベントが起動し、自作メッセージや画像を表示したり、バトルパートを呼び出したりしているのです。呼び出すコマンド1つ1つをここでは「節」と呼びます。
この状態でセーブして、ロードすると、どうなるでしょうか?
何も対策しなければ、セーブ直前の状態から動きません。それ以上コモンイベントが起動しないからです。
ではどのコモンイベントに起動してもらうべきでしょうか?
ロードした後も変わらず動くようにするには、根っこからの起動が必要です。
つまり答えは「①メインルーチン」。
しかしそのまま起動すると……上述の通り、対象のtxtファイルを最初から読み込んでしまうという訳です。

では、どうすべきでしょうか?

解決方法 -完全簡単解決策-

セーブする時に変数1つを1にして、これが1の時はメインルーチンの読み込みを行わず、「節」の読み込みも飛ばす(その後これを0にする)。
上記の画像の青丸で囲われた分岐部分がポイントです。


画像1 メインルーチン。0の時だけtxtを読み込み


画像2 シナリオ節読み込み。0の時にだけ前処理を行う

これは通常変数である必要があります。ロードされても情報が残るようにするためです(コモンセルフ変数や可変DBはロードされると値が消えます)。
私はこれを書物のイメージになぞらえて、「栞変数」と呼んでいます。皆さんもお好きな名前でお呼びください( 'ω')ノ

まとめ -誰だって作れるよゲーム!-

前回の記事と合わせることで、常に会話をしているようなゲームにおいてもウディタでセーブとロードができるようになりました( 'ω')b!

もし今後当時の私と同じ悩みを持った方が現れた時、これらの記事が少しでも問題解決に寄与すれば、私は嬉しいです。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ミリノルト 2023/04/08 22:08

【ウディタ】会話イベント中にロードする

ごぎげんようなのです。
無料プランの名前をしれっと見直しました、ミリノルトです。

今回は技術発信!

前置き

ウディタは自由度が高い一方で、いわゆる中級者向けのノウハウが中々共有されづらいと私は感じています。
そこで、私の辿った問題点とその解決方法を記録して、備忘録兼同じようなことをしたい方向けの何かになればと思いこの記事を書いています。

結論

自作メッセージ表示コモンを使うことで、会話イベント中でも「呼び出しのみ」でコモンを起動できる。

結論から書こうとはよく言ったものですが、見出しの名前まで結論にしている方は中々見かけない気がしますので、やってみました。ふふふ。

何がしたいのか

奏翼譚歌アンサラーver0.12体験版ααをプレイしてくださった方や、私のtwitterを注意深く観ていた方は、気付いたと思います。
そう、このゲーム、会話イベント中にセーブやロードができます。

ノベルゲームを思い浮かべてみてください。だいたい常に会話をしていますよね。
その中でもセーブやロードができますよね。
あれと同じことをやりたいのです。何せ本作は「ノベルパート」と「バトルパート」に分かれた構成となっています。話しているか戦っているかなのです。
プレイ中にロードできなくてもプレイに支障はありません。しかし、できたほうが遊びやすさは断然上がる!上げたい!

こうして、会話イベント中にVキーでメニューを開いてそこからロード画面を出せるようにしました。

問題点

それは、ウディタver3への移行を進めていた際のこと……。
描画する座標を書き換え、ロードのテストをしたのです。すると……

緑帯ことエラーメッセージが!
(スクショを撮っていたと思っていたのですが探してもありませんでした……)

先述の通り、現在の本作のシステムでは、文章の表示中にVキーを押すことでメニューを出し、セーブ/ロード画面に移行する仕様となっています。
そのメニューを出す際に、並列実行を使っていたのです。

以前からウディタの言語仕様において、並列実行中のロードは非推奨とされていました。低確率でクラッシュの危険があるためだそうです。
私はそのことを知らずに使ってしまっていたのです。
それがウディタver3で正式に「実行できないこと」として定められました。
しかし並列実行を使わないと、「文章の表示」をしている最中にVキーを受け付けることはなくなってしまいます。
シナリオファイルを別のコモンイベントの途中から呼び出して使っているので、「イベントの予約」も使えないと来ました。

これを解決するため、私はあることを決めたのです。

解決方法

自作メッセージ表示コモンを作ることで解決しました。


画像は実際のコモンイベントです。特に複雑なことはしていません。簡単だからこそこんな風に画像を出せるというものです。

折角デフォルトで「文章の表示」の機能があるのに1つの目的のために逸脱しないといけないのは少し後ろめたいものもありましたが、なんとかなりました。
ウィンドウの大きさはデフォルトのコモンと同じ大きさになるように、同じ座標と同じ幅を使いました。
文にはピクチャを使い、「文章の表示」の場合と同じ座標になるように調整しました。
ちなみにこのコモンは本当にメッセージ表示(それか消去か判定)をしているだけです。キーを押して読み進めるなどの処理は呼び出した側のコモンが行います。
ヒトはそれを単一責任の原則と呼ぶんですって。

ともあれ、おかげで問題解決!遊びやすさが向上しました。

次回予告

この記事を注意深く読んだ方は気付いたと思います。
「あれ、セーブは? そもそもデフォルトだと会話イベント中にロードしたら……」
という訳で次回、セーブ編!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

記事を検索