あひぁの攻略&紹介

なんでも攻略してやる(好きなゲームに限る。)

【ウディタ】Wolf RPG Editorでノベルゲームを作ってみよう!その4(セーブ・ロード、CG機能について)

どうもあひぁだよ。最近クッソ寒いっすね。今も半袖半パンで震えながらPCの前に座っています。暖房代は絶対使わんぞ。…たぶん。

まあ私事はどうでもいいとして、今回はセーブ・ロードとその他追加要素についての説明をするよ。

セーブとロードとその動作について

ウディタは最強に有能なのでデフォルトにセーブロード機能が備わっている。コレを使わせてもらおう。その前に、ウディタでのセーブロードの挙動を簡単に説明しておく。ウディタでは、ロードをするとロードしたイベントの最初からスタートする。すなわち、イベントの途中でセーブを挟んでロードしても、そのイベントのスタートから始まる、ということになる。これを踏まえて実装していこう。

市販のノベルゲームにある「その地点からスタート出来る」機能は難しいかもしれない(通常変数を使えばどうとでもなるかもしれないが、どちみち手間は掛かる)。有識者が出来るかもしれないけどもあひぁは思い付かない、申し訳ない。

 

今回の講座では、「ある程度シーンが進んだらそのシーン終わりにセーブするか否かを聞かれ、はいを押すとセーブし、ロード時に次のシーンからスタートする」というものを実装する。

f:id:kanaseiwa:20191120230553p:plain

まず、順番としては必ず「場所移動(え?ってなったら講座1を見てね)→データセーブ」とすること。こうすることにより、マップ移動後のデータが保存され、移動後(すなわち、次のシーン)からスタートすることになる。

コモンとは?

ここまで講座を熱心に見てくれてる人ならもうコモンについて知って良そうな気がするが、一応説明しておく。コモンとは、いうなれば「関数」。たとえば、「木材3つに、くぎを打ち付けて、その横に木材をくぎで打ち付ける」という仕事を何度もしたいとしよう。全て同じ行動とはいえ、何度も何度も指示するのは面倒。そこでコモンの出番!コモンのAさんに先程の仕事を教え、Aさんを呼ぶだけでしてもらうことが出来るようになる。これにより手間が省けるのである。

つまり、「絶対必要ってワケじゃない機能なんだけど、圧倒的便利で使わない道が無いよね」って機能である。実際にコモンを使って実装してみよう。

 

f:id:kanaseiwa:20191120231317p:plain

ココから行けるよ

f:id:kanaseiwa:20191120231348p:plain

ある程度の機能が備わっているウルファールサンプルデータを使用している前提なので、ズラ~リとコモンイベントが並んでいるはず。ノベルゲームではシステム系以外は使わないので消しても大丈夫。

f:id:kanaseiwa:20191120231517p:plain

今回作る機能であるセーブ機能。文章で保存するかどうかを聞き、はい、でデータセーブ。ここをいじればセーブスロットを複数にすることも出来る。

 

これでセーブロード機能は完成!では最初の講座:1で作ったマップに戻って…

f:id:kanaseiwa:20191120231938p:plain

途中から(ロード)のところに、「データのロード」を追加しよう。(ロードの番号はセーブした番号に合わせること、0は使わない)

※注意!上スクショはデータのロードしか書いていませんが、「はじめる」に書いてあるように画像を消す処理を挟みましょう。もしも移動後のシーンで消す処理を作っているのならば不要ですが、念のためにも挟んでおきましょう。

 

コレでデータセーブとロード機能が完成。おめでとう。ノベルゲームの完成だ!

…え?まだ肝心の機能がないって?

CG集を作ろう

CG集はやはりノベルゲームの第二のとも言える存在。ここまで理解した人ならば…といつものように言いたいところだが、割とある程度分かってる人にガッツリ説明をしたいので、無理に実装しなくても大丈夫。講座1の一番最後に書いた手順を実行する。

※筆者の簡易な方法でソースを書きますが、コレが最善だろう、とかは個人でアレンジしてみて下さい。

では先程やったようにコモンイベントを作ろう。まず今回は縦(yとする)が2横が(xとする)が2、2×2で4つのCGを作るとしよう。(もちろんここは各自で変えて貰ってよい)

f:id:kanaseiwa:20191120233141p:plain



このようにまずは未開放の画像を配置する。(画像はウディタの画面サイズに合わせておこう。)ただ、画像を置くだけではなく、最初にそのCGが開放されたかどうかを判定しよう。

ステップ1:CGのフラグ実装

CGのフラグは全体を通じるためセルフ変数は不可。通常変数を扱うことになる。さらにデータのセーブを扱う。

f:id:kanaseiwa:20191120233935p:plain

すまん文章は気にしないでくれ



上のソースでは、V13[CG3]=1+0(CG3という通常変数=1としている)をしたあと、データのセーブを行っている。ここで注意しておきたいのが、データのセーブ番号を本編で使っていない数字にすること。これはあくまでもCG3という通常変数を保存するだけのセーブであり、本編とは関係のないからである。ちなみにCGを作るごとにセーブ番号は個別のものを利用しよう。

さて、セーブ番号に通常変数を格納したところでCG作成のコモンに戻ろう。

ステップ2:そのCGが開放されたかどうかを判定

f:id:kanaseiwa:20191120235329p:plain

Q.CGが開放された判定って、変数が1か0だけじゃダメなの?

A.ダメです。

起動時は「完全に何もロードしていない状態」、すなわち先程保存したもろもろは全て「0」のままなのである。なのでまずは値を読み込み、そこから判定しなければならない。なので先程のようにセーブデータを各々に格納(入れた)したのである。

画像のとおり、まずはCSelf(コモンセルフ)に、代入したセーブデータの保存した変数を読み込み、そこから条件分岐を行う。

f:id:kanaseiwa:20191120234820p:plain

読み込みのしかた

そうして判定が出来たら、ためしにCGのフラグを立ててみよう。無事CGの絵が変更されたら成功だ。

ステップ3:CGを選び、選んだものを拡大表示、キャンセルで終了

次は選んだものを表示する操作を行おう。ここでは無限ループを使用する。(ウディタではif(;;)動作のみ存在する)

f:id:kanaseiwa:20191120235904p:plain

ココでCselfの使用状況を確認しておくこと。ダブリは禁物!ちなみにそれぞれ名前を付けることも出来る。(ごっちゃにならないのでオススメしておく)

実装していく動作を箇条書きしていく。

  • 縦の位置をy(Cself)、横の位置をx(Cself)とする。初期値は両方0
  • 無限ループ開始
  • キーボード入力(2,4,6,8,10。押した場所に対応する数が変数に代入される)を入力待ちで促し、(先程使っていないセルフ変数に格納)右(6)ならばxに+1、下(2)ならばyに+1させる。同様にして上ならば-1…などやっていく(しかしこれだけだと永遠に足されてしまうので更に条件必要)
  • 縦の位置と横の位置により条件を作り、10を押された場合拡大表示する画像を選ぶ。(ここで未開放の場合は勿論拡大してはいけない)
  • キャンセル(11)で終了

 

 

 

 

 

作成したプログラム ▼ あくまでも汎用ではなく、参考です

▼ 画像やフラグを各自で設定しましょう
■変数操作: V11[CG1] = 1 + 0
■データのセーブ: 2
■セーブデータの内容読込: CSelf10[CG1] = セーブデータ[2]の V11[CG1]
■条件分岐(変数): 【1】 CSelf10[CG1] が 0 と同じ 【2】 CSelf10[CG1] が 1 と同じ
-◇分岐: 【1】 [ CSelf10[CG1] が 0 と同じ ]の場合↓
|▼ 未開放
|■ピクチャ表示:6 [左上]ファイル「Picture/無題547.png」 X:50 Y:50 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
|■
-◇分岐: 【2】 [ CSelf10[CG1] が 1 と同じ ]の場合↓
|▼ 開放済み
|■ピクチャ表示:6 [左上]ファイル「Picture/無題371.png」 X:50 Y:50 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
|■
◇分岐終了◇
▼ CG2
■セーブデータの内容読込: CSelf11[CG2] = セーブデータ[3]の V12[CG2]
■条件分岐(変数): 【1】 CSelf11[CG2] が 0 と同じ 【2】 CSelf11[CG2] が 1 と同じ
-◇分岐: 【1】 [ CSelf11[CG2] が 0 と同じ ]の場合↓
|▼ 未開放
|■ピクチャ表示:7 [左上]ファイル「Picture/無題547.png」 X:550 Y:50 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
|■
-◇分岐: 【2】 [ CSelf11[CG2] が 1 と同じ ]の場合↓
|▼ 開放済み
|■ピクチャ表示:7 [左上]ファイル「Picture/無題477.png」 X:550 Y:50 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
|■
◇分岐終了◇
▼ CG3
■セーブデータの内容読込: CSelf12[CG3] = セーブデータ[4]の V13[CG3]
■条件分岐(変数): 【1】 CSelf12[CG3] が 0 と同じ 【2】 CSelf12[CG3] が 1 と同じ
-◇分岐: 【1】 [ CSelf12[CG3] が 0 と同じ ]の場合↓
|▼ 未開放
|■ピクチャ表示:8 [左上]ファイル「Picture/無題547.png」 X:50 Y:400 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
|■
-◇分岐: 【2】 [ CSelf12[CG3] が 1 と同じ ]の場合↓
|▼ 開放済み
|■ピクチャ表示:8 [左上]ファイル「Picture/無題488.png」 X:50 Y:400 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
|■
◇分岐終了◇
▼ CG4
■セーブデータの内容読込: CSelf13[CG4] = セーブデータ[5]の V14[CG4]
■条件分岐(変数): 【1】 CSelf13[CG4] が 0 と同じ 【2】 CSelf13[CG4] が 1 と同じ
-◇分岐: 【1】 [ CSelf13[CG4] が 0 と同じ ]の場合↓
|▼ 未開放
|■ピクチャ表示:9 [左上]ファイル「Picture/無題547.png」 X:550 Y:400 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
|■
-◇分岐: 【2】 [ CSelf13[CG4] が 1 と同じ ]の場合↓
|▼ 開放済み
|■ピクチャ表示:9 [左上]ファイル「Picture/無題551.png」 X:550 Y:400 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
|■
◇分岐終了◇
■ピクチャ表示:10 [左上]ファイル「Picture/muzi.png」 X:50 Y:50 / 0(0)フレーム / パターン 1 / 透 100 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
■ピクチャ移動:10 X:50 Y:50 / 0(0)フレーム / パターン 1 / 透 100 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
▼ x座標をCself21
▼ y座標をCself22とする
▼ Cself21,Cself22がそれぞれ00ならば左上
▼ 01ならば右上
▼ 10ならば左下
▼ 11ならば右下
■ループ開始
|■キー入力:CSelf20[入力待ち] 4方向 決定(10) キャンセル(11)
|■条件分岐(変数): 【1】 CSelf20 が 4 と同じ 【2】 CSelf20 が 6 と同じ 【3】 CSelf20 が 8 と同じ
|-◇分岐: 【1】 [ CSelf20 が 4 と同じ ]の場合↓
| |▼ 左の場合
| |■条件分岐(変数): 【1】 CSelf21[x] が 0 と同じ 【2】 CSelf21[x] が 1 と同じ
| |-◇分岐: 【1】 [ CSelf21[x] が 0 と同じ ]の場合↓
| | |▼ つっかえ
| | |■
| |-◇分岐: 【2】 [ CSelf21[x] が 1 と同じ ]の場合↓
| | |■サウンド:SE ファイル[SE/selectoto.wav] 音 100% 周 100% 再生 / 遅延:0フレーム
| | |■変数操作: CSelf21[x] -= 1 + 0
| | |■ピクチャ移動:10 相対X:-500 Y:0 / 0(0)フレーム / パターン 1 / 透 100 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
| | |■
| |◇分岐終了◇
| |■
|-◇分岐: 【2】 [ CSelf20 が 6 と同じ ]の場合↓
| |▼ 右の場合
| |■条件分岐(変数): 【1】 CSelf21[x] が 0 と同じ 【2】 CSelf21[x] が 1 と同じ
| |-◇分岐: 【1】 [ CSelf21[x] が 0 と同じ ]の場合↓
| | |■サウンド:SE ファイル[SE/selectoto.wav] 音 100% 周 100% 再生 / 遅延:0フレーム
| | |■変数操作: CSelf21[x] += 1 + 0
| | |■ピクチャ移動:10 相対X:500 Y:0 / 0(0)フレーム / パターン 1 / 透 100 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
| | |■
| |-◇分岐: 【2】 [ CSelf21[x] が 1 と同じ ]の場合↓
| | |▼ つっかえ
| | |■
| |◇分岐終了◇
| |■
|-◇分岐: 【3】 [ CSelf20 が 8 と同じ ]の場合↓
| |▼ 上の場合
| |■条件分岐(変数): 【1】 CSelf22[y] が 0 と同じ 【2】 CSelf22[y] が 1 と同じ
| |-◇分岐: 【1】 [ CSelf22[y] が 0 と同じ ]の場合↓
| | |▼ つっかえ
| | |■
| |-◇分岐: 【2】 [ CSelf22[y] が 1 と同じ ]の場合↓
| | |■サウンド:SE ファイル[SE/selectoto.wav] 音 100% 周 100% 再生 / 遅延:0フレーム
| | |■変数操作: CSelf22[y] -= 1 + 0
| | |■ピクチャ移動:10 相対X:0 Y:-350 / 0(0)フレーム / パターン 1 / 透 100 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
| | |■
| |◇分岐終了◇
| |■
|◇分岐終了◇
|■条件分岐(変数): 【1】 CSelf20 が 2 と同じ 【2】 CSelf20 が 10 と同じ 【3】 CSelf20 が 11 と同じ
|-◇分岐: 【1】 [ CSelf20 が 2 と同じ ]の場合↓
| |▼ 下の場合
| |■条件分岐(変数): 【1】 CSelf22[y] が 0 と同じ 【2】 CSelf22[y] が 1 と同じ
| |-◇分岐: 【1】 [ CSelf22[y] が 0 と同じ ]の場合↓
| | |■サウンド:SE ファイル[SE/selectoto.wav] 音 100% 周 100% 再生 / 遅延:0フレーム
| | |■変数操作: CSelf22[y] += 1 + 0
| | |■ピクチャ移動:10 相対X:0 Y:350 / 0(0)フレーム / パターン 1 / 透 100 / 通常 / 角 0 / 拡 40% / カラー R[100] G[100] B[100]
| | |■
| |-◇分岐: 【2】 [ CSelf22[y] が 1 と同じ ]の場合↓
| | |▼ つっかえ
| | |■
| |◇分岐終了◇
| |■
|-◇分岐: 【2】 [ CSelf20 が 10 と同じ ]の場合↓
| |▼ 決定
| |■条件分岐(変数): 【1】 CSelf21[x] が 0 と同じ 【2】 CSelf21[x] が 1 と同じ
| |-◇分岐: 【1】 [ CSelf21[x] が 0 と同じ ]の場合↓
| | |▼ xが0のとき
| | |■条件分岐(変数): 【1】 CSelf22[y] が 0 と同じ 【2】 CSelf22[y] が 1 と同じ
| | |-◇分岐: 【1】 [ CSelf22[y] が 0 と同じ ]の場合↓
| | | |▼ yが0のとき
| | | |■条件分岐(変数): 【1】 V11[CG1] が 1 と同じ
| | | |-◇分岐: 【1】 [ V11[CG1] が 1 と同じ ]の場合↓
| | | | |▼ CG1が開放されているならば表示
| | | | |■ピクチャ表示:20 [左上]文字列[閉じるー[X]] X:450 Y:720 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[200] G[200] B[200]
| | | | |■ピクチャ表示:11 [左上]ファイル「Picture/無題371.png」 X:0 Y:0 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[100] G[100] B[100]
| | | | |■キー入力:CSelf25[入力待ち] キャンセル(11)
| | | | |■条件分岐(変数): 【1】 CSelf25 が 11 と同じ
| | | | |-◇分岐: 【1】 [ CSelf25 が 11 と同じ ]の場合↓
| | | | | |■ピクチャ消去:11 ~ 20 / 30(0)フレーム
| | | | | |■
| | | | |◇分岐終了◇
| | | | |■
| | | |◇分岐終了◇
| | | |■
| | |-◇分岐: 【2】 [ CSelf22[y] が 1 と同じ ]の場合↓
| | | |▼ yが1のとき
| | | |■条件分岐(変数): 【1】 V12[CG2] が 1 と同じ
| | | |-◇分岐: 【1】 [ V12[CG2] が 1 と同じ ]の場合↓
| | | | |▼ CG2が開放されているならば表示
| | | | |■ピクチャ表示:20 [左上]文字列[閉じるー[X]] X:450 Y:720 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[200] G[200] B[200]
| | | | |■ピクチャ表示:11 [左上]ファイル「Picture/無題477.png」 X:0 Y:0 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[100] G[100] B[100]
| | | | |■キー入力:CSelf25[入力待ち] キャンセル(11)
| | | | |■条件分岐(変数): 【1】 CSelf25 が 11 と同じ
| | | | |-◇分岐: 【1】 [ CSelf25 が 11 と同じ ]の場合↓
| | | | | |■ピクチャ消去:11 ~ 20 / 30(0)フレーム
| | | | | |■
| | | | |◇分岐終了◇
| | | | |■
| | | |◇分岐終了◇
| | | |■
| | |◇分岐終了◇
| | |■
| |-◇分岐: 【2】 [ CSelf21[x] が 1 と同じ ]の場合↓
| | |▼ xが1のとき
| | |■条件分岐(変数): 【1】 CSelf22[y] が 0 と同じ 【2】 CSelf22[y] が 1 と同じ
| | |-◇分岐: 【1】 [ CSelf22[y] が 0 と同じ ]の場合↓
| | | |▼ yが0のとき
| | | |■条件分岐(変数): 【1】 V13[CG3] が 1 と同じ
| | | |-◇分岐: 【1】 [ V13[CG3] が 1 と同じ ]の場合↓
| | | | |▼ CG3が開放されているならば表示
| | | | |■ピクチャ表示:20 [左上]文字列[閉じるー[X]] X:450 Y:720 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[200] G[200] B[200]
| | | | |■ピクチャ表示:11 [左上]ファイル「Picture/無題477.png」 X:0 Y:0 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[100] G[100] B[100]
| | | | |■キー入力:CSelf25[入力待ち] キャンセル(11)
| | | | |■条件分岐(変数): 【1】 CSelf25 が 11 と同じ
| | | | |-◇分岐: 【1】 [ CSelf25 が 11 と同じ ]の場合↓
| | | | | |■ピクチャ消去:11 ~ 20 / 30(0)フレーム
| | | | | |■
| | | | |◇分岐終了◇
| | | | |■
| | | |◇分岐終了◇
| | | |■
| | |-◇分岐: 【2】 [ CSelf22[y] が 1 と同じ ]の場合↓
| | | |▼ yが1のとき
| | | |■条件分岐(変数): 【1】 V14[CG4] が 1 と同じ
| | | |-◇分岐: 【1】 [ V14[CG4] が 1 と同じ ]の場合↓
| | | | |▼ CG4が開放されているならば表示
| | | | |■ピクチャ表示:20 [左上]文字列[閉じるー[X]] X:450 Y:720 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[200] G[200] B[200]
| | | | |■ピクチャ表示:11 [左上]ファイル「Picture/無題477.png」 X:0 Y:0 / 30(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[100] G[100] B[100]
| | | | |■キー入力:CSelf25[入力待ち] キャンセル(11)
| | | | |■条件分岐(変数): 【1】 CSelf25 が 11 と同じ
| | | | |-◇分岐: 【1】 [ CSelf25 が 11 と同じ ]の場合↓
| | | | | |■ピクチャ消去:11 ~ 20 / 30(0)フレーム
| | | | | |■
| | | | |◇分岐終了◇
| | | | |■
| | | |◇分岐終了◇
| | | |■
| | |◇分岐終了◇
| | |■
| |◇分岐終了◇
| |■
|-◇分岐: 【3】 [ CSelf20 が 11 と同じ ]の場合↓
| |▼ キャンセル
| |■ループ中断
| |■
|◇分岐終了◇
|■
◇ループここまで◇◇

 

 

 

 

 


 これは2×2の例ですが、増やしたければ同じようにすれば大丈夫です。希望があればコモンファイル配布します。(2×2じゃない限り自分で作ったほうが早いと思うけど…)

 

ここまで道のりは長かったですが、コレでウディタについて全然わかんなくても貴方もノベルゲーム作りたいなぁ、と思っていただけると本望です。ここまで読んで下さりありがとうございました。筆者も未熟なうえ、まだまだ追加出来る要素は沢山あるかとは思いますが、今度は貴方が全て作っていく番です。

残りはQ&Aなど。(随時追加予定。あと筆者自身が追加したものでなくとも答えられる範囲ならお答えしますが、筆者もまだまだウディタ初心者なのでそこまで深い質問にはお答えできません。簡単なものならどうぞ)

Q.CG集のアレ、セーブデータの書き込みでいいんじゃない?

A.いいと思います。というかソレ使えば保存用のセーブデータ複数要らないですね。こっちで紹介すればよかった。すみません。

 

最後に、このような素晴らしいツールを作ってくださったSmokingWolf氏に敬意を込めて。ありがとうございました。