進捗 「新」メッセージシステム編 #01

 obake   message system   progress   python 

「新生」メッセージシステムの誕生

内部バージョンを 075 へ昇格。メッセージシステム改修に伴い機能実装が進んだため。

メッセージシステムは大幅な改修が進行中。プロトタイプも含めて三回くらい作ったことになる。

結局現時点で分かったこと。

GMS/GML で文字列処理はツラすぎる

これ。

すっごく悪い効率。変なローカルルールと極一部よくわからない仕様かバグ。

CSV をパースするだけでも無駄が多く、ポインタ使わせてくれと何度も願った。効率を無視すれば基本機能は揃っているためやろうと思えばできてしまうのが GMS/GML だが、不効率なのでやらないほうが良い。

Python と CF25 で補助ツールの作成

それぞれ役割は別だが、まず CSV へのパース処理は Python でやれば効率的。GML に渡すデータはなるべくシンプルな形式にまとめ、GML になるべく仕事をさせないのがポイント。

メッセージシステム用マークアップ

メッセージシステム用のマークアップを作成した。可読性を良くして作業効率/生産性向上。マークアップの実用性は HUGO の利用で実証された。

ついでにコピペ作業を円滑に進めるため CF25 で GUI のメッセージ作成補助ツールも作った。

環境が揃いようやく円滑に作業できる。

作業手順一覧

テキストエディタでマークアップを使ってメッセージのソースコードを書く。HTML のソースコード感覚で書ける。改行も GML の専用形式へ自動変換されるので GML のローカルルールを意識しなくて良いという利点。

次にこのソースコードを Python でパースして CSV 形式へ変換。変換時に無駄な情報を全て省いて必要なデータのみになるため可読性が悪いけれど GML で処理しやすくなる。

Python で CSV 変換時、メッセージで利用されているフォント毎に文字を拾って集め、それをまとめて別ファイルへ保存。採集された文字リストは後に GMS のフォント作成で利用される。メッセージソースをマークアップで書く時にフォント指定を必須にしたのはこのため。スプライトフォントのマップ作りを効率化。

例えば以下は三つのスプライトフォント毎に利用されている文字をピックアップしたものだが、

フォント毎に利用される文字をリスト化

フォント毎に利用されている文字を抽出して正確なリスト化することで、各スプライトフォントが何文字使っているかを容易に把握できる。

フォント毎にリストはファイルとして保存される

フォントフォルダ

文字リストファイル

スプライトフォントは日本語を使うとテクスチャサイズが巨大になってしまうので、無駄な文字登録を減らすのと同時に文字登録数を常時把握することでサイズの調整が容易になる。

Python と連携で得たメリット

使う文字だけ確実に自動でリスト化できるようになった。

登録する文字が多くなりすぎたフォントに対しては新しく別フォントを作るなど、フォント毎にサイズ調整も可能になる。

GMS/GML のインターフェースからでもスプライトフォントは簡単に作成できるけれど、フォント毎に登録された文字数を知るためのインターフェースが用意されてない。Python でそれを補うのが当初の目的ではなかったが、結果的に Python との連携でこの不満は解消された。

デメリットが無い。

キャラクター表示機能

実装を急ぐ

メッセージシステムにおけるキャラクタの実装は Spine 形式が基本となる。

<Character.New xs=-1.0; ys=.0; x=.0; y=.0; fspd=.5; spine="obake"; id="TEST@"; anim="normal"; loop="false"; >

スプライトが全部 Spine 形式というわけでもないが、アニメーションについては全て Spine 形式が利用されている。

Spine 形式の利点は前にも述べたが、アニメーションパターンを増やしてもリソースサイズが小さいこと、テクスチャサイズに収まる範囲内でアタッチメントが利用できる、複数画像を1ファイルに収めて管理できるなど。

  • Character.New

  • Character.Change

  • Character.Kill

  • Character.Vanish

ここまで実装。Effect は 新しく Wipe を導入。キャラクター専用のシェーダなので使い方はやや特殊。現時点では破壊時のエフェクトとしてのみ利用できる。

Spine のキャラクタは複数の png 画像で構成されているため image_alpha を使うと各画像がそれぞれ透過してしまうため実質的にスプライトに Spine を使っている場合 image_alpha は使えなくなる。

シェーダのアルファを使っても同じ結果になったので透過率を使う消し方はトリッキーな方法しか実装が思いつかない。仕方がないのでスプライトキャラクタにはアルファを使った効果を利用しないことにした。その結果ワイプである。

ワイプ

新しく作ったシェーダは Shader 48 へ追加された。

実装と動作テスト

ここまで比較的順調に機能実装は進んだが、実装された機能に対するテストは遅れていた。

メッセージ用の文章はある程度大量でも対応できるように効率化進んだが、デバッグがそれなりに大変。マークアップで書かれたスクリプトソースには構文やエラーチェックが無いので、単純なミスを犯した時にも該当箇所を探したり直したりデバッグでは時間取られる。

マークアップの利用で可読性は良くなったけど単純ミスはどうしてもやってしまう。専用のツールを作ってもっと速く確実に書ける仕組みを妄想するが、実行にはとても移せず。

内部バージョンアップ

実装された一連の機能に対するデバッグも一応完了。安定版として 0075 を固定。

次回から内部バージョンをアップして 0076 とする。




次へ

前へ