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万字超えると非常に読みづらいのでやや簡潔にします。
(画像のキャラクターはきゃらふとで作成)
バス時刻案内の電光掲示板(旧)はこちら。
plicy.net
案内板(新)のブログ版はこちら(ver0.02のため不具合あり)。
phx.hateblo.jp
そもそもウディタとは?
自分なりにまとめてみました。
WOLF RPGエディターは無償のRPG作成ソフトで、似たツールであるRPGツクールよりも自由度が高いとされる*3。
作ったゲームは商業利用可能。ウディタを用いた制作者はウディタリアンと呼ばれることも多い。
ウディタ製ゲームのコンテスト「ウディコン」ではフリーゲーム全体から見ても比較的クオリティの高いゲームが多くエントリーしている。
内部ではC++とDXライブラリで動作(エラーではまれにDXライブラリの表示が出る)。変数の宣言は不要だが、小数は扱えずデータベースやマップなどRPGに特化している。
プログラミングのライブラリにあたるものとしてよく使う動作をまとめたコモンイベントがある。入出力ができるため他人の作ったイベントもDL可能*4。
バス時刻案内の成り立ち
成り立ちよりもさっさと中身が見たい!という方は飛ばしてください。
RPG作成ソフトでバス時刻案内を作る
レシピのような感じで進めていきます。
~SITBUS電光掲示板
まずは表示する発車時刻を用意します。Plicy側でページからのDLに対応していなかった*10ので手打ちで作ります。データベースを先に作っておくと後々作り直さなくて済むので先に作ります(曜日キー番号は曜日による分岐用で0が平日で1が土曜)。こんな感じで。表示したい内容は項目として用意しておきます。
今回の場合、RPGと違って時刻以外は大半が同じデータで、1つ1つ入力するのは面倒なのでウディタのcsv出力機能を使います。1行作ったらコピーして時刻など一部変えるだけで簡単に作れます。ウディタのcsv入力機能を使えば先ほどのウディタ内データベースに入ります。
データが用意できたら次にコマンドを入力していきます。コマンドの集合体がコモンイベントです。プログラムと違って誤字で動かないということはありません(多分)。
ウディタ初心者さんのために概要を示すと、コマンドでは以下のコマンドが入力できます。これらを組み合わせて必要な処理を作ります。例は今回の場合どこで使うかで示しています。
- 文章表示(主にRPGで使用)
- 選択肢(主にRPGで使用)
- 変数操作 : 内部で扱う"数値"を変える → 例:駅発のバス発車時刻は校舎発のバス発車時刻に+6分する
- DB操作 : データベースから読み込む/データベースに書き込む → 例:発車時刻データベースから時刻を読み込む
- 文字列操作 : 文章などの文字列の書き換え → 例:「**:**~**:**まで間隔を狭めて運行」と表記された間の時刻のバスに「間隔を狭めて運行」と表示
- 変数操作+ : 変数操作よりも少し複雑な操作ができる(表示している画像の座標取得など)
- 条件(変数) : 数値の条件に当てはまるかで分岐する → 例:発車時刻が現在の時刻より前ならそのバスを表示しない
- 条件(文字列) : 文字列の条件に当てはまるかで分岐する → 例:駅発のバス表示時に行き先が「駅」なら「校舎」にする
- キー入力 : キーボードの入力状態やマウスの座標やクリック状態を取得できる → 例:ボタンのクリック状況
- ピクチャ : 画像や文字を表示する/移動させる/消去する → 例:ボタンを画面上に配置する
- エフェクト : 画面全体の処理(主にRPGで使用)
- サウンド : BGMやSEといった音を鳴らす/停止する
- セーブ・ロード操作(主にRPGで使用)
- パーティ画像(主にRPGで使用)
- チップ処理 : マップチップの変更(主にRPGで使用)
- 場所移動(主にRPGで使用)
- イベント制御 : ループ処理やウェイト(待ち時間)など上にない処理 → 例:データベースの個数だけ(ループで)発車時刻を判定する
- コモンイベント : 他で作ったコマンドの集合体を呼び出す(同じような処理の場合に楽になる)
ここで現在時刻からの発車時刻読み込みやボタン操作処理など様々な機能も追加していますが、かなり長くなるので今回は詳しい処理については省略します(どこか機会があればその話もしたいです)。・・・はい。処理を分けずに機能を追加していたら1544行になってしまいました。ウディタ制作でもプログラミングでも処理は分けましょう。後で大変なことになります(実際に機能追加・修正のたびに苦労してる)。
処理を書いている間に必要になったデータベースは増やせます。接続列車を表示したいのでそのデータを追加しました。
通常はコモンイベントの中にある変数を使いますが、絞り込み機能のように変数が多く必要な場合はデータベースとして変数を設定できます。
こうして作った結果がこうなります。停留所の丸にマウスを乗せると停留所名が表示されるようになっています。絞り込み機能もついています。条件分岐で合致したものだけを表示すれば実装できます。
バス時刻だけでは物足りなくなり、ダイヤグラム表示や振替輸送用のバス時刻表示、PC室の使用状況といった機能を追加しました。
SITBUS案内板Plus~
そしてここからSITBUS案内板Plusを制作していきます。改良点を簡単に載せることにします。
データベース削減と列車→列車乗換にも対応できるように列車時刻データをバスデータ内に移動させます。そして、コモンイベントでは発車時刻の探索が何回も行われるので独立化します。
メニューを左上に移動させることで表示域を拡大できました。時刻表示に背景色を追加し、路線名やナンバリングを画像として表示するとレイアウトが違った形でできあがります。ウディタはRPG作成ソフトのため、ナンバリングなどのアイコン表示は「\i[???]」*11の形で入力すればフォルダ内の「icon???」.pngを表示してくれます。お手軽に表示できるのが強みです。当停留所始発やグリーン車もアイコン表示しています*12。
フォントを「IPA明朝」に変更したため同じ内容のPC室使用状況の表示でも違って見えます。PC室科目検索では検索語入力フォームを設置することでGUIの観点で使いやすくなりました。
ウディタだけで作るとこんな感じになります。言語プログラミングだともっと早くできるとは思いますがあえてウディタで作りました。
ウディタの自由度は高いのでほぼ何でも作れます。
おまけ
ウディタが便利なのでもう少しだけウディタ制作物の話を簡潔にします。詳しいことはそのうちTwitterかどこかで詳しく話します*13*14。
- CraDra_Games
- 鬼ごっこゲーム:デジクリの企画発表前1週間で作成しました。RPG作成ソフトとキャラ追従機能は相性抜群です。ランキング機能付き。
- 歌詞タイピング:歌詞をタイピングするだけのゲームです。ウディタと相性がやや悪く機能は抑えめです。
- CraDra_Tools
アドカレ
明日は同期のすえおさんの記事です。3DCGに強いのでおそらくその分野のすっごい話をしてくれるでしょう。
そして最終週ではCGが強くて尊敬する後輩ちゃんとPG,CG,DTM全て経験者のアルティメットな部長さん、そして最終日はPGの強い方へと続きます!*16
デジクリアドベントカレンダー2018、ぜひ最後までお楽しみください!
*1:ソロプロジェクト。個人サークルみたいなもの。中の人はxと申します。
*2:よく純正律を使うが平均律といってこの上げ方もあるらしい
*3:少なくともプログラミングしない範囲では
*4:主に公式サイトのコモンイベント集
*5:発車時刻は駅の列車発車時刻と連動
*6:田舎列車なのでそもそも本数が少ない
*8:名前について実は案内板Nextにする案もありましたがNextは図書カードNextが使いづらいという個人的な感情から却下し最終的にPlusに決定しました
*9:ループ回数が指定通りにならない不具合とか
*11:ここでは環境により表示が異なるがウディタでは円マーク
*12:でも種別はウディタ機能の四角描画で表示しています
*15:言葉での説明が難しい
*16:PG強すぎるので部室扉のスクールバス次発時刻表示機能を託したほど