見出し画像

easy FPS editor備忘録 7:ステートマシン

2022年11月末現在、EFPSEでは特にアプデもなく、重大なバグが残ったまま放置されている。非公式wikiの作者は失踪し、彼の主催したEFPSEゲームジャムは第一回の開催以降音沙汰がない。

「デカいゲームを作ろうとして失敗するより、小さいゲームを完成させ続けろ」と数多くのクリエイターが言う。
作品を完成させるスキルというものは作品を完成させることでしか得られないわけで、ド正論言われてはいそうですねと納得するかどうかは置いておいて絵でも音楽でもゲームでもそういう思考はマァ正しいのだという実感がある。
「俺はCoDを作りたいんだ」と叫びながら失敗して破滅する自由ももちろん保障されているし、そうやって毎年数多くの学生がマルチプレイFPSゲームを作っては自滅していく。どう生きて何を作るかは自由だ。

11月末のある日、「3分ゲーコンテスト(プンゲ)」なるものをフォロワーがやっており、新たに非公式discordが開設されたという情報を耳にした。本家EFPSEのコミュニティは一向に盛り上がらないままだし、どうせなのでそれに向けて既存素材を流用しつつ何か作品を出すことにした。緩い制約のある場に身を置くことで、作品を完成させるスキルを得ようというわけだ。

たまたま決意した翌日がほぼ休みみたいな日程だったので、朝っぱらからグラフィック作成作業を開始。やっつけテイストでEFPSEをこねくり回し、ストップウォッチ片手に「3分でクリアできるFPS」を作り続けた。

そうして約1日でウルトラウォークが完成した。

すぐ殺せてすぐ死ぬ、ローリングサンダーのゲームスピードを模倣しようとしたピーキーな内容。が、移動速度を上げるとまずドアを、上げすぎると壁を貫通するバグに遭遇してしまったので、現在は常識的な範囲にまで下がっている。
移動グラフィックをドラクエ3のような二枚足踏みで済ませ、破壊可能オブジェクトのグラフィックも流用し、敵も色変えで済ませる。酷い出来だが、別にそれで良いのだ。完成させれば良いのだ。

とりあえず武器と敵とタイルが揃えばゲームになるEFPSEは、短時間の2DFPS作成用としてはかなり優秀だ。問題は拡張しようとするとすぐバグにぶち当たる事だが。

ステートマシンを使おう

EFPSEにはステートマシンという機能が搭載されている。
EFPSEではエディタ上のみでキャラ画像の設定が可能だが、枚数が固定されているためヌルヌルしたアニメーションや特殊な行動を取る敵などを作ることができない。そういったキャラクターアニメーション等を独自に設定できるのがこのステートマシン機能で、使うと敵の待機モーションを変化させたり武器のリロードアニメーションを実装したりと色々表現の幅を広げていくことができる。


pistolman用のステートマシンファイル。


作成の方法は大体スクリプトと同じで、作成中のプロジェクトの「states」フォルダ内にテキストファイルを作成してステートマシンを記入した後、ファイル名をそのステートマシンを適用したい敵/武器の名前に書き替え、拡張子を.statesにするだけ。

このステートマシン機能、今も尚英語マニュアルから省かれており、非公式wikiにすらも永らく記述がなかった謎の機能だ。唯一の記述はロシア語の本家マニュアルに書かれており、EFPSEのプロはこれを翻訳することでステートマシンを使用している。
こんなことしてないで普通にアンリアルエンジン学んだ方が早いな。

恐らく現在敵に適用されているであろう基本ステートマシン

image Enemy 0 12
state IDLE NONE 0
frame 0 0.125 0 0 0 NONE
frame 0 0.125 0 0 0 READY

state CHASE NONE 0
frame 1 1 0 0 0 NONE
frame 2 1 0 0 0 NONE
frame 3 1 0 0 0 NONE
frame 4 1 0 0 0 READY

state ATTACK CHASE 0
frame 5 0.25 0 0 0 NONE
frame 5 0.25 0 0 0 NONE
frame 6 0.0625 0 0 0 NONE
frame 6 0.0625 0 0 0 ATTACK
frame 5 0.25 0 0 0 NONE
frame 5 0.25 0 0 0 READY

state HURT WALK 0
frame 7 0.125 0 0 0 NONE
frame 8 0.125 0 0 0 NONE

state DEATH DEAD 0
frame 9 0.166 0 0 0 NONE
frame 10 0.166 0 0 0 NONE
frame 11 0.166 0 0 0 NONE

state DEAD NONE 0
frame 12 0.125 0 0 0 NONE
frame 12 0.125 0 0 0 NONE

「state」で表記される敵の状態(立つ、歩く、攻撃、死など)と、「frame」で表記されるそのstateで表示するスプライトの表示時間や枚数の二種類で構成されている。
更に「NONE」の部分には専用コマンドが使用でき、そのframeを表示している時に変数を足したり、音を鳴らしたり、「DEATH」stateに強制移動してそのキャラを殺したりといろいろできる。
元々WALKだった状態表記がCHASEに変更されたりと色々旧ロシア語マニュアルからの変更も多い部分で、普通のゲームを作るだけなら必要ないものの早い所正しい情報の記載されたマニュアルが欲しくなるところ。

構造

一行目から見ていく。

image Enemy 0 12

imageコマンドを使用して「Enemy」という名前の一連の画像(Enemy0.pngからEnemy12.pngまで)を呼び出して登録している。
これがpistolmanとかそんな名前ならまず最初にSprites/enemiesフォルダに「pistolman0.png」から「pistolman12.png」までの画像を用意し、「image pistolman 0 12」と記述する。
新しい画像を1枚追加したい時は「pistolman13.png」を作成し、「image pistolman 0 13」に変える…といった具合だ。

効果音はこれとは別で、「sound」コマンドを利用して一個づつ作成する。例えば「pistolmanAttack.wav」という名前の効果音を作成してSoundsフォルダに入れておき「sound pistolmanAttack」という記述を加えれば、攻撃効果音の登録が可能となる。

攻撃前チャージ音を鳴らす

ウルトラウォークのピストル男は一撃必殺キャラなので、攻撃までの猶予がある程度欲しい。遠くからでは攻撃タイミングが判別しにくいので、チャージ音の後に発砲させることで事前に避けられるようにした。

まず最初に画像と効果音の登録。

image pistolman 0 12
sound charge1
sound charge2
sound charge3
sound pistolmanAttack
sound pistolmanAct
sound pistolmanDeath

画像13枚(frame0~12)と効果音6つ(sound0~5)の登録を最初に済ませる。
次に攻撃時のステートメントを弄る。

frame 5 1 0 0 0 SOUND 0
frame 5 1 0 0 0 SOUND 1
frame 5 1 0 0 0 SOUND 2
frame 6 0.0625 0 0 0 SOUNDANDATTACK 3
frame 5 0.25 0 0 0 NONE
frame 5 0.25 0 0 0 READY

「NONE」だった部分に「SOUND」コマンドとサウンド番号を記述し、1フレームから3フレーム目まではframe5の画像を各1秒間表示させながらチャージ音1→2→3を鳴らしている。攻撃時にはframe6を0.0625秒表示しながらSOUNDANDATTACKコマンドを利用して音3を鳴らしつつ発砲させる。
これでチャージ音を出した後に攻撃を行うキャラを作成できた。

ゲームを実行してみる

良い感じ。

この記事が気に入ったらサポートをしてみませんか?