概論

自動実行イベントでゲームを作る方法の大まかな解説。

ルール策定

起動条件

自動実行はひとつだけ、並列はデバッグ以外は極力使わないようにする。並列を使う場合も現在の状態(キーやマウスの入力や位置など)の取得に留め、実際の処理(ピクチャ表示や変数の操作)は行わないほうがバグの数も減るし、バグがあった場合にも場所を突き止めやすいように思う。

呼び出し方

コモンを呼び出す場合は、とにかく名前で呼び出す。DBも同様に、変数ではない部分は名前呼びを徹底。

メリット

  • 位置を変更して整理できる

  • 単体コモンの作り直しが容易(同名コモンが存在した場合、下のほうを実行する。つまり上をバックアップとして残せる)

デメリット

  • 名前を変更できない

Ctrl+Shift+F6(F7)で挿入(削除)もできるので、整理しやすい名前呼びがおすすめ。

コモンの配置例

自分なりの色分け、命名規則を決めておいたほうが後で見直しやすいかも。罫線(こういうの├│└)で階層を表示すると見やすくなるような気がするが、名前呼びをする場合は位置を変えられるので、付けないほうが可視性は上がる。記号(■☆▼)や分類名(【汎用】【表示】)はあってもなくても好みで。

メモ

コモンセルフ0番固定にしておくと便利。
開発状況(ここまで作った、次はこの処理、素材不足、既知のバグなど)をメモしておく。また、よく使う汎用的な処理を記述しておいてコピペに使ったり、変数を半固定(後述)するときのひな型を作っておくのもいい。
ひな型は別にいくつか作っておくと使いやすい。

メインループ

唯一の自動実行イベント。
メイン【ループ】の名称だが、終了したら次フレームで自動実行されるので、ループで囲まなくても大丈夫。

各メイン処理

メインループから呼び出される処理。ここから細かい処理を作って呼んでいく。
例は以下。

タイトル画面から、選択肢で

  • コモン【ステージ処理】

  • コモン【コンフィグ】

  • コマンド【ゲーム終了】

次はステージの処理を作る。
想定されるコモンを名前だけでも作っておく。

ステージ処理は毎フレーム処理。

  • まずコモン【ステージ生成】

  • 特定キーが入力されたら行動

  • 当たり判定

  • 結果によるHP増減

  • HPがなくなったらループ終了、次の処理は未実装

次は当たり判定は面倒だからジャンプ処理作る。
コモン0に【ステージ処理途中、当たり判定未実装、まずジャンプ処理作る】と書いておこう。

以上のように、Ctrl+Shift+F6(F7)やコピーペーストを駆使してコモンを整理しながら、必要な処理を書いていく。
その都度コモン0に実行中のメモをとる。

その他分類例

  • 借り物(コモンイベント集からダウンロードしたものなど)

  • 汎用処理(呼び出し値を計算する、数値を変換する、2D6処理、などのよく使う処理)

  • 表示処理(演出関連、例えば数字と位置とピクチャ番号を指定するとアニメーション数字を表示するものなど)

  • DB処理(誰のレベルをいくつ上げる、などデータ数値を変化させる処理)

分類すると当てはまらないものも多数出てくると思うので、前述したようにメインループ>>メイン処理>>子処理>>孫処理……のような形のほうがいいと思っています。

並列

基本的には使わないほうがバグは少ない。
せいぜいFPSやBGMを常時表示するとか、キーやマウスの状態取得(取得のみで処理はしない)、デバッグ用、など。
一部界隈には【並列撲滅】を掲げる一派がいたりしますが、実際並列なしで組んだほうが管理しやすく、処理を追いやすくなり、自作する力が一段も二段も上がると考えています。

データベース使用例

ピクチャ番号管理

ピクチャですべてを表示する関係上、ピクチャ番号の管理が重要になってきます。

コモンと同様にデータベースは名前で呼び出すので、ピクチャ番号順にデータを並べることが出来ます。

適当な項目にピクチャ番号と使用予定枚数(多め)と、その他必要な情報をデータベースに入力。

■DB読込(ユーザ): CSelf97[開始ピクチャ番号] = ユーザDB[ ピクチャデータ : グリッド : 開始ピクチャ番号 ] (1 : 4 : 4)

■DB読込(ユーザ): CSelf98[終了ピクチャ番号] = ユーザDB[ ピクチャデータ : グリッド : ピクチャ枚数 ] (1 : 4 : 5)

■変数操作: CSelf98[終了ピクチャ番号] += CSelf97[開始ピクチャ番号] + 0

■変数操作: CSelf99[ピクチャ番号] = CSelf97[開始ピクチャ番号] + 0

■DB読込(ユーザ): CSelf20[X初期値] = ユーザDB[ ピクチャデータ : グリッド : 開始X座標 ] (1 : 4 : 6)

■DB読込(ユーザ): CSelf21[Y初期値] = ユーザDB[ ピクチャデータ : グリッド : 開始Y座標 ] (1 : 4 : 7)

あとはコモンの先頭でこのように定義してやれば、ピクチャの重なりや枚数で悩まずに済みます。番号の変更はデータベース上で完結し、コモン本体に手を入れなくて済むので後々ラクになります。

外部ファイル使用例

ストーリー部分のテキスト化

会話イベントは外部テキストファイルにすると便利。

@BGM9

@場面5

@人物5

旅の方よ、森を助けて¥nいただいたことに¥n深く感謝する。

貴方の旅の目的は?¥n……ふむ、世界を救う旅か。¥n崇高な目的をお持ちなのだな。

北の地で魔王が復活した¥nとのうわさも聞く。

微力ながら、¥n私もその目的を手伝わせて¥nいただきたい。¥nどうだろうか?

自分で制御文字を決めてテキストファイルに書き出すと、コモンやデータベースに書き込むよりは可読性高くなるのでおすすめです。

|■条件分岐(文字): 【1】 CSelf7[一行]が "@場面" が先頭にある

|-◇分岐: 【1】 [ CSelf7[一行] "@場面" が先頭にある ]の場合↓

| |■文字列操作:CSelf7[一行] =<の指定文字以降を切り出し> "@場面"

| |■変数操作: CSelf11[場面] = CSelf7[一行] + 0

| |■イベントの挿入[名]: ["小話場所名"] <コモンEv 44> / 1:表示 / CSelf11[場面]

| |■イベントの挿入[名]: ["小話場面"] <コモンEv 45> / 1:表示 / CSelf11[場面]

| |■イベントの挿入[名]: ["小話タイトル"] <コモンEv 43> / 1:表示 / CSelf0[小話番号]

| |■イベントの挿入[名]: ["暗転"] <コモンEv 74> / 0:消去 / CSelf21[場面切り替えウェイト] / 1:ロゴあり / 1:ウェイトあり

| |■

|-◇分岐: 【2】 [ CSelf7[一行] "@人物" が先頭にある ]の場合↓

コモン側はこんな感じで、一行切り出して制御文字だったら処理をする、平文ならセリフを再生する、のように組んでおけばOK。

コンフィグ・簡易システムセーブ・バージョン情報など、共通情報の管理

コンフィグなどはセーブデータごとに分けると変な気がするので、共通ファイルにしたほうがいいと思われます。

この例だと、起動したら外部ファイル【コンフィグ.txt】からBGM音量60を読み込み、ゲーム内コンフィグで60から30に変更してシステム変数に反映。ここから、

  • 保存するならコンフィグ.txtに書き出し

  • 破棄するならコンフィグ.txtから新たに読み込み

とすれば、変更前の一時保存変数を用意しなくても良いので多少すっきりします。これはSystem.savでもいいんですが、セーブデータ読み込みは多くなると秒単位で時間がかかる処理なのでテキストファイルが無難。

あとはロード直後に必ずコンフィグ.txtを読むようにすれば、どのセーブデータからでも同じ設定になります。