先日はウディタ上で鏡を実現する方法について書きなぐりました。
「キャラの座標をピクセル単位で取得する方法がわからない」とか「コモンだと呼び出し元の座標を求めるのが面倒」とか書きましたが、それらの問題はあっという間に解決しました。
たいていのことが出来てしまうウディタはすごいです。
数日がたち鏡が一応形になったので、ウディタ公式ページのコモンイベント集に投稿しました。
(追記、公開を取り下げました。詳細は次の日のページをごらんください。)
興味のある方は「鏡コモン」で検索して下さい。今日はそのコモンについてです。
用途が限定される部分が多いので、それを誰かが自分のゲームに合うよう改造しようとした時に、参考になる内容をここにに書きます。配布サイトでの説明や同梱説明書と重複する部分もありますが、ご了承ください。
原理としては、
「主人公と並列マップイベントが重なった時だけ、上のマスに鏡に映った画像を表示する」
そんなコモンです。
マップイベントが並列起動という所は特徴的かもしれません。
普通主人公の位置によってイベントを起動するには「プレイヤー接触」を使うことが多いかもしれませんが、今回は鏡の前から離れた事も判定しないといけないので、マップ内では常時監視が出来る並列起動を使いました。並列起動ならどこにあっても条件が合えば動いているのだから置く場所などどこでもいいようなものですが、コモンの導入を簡単にするために、鏡の下のマスの座標を指定するという役割もその並列イベントに持たせた結果、鏡の前に置くことになりました。
座標の重なりはピクセル単位で監視しています。だから半歩ずれていても映りません。正面に立ち止まった時だけ映ります。鏡の前を横切った時は映る時と映らない時があります。
半歩ずれて映らないことが不自然にならないように、中央を透過した鏡の枠素材を用意しました。鏡の枠はマップでなくイベントとして置く仕様です。
これはピクチャの表示順の都合で、鏡に映る像(以下、鏡像)を枠よりも下に表示させるための工夫です。
ちなみに枠はウディタにデフォルトで入っているタイルセットに追加しました。
イベントとして使うなら単独のキャラグラフィックでよかった気もしますが、はじめ枠をイベントとして使うことを想定していなかった時点で作りました。そして迷いましたがそのまま公開しました。
というのは、鏡は縦に二マス分のサイズがあるのですが、その上のマスは通常の使用ではマップタイルで十分だからです。どういうことかというと通常は鏡像は一つ上のマスにほぼ収まるので、枠が必要なのは鏡の下半分です。タイルに組み込んであれば鏡の上下の位置関係が一目でわかるし、マップとして使うかイベントとして使うかの選択の幅も広がるかと思ってタイルに入れたままを選んだのです。
鏡像にどのピクチャを使うか、正確には指定ピクチャの一部分をどのパターン番号で呼び出すか、その求め方がこのコモンの一番独創的な部分かと思います。
詳細は前回書いたつもりだったのですが、でもよく読むと全然説明していないので、ここにあらためて書きます。
「キャラの向き」×10+「アニメーション番号」+「鏡像変換定数」=「使いたいパターン番号」
となるような、「鏡像変換定数」という数値を求めました。これはキャラの向きに応じて8通りあります。
(なおこれは3パターン8方向の歩行グラフィック専用の数値なので、別規格で同じことをしたい方は、この乱文を解読して自作して下さい。まあメールで頼まれたら考えるかもしれません、が。)
上の式は左辺にも右辺にも同じアニメーション番号の数値を足しているので、
「キャラの向き」+「鏡像変換定数ダッシュ」=「使いたい3つのうちの左のパターン番号」
とかいうまた別の鏡像変換定数を出すこともできたかもしれませんが、けっきょくそれにまたアニメーション番号を足してパターン番号を求めないといけないのでややこしいことには変わりないので、一つの式にまとまるようにしました。
ちなみにこのコモンは、アニメーションの配置パターンがそろっているという前提で作っています。
3パターンアニメーションの場合、キャラ表示はキャラがある向きを向いていてそして3つのわずかに変化する画像を切り替え表示し続ければ問題はないので、配置順がどうあろうと構わないのです。仮に上中下という3つなら、上中下でも中下上でも(初期画像は違っても)同じなのです。けれどこのコモンでは上中下と中上下の混在は困ります。
主人公のアニメーションに同期した別向きの鏡像を映す仕様なので、主人公が上、鏡像が下ということになっては問題なのです。
まあ正直なところ、ぼくは3パターンがどう違うか見分けるような細かい神経を持ち合わせておらず、配布サイトにスクリーンショットを撮ったウルファールの歩行グラフィックについてもパターンが対応しているのかどうかも実は確認していません。(そもそもコモンの動作テストをしたウディタサンプルゲームでは主人公は歩かない時アニメーションしないので、鏡の前で立ち止まっても動かない)
そこで、もしも鏡に映った像とその前に立つキャラとがあまりに違う動きをしていて困るという場合は、鏡像変換定数周りをその変則的な歩行グラフィックに対応させる大改造が必要かもしれません。そんな方がいれば大変でしょうが応援します。
このコモンではとにかく使用者の導入の手間を軽減することを目指しました。コモンの自作はおろかマップイベントもテキスト表示しかできない、条件分岐もマップイベントの起動条件に頼り切っていた昨年夏の自分でも使えるようにしました。
そのためにコモンの引数指定を最大限に使いました。もっとも昨年のぼくはコモンの引数指定なんてできませんでしたが。・・・そうですね、その説明もするべきですね。
ここをごらんの初心者の方に説明します。(ここまで訳のわからないことを羅列したあとにどれだけの初心者がを読んでいるかわかりませんが。)引数指定というのは、コモンを呼び出す時にコモンに引き渡す情報のことです。コモン呼び出しを指定する画面でコモン名を見ただけでOKしてしまわず、[コモンEv入力(数値)]の下などでどんな設定ができるか気をつけてみてみて下さいね。
ぼくの鏡のコモンでは@鏡の通し番号、A鏡像の高さの補正、B鏡像の透明度、C鏡の下地になる画像をコモンに描かせるか、の、その4点を引数で指定できます。全てプルダウンリストで選択するだけで済むので簡単です。
その一方でこのコモンを改造しようとしている人には、これらの初心者への配慮がかえってコモンを理解しにくく、使いにくくしているだろうことは申し訳ないです。あらゆることが出来るウディタだから好きな設定が出来るのに、初心者の利便ために自由度が制限され、それを取っ払うために面白くもない他人の作った仕様を理解しないといけないというのは納得いかない部分もあると思います。そんなことするくらいなら全部自作した方がよほど早いと思うかもしれません。それでもぼくは今回はこのコモンは初心者でも簡単に導入できるということを目指したので、そのために不便を強いられる改造しようとする人にお詫びの気持ちを込めてここにできるだけヒントとなることを書いておこうと思っています。
引数@の通し番号というのは鏡の識別番号です。同じ番号のコモンから呼び出された鏡像および鏡の下地画像(後述)は同じピクチャ番号で表示されます。そのため複数の鏡を配置した時に、あるマップイベントに座標が一致しないために別のマップイベント上に立っていても鏡像が映らない現象が起きます。それを防ぐために鏡を複数置く場合は@を変えて下さい。言いかえれば鏡のチャンネルのようなものです。ちなみに上限は15枚ですが、ちょっとした改造で画面いっぱいに置くことも可能になると思うので、やってみたいけれどわからない方はメールで質問して下さい。
ABはそのままなので説明はいらないと思います。いろいろ試してみて下さい。ただ、鏡の枠をイベントにするのは普通下半分だけでいいと上の方に書きましたが、Aで高くする場合は枠を上下ともイベントにして鏡像より上層に描かれるようにして下さい。
Cの鏡の下地になる画像、これも導入の手間を減らす工夫です。鏡の下地、つまり枠の中・鏡像のバックは、灰色っぽければいいだろうからマップをタイルセットの机?の中央部分などにしてもらえばいいのだけれど、導入方法を説明する文章に「鏡の位置のマップの色は〜」と書きながら、わざわざやってもらうくらいならこっちで用意してしまおうと思いたち、<SQUARE>というピクチャを使って描いてしまいました。このピクチャ番号は鏡像の16倍にしていますが、それが15以下だと鏡像と番号が重複して不具合が起こりうるからです。
水面に姿が映る等の時にはCは非表示に設定して下さい。
最後にこのコモンの今後のバージョンアップなどの見通しなどについて考えてみたいと思います。
まず、画面サイズが320×240限定というのはこのコモンの汎用性を損なう大きな問題だと思っています。
できれば改善したいし、これはおそらくぼくの技術で可能なような気はしています。ただ需要があるかわからないので、もしも別サイズを希望するコメントなどがいくつかもらえたら考えようかと思っています。
ゲーム画面に映るパーティー画像がそのまま映らないのも大問題です。
現状では可変DBの「パーティーメンバー1」の画像しか映せず、複数パーティーやイベントがうろつくマップでは使えないという致命的欠点があります。
しかし「パーティー画像」設定ではパーティーメンバーリストにないキャラ画像も隊列に入れることが出来、その情報を保持している場所も見当がつかないのでこれが改善できる見通しは立ちません。
一番実現したいのは、連続鏡面壁の実現です。これはできそうな気もします。そもそもぼくは前回書いた文章でばれてしまったようについ最近までキャラクターの座標をピクセル単位で取得できるということを知らなかったので、そのあたりについてはこれから考えてみます。それが実現すれば、一番最初に目指した鏡面床ももうすぐそこです。
この企画はまだ続く!
追記
このコモン導入時の注意事項を書いておきます。
ぼく自身何度も「あれ?」とつまずいている部分なので・・・。
●●●●●鏡コモン導入時の注意点●●●●●●
・コモンを呼び出すマップイベントは並列起動!!!
・すり抜けの設定にはチェックを入れておく!!!
・鏡の枠はイベントとして設置!!!