CraDraの雑記帳

CraDraの制作物を載せるブログ。実は2017/06/07に開設していたり。

PG?:ゲーム制作ツールでバス時刻案内を作った話&おまけ【デジクリアドカレ2018冬10日目】

<この記事はデジクリアドベントカレンダー2018の10日目の記事です。記事一覧はこちら→https://adventar.org/calendars/3516 >
※タイトルに冬と付けていますが冬しかありません。

初めての方ははじめまして。こんにちは。デジクリ13期のCraDraです。*1
外部に向けて発信することは少ないですが、普段はウディタ(後述)で色々作ったりイラストやドット絵を描いてます。あと最近VRoid始めました。つまり色々やってます。

これまでデジクリで制作して意外に思ったのが、
PGではC言語においてA^=B^=A^=Bで一時変数なしに変数の入れ替えが可能なこと、
CGではシャープ化という技術があること、
DTMでは半音上げた音は大半の場合単純に12乗根2倍ではないこと*2でした。

閑話休題
今回はゲーム制作ツールであるWOLF RPGエディター(以下「ウディタ」)でバスの時刻表を作った話をします。1万字超えると非常に読みづらいのでやや簡潔にします。

f:id:dgx:20181209001906p:plain
(画像のキャラクターはきゃらふとで作成)

バス時刻案内の電光掲示板(旧)はこちら。
plicy.net

案内板(新)のブログ版はこちら(ver0.02のため不具合あり)。
phx.hateblo.jp

そもそもウディタとは?

自分なりにまとめてみました。

WOLF RPGエディターは無償のRPG作成ソフトで、似たツールであるRPGツクールよりも自由度が高いとされる*3
作ったゲームは商業利用可能。ウディタを用いた制作者はウディタリアンと呼ばれることも多い。
ウディタ製ゲームのコンテスト「ウディコン」ではフリーゲーム全体から見ても比較的クオリティの高いゲームが多くエントリーしている。

内部ではC++とDXライブラリで動作(エラーではまれにDXライブラリの表示が出る)。変数の宣言は不要だが、小数は扱えずデータベースやマップなどRPGに特化している。
プログラミングのライブラリにあたるものとしてよく使う動作をまとめたコモンイベントがある。入出力ができるため他人の作ったイベントもDL可能*4

公式サイト:WOLF RPGエディター公式サイト 【RPG作成フリーソフト】

バス時刻案内の成り立ち

成り立ちよりもさっさと中身が見たい!という方は飛ばしてください。

SITBUS電光掲示板(発車案内標)ができるまで

制作前、帰りのスクールバス*5に1つ乗り遅れると列車の種類*6によって家に着くのが30分ほど遅くなる問題を強く感じたことをきっかけでバス時刻を表示するツールを制作開始しました。
2018年4月に完成し、Plicyにて公開開始。このツールの案内時に名前は"電光掲示板"と"発車案内標"の両方とも使用しています。
現在の前身となるもので、0から作ったため動作の無駄が多く内部でも様々な動作が絡み合っています。
最初はバス時刻表示のみでしたが、英語表示にも対応し、その後PC室の授業使用状況、絞り込み機能、ダイヤグラム表示機能を追加しました。

SITBUS案内板Plusの制作開始

SITBUS電光掲示板が機能拡大するにつれて内部動作の修正や機能追加がやや困難になりました*7
そこでシステムを1から作り直す必要性を感じ案内板Plusの制作を開始し、制作している間にブログパーツ対応されていたのでブログ版も公開開始しました。*8

データベース以外は1から作ったためダイヤグラムには対応していない一方でナンバリングを追加したり対応バスを拡大したりしています。
現在は多忙につき更新ができていませんが、できるようになり次第更新します*9

RPG作成ソフトでバス時刻案内を作る

レシピのような感じで進めていきます。

~SITBUS電光掲示

まずは表示する発車時刻を用意します。Plicy側でページからのDLに対応していなかった*10ので手打ちで作ります。データベースを先に作っておくと後々作り直さなくて済むので先に作ります(曜日キー番号は曜日による分岐用で0が平日で1が土曜)。

f:id:dgx:20181208165148p:plain
バス時刻データベース
こんな感じで。表示したい内容は項目として用意しておきます。

今回の場合、RPGと違って時刻以外は大半が同じデータで、1つ1つ入力するのは面倒なのでウディタのcsv出力機能を使います。

f:id:dgx:20181208164206p:plain
時刻データcsv(Excel)
1行作ったらコピーして時刻など一部変えるだけで簡単に作れます。ウディタのcsv入力機能を使えば先ほどのウディタ内データベースに入ります。

データが用意できたら次にコマンドを入力していきます。コマンドの集合体がコモンイベントです。プログラムと違って誤字で動かないということはありません(多分)。

ウディタ初心者さんのために概要を示すと、コマンドでは以下のコマンドが入力できます。これらを組み合わせて必要な処理を作ります。例は今回の場合どこで使うかで示しています。

  1. 文章表示(主にRPGで使用)
  2. 選択肢(主にRPGで使用)
  3. 変数操作 : 内部で扱う"数値"を変える → 例:駅発のバス発車時刻は校舎発のバス発車時刻に+6分する
  4. DB操作 : データベースから読み込む/データベースに書き込む → 例:発車時刻データベースから時刻を読み込む
  5. 文字列操作 : 文章などの文字列の書き換え → 例:「**:**~**:**まで間隔を狭めて運行」と表記された間の時刻のバスに「間隔を狭めて運行」と表示
  6. 変数操作+ : 変数操作よりも少し複雑な操作ができる(表示している画像の座標取得など)
  7. 条件(変数) : 数値の条件に当てはまるかで分岐する → 例:発車時刻が現在の時刻より前ならそのバスを表示しない
  8. 条件(文字列) : 文字列の条件に当てはまるかで分岐する → 例:駅発のバス表示時に行き先が「駅」なら「校舎」にする
  9. キー入力 : キーボードの入力状態やマウスの座標やクリック状態を取得できる → 例:ボタンのクリック状況
  10. ピクチャ : 画像や文字を表示する/移動させる/消去する → 例:ボタンを画面上に配置する
  11. エフェクト : 画面全体の処理(主にRPGで使用)
  12. サウンド : BGMやSEといった音を鳴らす/停止する
  13. セーブ・ロード操作(主にRPGで使用)
  14. パーティ画像(主にRPGで使用)
  15. チップ処理 : マップチップの変更(主にRPGで使用)
  16. 場所移動(主にRPGで使用)
  17. イベント制御 : ループ処理やウェイト(待ち時間)など上にない処理 → 例:データベースの個数だけ(ループで)発車時刻を判定する
  18. コモンイベント : 他で作ったコマンドの集合体を呼び出す(同じような処理の場合に楽になる)

ここで現在時刻からの発車時刻読み込みやボタン操作処理など様々な機能も追加していますが、かなり長くなるので今回は詳しい処理については省略します(どこか機会があればその話もしたいです)。

f:id:dgx:20181208164106p:plain
時刻表示コモンイベント
・・・はい。処理を分けずに機能を追加していたら1544行になってしまいました。ウディタ制作でもプログラミングでも処理は分けましょう。後で大変なことになります(実際に機能追加・修正のたびに苦労してる)。

処理を書いている間に必要になったデータベースは増やせます。接続列車を表示したいのでそのデータを追加しました。

f:id:dgx:20181208164114p:plain
列車データベース

通常はコモンイベントの中にある変数を使いますが、絞り込み機能のように変数が多く必要な場合はデータベースとして変数を設定できます。

f:id:dgx:20181208164109p:plain
絞り込み用データベース

こうして作った結果がこうなります。

f:id:dgx:20181208163926p:plainf:id:dgx:20181208164018p:plain
実行結果(SITBUS電光掲示板)
停留所の丸にマウスを乗せると停留所名が表示されるようになっています。
f:id:dgx:20181208164021p:plainf:id:dgx:20181208164027p:plainf:id:dgx:20181208164031p:plain
絞り込み機能
絞り込み機能もついています。条件分岐で合致したものだけを表示すれば実装できます。

バス時刻だけでは物足りなくなり、ダイヤグラム表示や振替輸送用のバス時刻表示、PC室の使用状況といった機能を追加しました。

f:id:dgx:20181208164038p:plainf:id:dgx:20181208164043p:plainf:id:dgx:20181208164050p:plainf:id:dgx:20181208164056p:plain
おまけ機能(ダイヤグラム/振替輸送用バス/PC室使用状況)

SITBUS案内板Plus~

そしてここからSITBUS案内板Plusを制作していきます。改良点を簡単に載せることにします。
データベース削減と列車→列車乗換にも対応できるように列車時刻データをバスデータ内に移動させます。

f:id:dgx:20181208164203p:plain
列車時刻→バス時刻データベース
そして、コモンイベントでは発車時刻の探索が何回も行われるので独立化します。
f:id:dgx:20181208164202p:plain
発時刻探索の独立化(スパゲッティコード解消)

f:id:dgx:20181208164159p:plain
メニュー
メニューを左上に移動させることで表示域を拡大できました。時刻表示に背景色を追加し、路線名やナンバリングを画像として表示するとレイアウトが違った形でできあがります。
f:id:dgx:20181208164133p:plainf:id:dgx:20181208164134p:plainf:id:dgx:20181208180233p:plainf:id:dgx:20181208164136p:plainf:id:dgx:20181208164139p:plain
バスと列車の時刻表示
ウディタはRPG作成ソフトのため、ナンバリングなどのアイコン表示は「\i[???]」*11の形で入力すればフォルダ内の「icon???」.pngを表示してくれます。お手軽に表示できるのが強みです。当停留所始発やグリーン車もアイコン表示しています*12

f:id:dgx:20181208164143p:plainf:id:dgx:20181208164147p:plainf:id:dgx:20181208164156p:plain
PC室状況/PC室科目検索
フォントを「IPA明朝」に変更したため同じ内容のPC室使用状況の表示でも違って見えます。PC室科目検索では検索語入力フォームを設置することでGUIの観点で使いやすくなりました。
ウディタだけで作るとこんな感じになります。言語プログラミングだともっと早くできるとは思いますがあえてウディタで作りました。
ウディタの自由度は高いのでほぼ何でも作れます。

おまけ

ウディタが便利なのでもう少しだけウディタ制作物の話を簡潔にします。詳しいことはそのうちTwitterかどこかで詳しく話します*13*14

  • CraDra_Games
  1. ごっこゲーム:デジクリの企画発表前1週間で作成しました。RPG作成ソフトとキャラ追従機能は相性抜群です。ランキング機能付き。
  2. 歌詞タイピング:歌詞をタイピングするだけのゲームです。ウディタと相性がやや悪く機能は抑えめです。
  • CraDra_Tools
  1. ウディタプレゼン:画像として出力されたプレゼンを表示するツールです。一覧表示機能と制限時間機能と音声再生機能付き。(パワポoggファイルが環境により再生できなかったので作成)
  2. 歌詞表示ツール:CSVファイルとしてあらかじめ設定された歌詞を表示するツールです。複数人の歌詞を表示することに特化したツールです(色指定可)。簡単な背景設定もできるので使い方次第でニコカラみたいなものも作れるかも。
  • 流れる文章表示コモン:枠に入る限り古い文章も表示し、枠に入りきらなくなったらその文章が消えて新しい文章が下から表示されるコモンイベントです*15。配布は現在進行中のRPG企画が完成したらにします。

アドカレ

明日は同期のすえおさんの記事です。3DCGに強いのでおそらくその分野のすっごい話をしてくれるでしょう。

そして最終週ではCGが強くて尊敬する後輩ちゃんとPG,CG,DTM全て経験者のアルティメットな部長さん、そして最終日はPGの強い方へと続きます!*16
デジクリアドベントカレンダー2018、ぜひ最後までお楽しみください!

*1:ソロプロジェクト。個人サークルみたいなもの。中の人はxと申します。

*2:よく純正律を使うが平均律といってこの上げ方もあるらしい

*3:少なくともプログラミングしない範囲では

*4:主に公式サイトのコモンイベント集

*5:発車時刻は駅の列車発車時刻と連動

*6:田舎列車なのでそもそも本数が少ない

*7:スパゲッティコード的な感じ。プログラマは耳が痛いかも

*8:名前について実は案内板Nextにする案もありましたがNextは図書カードNextが使いづらいという個人的な感情から却下し最終的にPlusに決定しました

*9:ループ回数が指定通りにならない不具合とか

*10:現在はhttpsサイトからはDL可能になっています

*11:ここでは環境により表示が異なるがウディタでは円マーク

*12:でも種別はウディタ機能の四角描画で表示しています

*13:気になる方はTwitterのDMで聞いてください

*14:Twitterアカウントは@gvlzp

*15:言葉での説明が難しい

*16:PG強すぎるので部室扉のスクールバス次発時刻表示機能を託したほど