見出し画像

easy FPS editor備忘録 10:破壊表現とパーティクル


2024年6月のEFPSE近況

現在、EFPSE開発担当のClarkはこれまでのようなエンジンの正式版ごとの更新を停止し、Bleeding Edge Buildsと称したテスト版をGithubを通して公開している。
色々新機能やバグ修正を盛り込みつつそれにより生じた新たなバグの修正にも奔走し、正式版ではないながらも1ヵ月近い期間の間更新が続けられている。
正式最新版である1.11はまだ登場していないものの、マップの高さ制限が9から64に大幅アップしたり懐中電灯の設定が多彩になったりと色々とパワーアップすることが確定しており期待大だ。



パーティクルによるゴア表現

古くは『Slatra』などでも実現されていた、Easy FPS Editorのパーティクルによるゴア表現。旧版の時代からごく一部の上級ユーザーはマスターしていたものの、画像選択の仕様が謎にめんどくさいという理由で永らく一般ユーザーには浸透していなかった。

パーティクルコマンドは以前の備忘録でも書いたステートマシンで用いられるコマンドの一種で、これでパーティクル画像を読み込んで任意の座標に任意の速度で表示することでメガドラとかネオジオめいた破片や血液のばら撒きを表現することが出来る。が、このパーティクル画像は後述のカスタムパーティクルとは違いキャラクタースプライトに追加する形式になっているという妙な仕様があり、追加するのがちょっとめんどくさいという問題がある。

順序を簡単に表すと、
1・通常の手順でエディター上で敵を作成する
2・すると『Enemies』フォルダ内に番号付き敵グラフィックが生成される3・破片グラフィックを作り、敵グラフィックの最後の1枚として追加する
4・敵のステートマシンを作成する
5・ステートマシンの画像読み込み数を1枚増やす
6・パーティクルコマンドを配置し、増やした最後の1枚を使用する
となる。


エネミー画像に破片画像を加える

PARTICLES imageindex i,l,x,y,z dx,dy,dz - creates particles. imageindex - number of sprite loaded, i - number of particles, l - particle lifetime, x,y,z - coordinates. Coordinates are local to enemy or player, meaning that 0,0,1 will always be in front of enemy or player. x - side offset, y - vertical offset, z - forward offset. dx,dy,dz - particle velocity. Also local to entity.

easy FPS editor Wiki

どういうことかというと、例えばememyAという名前のキャラをエディタ上で作成してスプライトを割り当てすると、enemyA0からenemyA12までの名前が付いたキャラクタースプライトがプロジェクト内のEnemiesフォルダに生成される。
パーティクルを使用する際はこれらに加えて破片の画像をenemyA13として追加し、FSMを作成するときにそれを読み込ませるという方式だ。


pistolmanと言う名前のキャラを普通に作った後、13番目に破片の画像(ちまい)を追加した。

この際、キャラクター画像をドット絵ではなく高画質素材にしてエディタ側でサイズ調整している場合でも、それを前提にしたデカめの素材サイズにしてはいけない。パーティクル画像として読み込まれる際は画像のサイズが調整されず、なおかつ画像の中心が基準となる位置に設定されているので、画像の縦横サイズが1000pxとかの画像を使用している場合は日の丸弁当の梅干しよりも二回りぐらい小さい破片画像にしないとデカすぎて違和感が出てしまう。

ステートマシンで破片画像を読み込み、コマンドでばら撒く

image pistolman 0 13

(中略)

state DEATH DEAD 0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 64,128,0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 -64,128,0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 256,128,0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 -256,128,0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 64,128,0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 -64,128,0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 256,128,0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 -256,128,0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 512,128,0
frame 9 0.001 0 0 0 PARTICLES 13 1,5,0,24,0 -512,128,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

(後略)

pistolmanのステートマシン

まず1行目で読み込むpistolman(今回使う敵の名前)のimageを0~12ではなく0~13にする。この13番目が今回追加した破片画像だ。
そして死亡時の処理を司るstate DEATHの部分にPARTICLESコマンドを挿入する。「13」の部分が読み込む破片の画像、その後ろがそれぞれパーティクル数、パーティクル表示時間、パーティクル出現位置xyz、パーティクル射出速度xyzとなっている。
その後にあるframe9から11の部分は基本FSMと同じく通常の敵死亡アニメーションだ。

完成

これでもかなり破片がデカいので要調整だが、とりあえずメガドラとかネオジオとかでありがちな破片撒き散らしアニメーションができた。
敵がモンスターの場合、これを血液や肉片にすればBuild engineゲーやquakeなどにあるような強めのゴア表現が出来る。
注意すべきなのは、破片画像サイズは小さくすること、基準点となる中心に破片を配置することの二点。あとは画像追加とステートマシンのコピペだけでどうにかなる。


カスタムパーティクルによる環境表現

共用パーティクルフォルダに塵画像を加える

EFPSEにはパーティクルコマンドのほかにカスタムパーティクルコマンドというものが存在する。
通常のパーティクルコマンドで使用する画像は上述のように敵の画像に追加する形で読み込むが、カスタムパーティクルコマンドで使用する画像は共用のPrticlesフォルダに追加する形になる。
今回作成するのは環境パーティクルなので、とりあえずParticlesフォルダ内のblood.pngを流用。コピペしてファイル名を『Custom0.png』にする。

作業の順番としては、
1・普通に装飾物を作成し、画像比率を0にして見えなくする
2・Particlesフォルダに任意のパーティクル画像を作成
3・装飾物のステートマシンを作成する
4・ステートマシンの2行目でカスタムパーティクルを読み込む
5・IDLE部分にカスタムパーティクルコマンドを配置する
となる。

別のカスタムパーティクルを追加する時はCustom1、Custom2という感じで追加していく


ステートマシンでカスタムパーティクルを読み込み、コマンドでばら撒く

環境パーティクルは常時ばら撒く形なので、敵ではなく装飾物を使用する。
とりあえず今回は『Env』という名前で装飾物を作成。エディタでの識別用に画像は用意するが、画像サイズは0にすることで実質透明状態にする。
次に装飾物Env用のステートマシンを作成。

image Env 0 3
image particles 0 0

state IDLE NONE 0
frame 0 0.025 0 0 0 NONE
frame 0 0.025 0 0 0 SETVAR p1 RANDOM(-200,200)
frame 0 0.025 0 0 0 SETVAR p2 RANDOM(0,200)
frame 0 0.025 0 0 0 SETVAR p3 RANDOM(-200,200)
frame 0 0.025 0 0 0 CUSTOMPARTICLE 0 6000 $p1,$p2,$p3 0.005,0.003,0.001 0.08 0.01
frame 0 0.025 0 0 0 SETVAR p4 RANDOM(-200,200)
frame 0 0.025 0 0 0 SETVAR p5 RANDOM(0,200)
frame 0 0.025 0 0 0 SETVAR p6 RANDOM(-200,200)
frame 0 0.025 0 0 0 CUSTOMPARTICLE 0 6000 $p4,$p5,$p6 0.005,0.003,0.001 0.08 0.01
frame 0 0.025 0 0 0 SETVAR p7 RANDOM(-200,200)
frame 0 0.025 0 0 0 SETVAR p8 RANDOM(0,200)
frame 0 0.025 0 0 0 SETVAR p9 RANDOM(-200,200)
frame 0 0.025 0 0 0 CUSTOMPARTICLE 0 6000 $p7,$p8,$p9 0.005,0.003,0.001 0.08 0.01
frame 0 0.025 0 0 0 SETVAR p10 RANDOM(-200,200)
frame 0 0.025 0 0 0 SETVAR p11 RANDOM(0,200)
frame 0 0.025 0 0 0 SETVAR p12 RANDOM(-200,200)
frame 0 0.025 0 0 0 CUSTOMPARTICLE 0 6000 $p10,$p11,$p12 0.005,0.003,0.001 0.08 0.01
frame 0 0.025 0 0 0 READY

(後略)

装飾物Envのステートマシン

一行目では通常通り装飾物本体の画像を読み込み、二行目ではimage particlesを使用してParticlesフォルダ内に入れたカスタムパーティクルを読み込む。
コマンドは「何番から何番まで」という方式で読み込むため、読み込むパーティクルがCustom0.pngであれば『0 0』、読み込むパーティクルがCustom1.pngであれば『1 1』、Custom0からCustom5まで使うなどであれば『0 5』などの表記になる。

state IDLEの行では通常時にどういう動きをするかを書き込むことができ、今回はここにカスタムパーティクルコマンドを配置することで常時動かすようにしている。
まずSETVARコマンドでランダムな変数を取得し(カッコ内は変数の上限と下限を示している)、次に得られたx,y,zのランダムな座標にカスタムパーティクルを表示する。これで装飾物Envの周囲のランダムな地点にカスタムパーティクルが舞うようになる。

完成

デフォルトの血液画像を用いたので、血液が大気中を飛散する環境パーティクルができた。
量などは増やすことができるが、エンジン側で最大パーティクル数が64個と決まっているので増やしすぎても意味がない。大量に設置しても、環境内の数が64個を超えた場合は出現後すぐに消滅する。


パーティクルコマンドを駆使することで敵の撃破演出をリッチにしたり、マップの環境をリッチにしたりといった工夫ができるようになった。無い時よりも格段に倒した感や気持ち良さ、臨場感などが色々と増すので、労力があれば採用すべきテクニックだろう。

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