2014年03月27日

ウディタ素材 鏡C

鏡が完成しました。
前回は左右反転技術の開発とか物々しいことを書きましたが、これもいつものごとくウディタではちょちょいのちょいだということが判明しました。何ができるのかくらい確認してから文章を書け、という気もします、我ながら。
その方法を教えて下さった方がいらっしゃり、本当に助かりました。ありがとうございます。
それに合わせて、目標だった鏡面床も一応完成させることが出来ました。
二つ合わせてセットにして、ウディタ公式コモン集にあらためてアップしました。
必要な方はそちらで「鏡コモンセット」で検索してみて下さい。


鏡面床.jpg
 ↑
(これは鏡面床コモンの使用例)


鏡コモンの原理については前と変わった部分も多いので、ここで説明します。
前々回の記事を書いた時点まで、ぼくは鏡像の表示座標は鏡の中心じゃないといけないと思っていました。
そのために「半歩かぶっても映りません」とか書いて、枠を作ってごまかしたりしたのですが。
どうしてそんな考えにとらわれたかというと、それはきっと最初にぼくがキャラ座標はマス目でしか取得できないと勘違いしていたからです。
そして、鏡の起動条件ということをすごく狭く考えていました。
鏡に映すんだから鏡の前に立った時だけ起動しないといけない。主人公が鏡の前に立っているかどうかを常に判定しないといけない。
そういう思い込みがありました。
でも、発想を変えれば違う方法がありました。像は常に表示するんです。ピクチャ表示は常にしていて、鏡の前に来た時だけ、そのピクチャがモニターに現れるようにすればいい。
そのためにはピクチャは常にマップの下(イメージとしては地底)に表示し、鏡部分にはマップチップを置かないよう(イメージとしては深い穴)にすればいいと気付きました。

これに気付けたのは、鏡面床を視野に入れていたからかもしれません。
鏡の前に立つだけなら、起動条件は「点」つまり0次元でいいんですよね。
でもその鏡を横にたくさん並べて、鏡面壁を作ろうとしたら起動条件は「線」、1次元になる。
直線上にいる時だけ鏡が起動するということですね。
そしてどこでも鏡を使える状態、すなわち鏡面床を考えれば起動条件は「面」2次元です。
範囲内の床の上ならどこにいても鏡が起動しないといけない。
いつでもどこでも鏡を起動していればいいんです。その鏡面床の範囲の条件指定(座標がナンボからナンボまで)を考えるのが面倒だったので、マップチップの重なりを使って鏡のない所でも地底に表示することを思いつけたのです。
それによって、鏡面床と、半歩の重なりで半身が映ることと、やりたかったこと2つを一挙に実現できました。
常時起動なので導入もずいぶん簡単にでき、コモンを読み込ませるだけになりました。

この発想の先にあるものは起動条件3次元の鏡かな、とか考えたのですが、ちょっと思考の限界を超えました。
ウルファールを万華鏡の底を歩かせたりジャンプさせたりし、斜め上視点から周囲の壁に移る像の変化を楽しむとかがそれに該当するかもしれませんが、需要も魅力もなさそうだし技術もおよばないので、2次元で満足することにします。

あと残るは肝心の左右反転です。
ウルファールのキャラチップセットとにらめっこして考えた結果、立ち鏡に映る全ての像には左右反転処理が必要とわかりました。
また、それに使う反転前画像は、このブログの「鏡@」で書いた鏡像変換定数では求められないことがわかりました。
そこで新たに別の鏡像変換定数を求め直しました。
そして問題の左右反転方法ですが、上に書いた教えてもらった方法は画像の横拡大率を−100%にするというものでした。
そんな便利な方法があると知らなかったぼくが考えていたのは、表示ピクチャを横幅1ピクセルごとのタテ線として考え、その配置を左右逆に並べる方法です。最近使えるようになったループを駆使して、それもまたなんとか実現できました。
またそれとも別に、画像変形という処理でも可能と分かりました。

ただそれら3つの反転方法には共通の問題がありました。
鏡像を表示しながらキャラを横に走らせた時、少し遅れてついて来るのです。
気にならないと言えば気にならない程度なのですが、やはり鏡の像がずれているのは問題です。
常時起動のイベント内で常に反転画像を表示し直しているので、負荷が原因かもしれないと考えました。
そこでピクチャ番号をマップチップより大きくしてみたり画面外からの移動での表示を試したり、いろいろしたのですが・・・。
結局ズレの理由はわかりませんでした。負荷は関係ないかもわかりません。
しょうがないので荒技ですが、キー入力を監視して横キーが押された時だけ、移動方向に2ピクセル進んだ位置に表示するようにしました。これでぴったりそろいました。反転方法はせっかくだから教えていただいたやり方を採用しました。
そろったのを見て驚いたのですが、そろうときれいです。上下で同じ象が同時に同じ動きをすると、ほんの少しずれているのと全然違います。前にアニメーションの変化はほとんど意識していないと書いたぼくですが、アニメーションがそろっているのもはっきりわかるくらい、上下の像は完璧に動いてくれました。そろうように悩んで手間をかけたかいがありました。

ちなみに上下の移動時もズレはあるようです。けれどそれは気にならなかったので手は加えませんでした。キャラが上に移動し止まった直後、鏡像はわずかに上に移動します。まあこれは急ブレーキによってキャラの体の角度が変化したことによる映り方の変化だととれる程度だし、それはそれでいいかんじと思いました。

地面に穴をあける仕様なので、ウディタでは遠景を設定しなければ穴の底は漆黒の闇なので、鏡のベースになる画像を用意して鏡像のさらに下に常時表示させることにしました。キャラが画面上のどこにいても画面端の鏡が黒くならないように、画像の幅は画面サイズの2倍以上にしました。
キャラクターはマップ上をのんきに歩いているように見えても、地底では自分の鏡像と画面サイズ以上の巨大な鏡をどこに行くにも連れ歩いているのです。それはマップに掘られた深い穴のほとりにさしかかった時だけかいま見えるという仕組みです。

壁用の立ち鏡と鏡面床との違いは、映る像の向きが違うのはもちろんですが、そのもととなる使用グラフィックも違うということがわかりました。鏡面床の場合は画像の選定は全く簡単で、その瞬間のキャラのグラフィックをそのまま使えばいいんですよね。
だからこれは鏡像変換定数というのはおかしいかも知れません(変換はしていないので)。
けれどもキャラが現在使用している、歩行グラフィックのパターン番号(アニメパターンでなく)を簡単に取得する方法は見当たらなかったので、ここはやはりキャラの向きとアニメバターンから割り出す数値が必要でした。

これは前からですが、鏡像変換定数は並列のコモン内で入力させています。つまり一度入力させればすむものですが、毎フレーム同じ数値を8つも読み込み直してくれているようです。そのおかげでデータベースなどを使わずにすみ、導入がずいぶんしやすくなっています。ウディタには無茶苦茶にこき使われてもらって感謝しています。

さて公式コモン集に公開した「鏡コモンセット」には立ち鏡と鏡面床と二つのコモンを入れているのですが、その二つは基本的には併用できません。同じマップで両方使いたい方は改造が必要です。改造のヒントは一応配布フォルダ内にテキストで書きましたが、2種類の鏡の起動を制御する方法はマップ構造によってケースバイケースだと思うので、一概には何とも言えません。遠景使用についても同じです。相談いただければ時間が許せば一緒に考えようとは思います。

これでほぼ目指したものはできたわけですが、個人的にはせっかく思いついた手動で画像を反転させる技術を何かに生かしたいと思い考えたのですが、キャラ画像を線単位で操作できるわけだから、これを使えば例えばキャラの下3分の1とかを表示できます。生首!とかもできますが、一度やってみたいのは水面に映るキャラの像です。鏡面床コモンを使っただけでは、キャラの全身が映るので、岸辺が崖などになっている場合に崖に映ってしまうのです。表示位置は調整できますが、足の影が足からあまり離れた所から始まっていると違和感があるだろうし・・・。そこでピクセル単位で表示部分を指定出来れば、と考えています。

本当はそれより何より目指したいのは、複数パーティーの二人目キャラや通行人も映る鏡を作ることなのですが、どうしていいかわからないので、ここをお読みの方でもしアイデアがあればぜひ教えてもらえればと思います。
長文が続いた鏡シリーズでしたが、とりあえずいったんこれで終わります。長々読んで下さったあなた、どうもありがとうございました。

ラベル:ウディタ
posted by じゃ。 at 00:15| Comment(7) | ウディタコモン・素材 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
こんにちわー

さっそくウディタコモン集のサイトからダウンロードさせていただきましたよ。
当方が製作中のゲームで使うかどうかは未定ですが・・・

自身のゲーム専用のコモンであれば、いくらでも凝ったものが作れますが、
万人に共通して使用できるコモンを作るとなると、
どうしてもセルフ変数を活用しなければならないようですね。
製作の裏側には、こんな苦労があったとは・・・・・。
表示座標を管理する関係上、鏡の対象となるのは主人公のみで、
さすがにドラクエ式の隊列パーティのキャラまでは
難しかったようですね・・・
本当にお疲れ様です。
Posted by HNアルボース at 2014年03月27日 05:39
ありがあとうございます!
さっそく落としてもらえて、作ったかいがありました。こんな長文に目を通してもらったことも、ありがとうございます。
Posted by じゃ。 at 2014年03月27日 22:10
公開おめでとうございます。早速試させてもらいましたが、いい感じです。僕にはないアイデアでしたので新鮮です。

Posted by sakuea at 2014年03月28日 22:02
sakueaさん、はじめまして。
コモンを試してもらいありがとうございます!
こんなに反応もらえるとは思っていなかったのですごくうれしいです。
もっとどうしたらいいとかアイデアがもしあればまた教えてください。
Posted by じゃ。 at 2014年03月30日 00:43
っていうか、sakueaさんってまさか・・・?
このコモンでお世話になった???
あ、いえ、まあなんでもないです・・・。
Posted by じゃ。 at 2014年03月30日 00:47
素敵なコモンですね!思わず速攻で落としてしまいました!!
そして実際に組み込んでみて「ああ、なるほどそういう仕組みで顔が映るんだなぁ」と大変勉強になりました
説明にも書いてあり読みましたが、今制作中のゲームがちょうど640*480で作っているため動作しなくてちょっと残念でした…w

やはりツクール規格の影響もあって640*480で制作を始められる方も多いと思うんですよね
640*480バージョン制作のご予定はないでしょうか
自分で改造してみようと試みたものの、プログラムテク及ばず撃沈でした^皿^;
Posted by しゃぼてん at 2014年05月27日 12:01
しゃぼてんさん、コメントありがとうございます。コモンを見てくれてありがとうございます。
半月も気づかずすいません・・・。

640×480を考えてみたのですが、規格がまちまちなのが悩みの種ですね。
試しに、4方向3パターン、キャラサイズ32×48の場合をやってみます。

もし使用素材の規格や、鏡(壁用)か鏡面床どちらが希望か伝えてもらえれば対応します。
メールに連絡いただければ早く対応できるかもしれません。
貴重なご意見をありがとうございます。
Posted by じゃ。 at 2014年06月12日 14:17
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: