神無月サスケの波瀾万丈な日常

神無月サスケのツイッター(@ktakaki00)を補完する長文を書きます。

ムンホイXPの地味な技術:はじめに

さて、今年の初めてのエントリは何にするかと悩んでいましたが、昨年大晦日、つまり昨日結果が公表された、フリゲ2011のコメントを見て思ったことがあります。

それは、ムンホイXPが好評をいただいたのは嬉しいですが、その中には、結構、それを地味に支えている技術があってのことだということです。

これまではこういうことは黙ってきたのですが、せっかく本作はRGSSのソースを公開しているのだし、もっと皆に参照してもらうためにも、また、皆さんの創作で僕の技術を参考にしてもらうためにも、こういう技術というのは独り占めせずに、公表して共有していくべきかな、と思い始めたので、紹介して行きます。

最初に:本稿で扱わないムンホイXPの分かりやすい技術

まず最初に。ムンホイXPで導入した技術の中でも、結構分かりやすい技術や、「よそがやっているだろう」的な技術は、本稿では紹介しません。

例えば、以下のものです。該当するクラス名などを紹介しておきますので、興味がある人は、RPGツクールXPスクリプトエディタで該当するクラスなりモジュールなりを見てください。

隊列歩行

RGSS3(RPGツクールVX Ace)では標準搭載された隊列歩行ですが、本作でも搭載されていました。RGSS3では Game_Follower というクラス名でしたが、本作では Game_SubPlayer という名前になっていました。正直、メカニズムは一緒なので、興味のある人は、RGSS3を見るほうがいいと思います。

敵が出ますアイコン

エンカウントする場所に行くと、画面の右上にモンスターのアイコン「敵が出ますアイコン」が出ますが、これは Game_AttentionIcon クラスを作成して実現しています。具体的には Game_Picture クラスをオーバーライドし、イベントコマンド的にも、ピクチャの1番として操作できるようにしています。実装は驚くほどシンプルなので、そのクラスを見て、納得していただけれと思います。

主人公が物陰に隠れたとき、ダッシュ中は半透明で表示

本作は現代物ということで、ビルなどが多く、必然的にキャラのスプライトが物陰に隠れることが多くなります。そんなとき、操作が不便にならないように、とダッシュボタンを押している間は、半透明で主人公(先頭のキャラ)のいる場所を表示するようにしています。

この「半透明で主人公(先頭のキャラ)が表示される」という仕組みですが、実は仕組みは至って簡単です。「ダッシュキーが押している間だけ、先頭のキャラ(Game_Player)をZ座標999(=最前面)に、透明度128(=半透明)で表示」という風にしているのです。

つまり、常に半透明キャラは表示されているわけですが、物陰に隠れていないときは通常のキャラが見えており、物陰に隠れて先頭のキャラの表示が消えたときだけ、半透明に見える、というわけです。

この半透明キャラをゴーストと呼んでおり、実装は Sprite_GhostCharacter クラスを作成し、実装しています。これは Sprite_Character のサブクラスなのですが、内部的に別の処理をするため、Sprite_Character2 というクラスを挟んでいます(ビューポート区分という概念を導入したため)。いずれにせよ、実装は非常にシンプルですので、実物を見て確認してみてください。

ダッシュキーを押している間の戦闘高速化

戦闘中、ダッシュキー(ボタンA、すなわちShiftやZ、パッドのボタン1など)を押している間、戦闘が高速に進みます。これは結構愛用した人が多いのではないでしょうか。

これは、RPGツクール95、すなわちオリジナルのムンホイの戦闘でも、Shiftを押すと高速化出来たこともあり、スーファミ版の「メタルマックス2」のあるモードの高速戦闘に想を得て、作ったものです。

これは、Scene_Battle クラスの中を書き換えることによって実装しています。ムンホイXPでは、戦闘画面などを切り替えていないため、このクラスに大きく手を加えていないのですが、この処理実現のために、インスタンス変数 @wait_count の亜種 @rough_wait_count を追加しています。

@wait_count は、1フレームごとに1ずつ値を減らし、0になったら次のフェーズ(処理)に移るという、強制的にウェイトを取るものでした。今回追加した @rough_wait_count は、「特にキーが押されていない場合は @wait_count と同様だ(1フレームごとに1ずつ値を減らす)が、ダッシュボタンが押されていたら即値を 0 にして、次のフェーズに移る、というものです。

実際の処理は、もう少し込み入ったことをしているため複雑ですが、基本的な考え方として以上を覚えていてくれれば差し支えありません。詳しくは Scene_Battle#update の中に記述されています。

あとは、地道に @rough_wait_count と @wait_count のウェイト数調整を行い、自然なフレーム数にしたのですが、この調整が結構大変でしたが、まあその見えない努力の結果、ダッシュしている場合もそうでない場合も、自然なウェイト数になっていると思います。

まとめ:本当の技術は、技術を施したことを悟られないものである

以上、目で見て分かるムンホイXPの(地味な)技術を紹介しました。ムンホイXPは画面のレイアウトも変更していないし、その他の演出も追加しておらず、全体的に地味です。しかし、さらに地味な技術が本作を支えています。

僕は敢えて技術を見せ付けることはしませんでした。むしろ、「技術というのは、プレイしている人が、それが施されていることを気づかないようにしてこそ本物」という考えから、むしろ黙ってきました。演出をいちいち追加するような「どうだ、俺すごいだろう」的技術は、正直悪趣味だと思っています。このため、全体的に地味で地味で仕方がないのですが、それでもプレイした人は「なんだかわからないが、取りあえず悪いとは思えない」という不思議な感覚に陥ったと思います。それを支えているのは、「気づかない、地味な技術」に他なりません。

僕はこのノウハウを内緒にしておこう、あるいはソースを解析した人だけの特権にしておこうと思いましたが、RGSS3の時代になっても、僕が蓄積した技術は有効であるばかりか、より一層重要性を増している気がしたので、僕一人のものにするのではなく、皆で共有してもらいたいと思い、公開することにします。