【ウディタ】画面中央の位置を任意の座標に調整する


私よ、レビニアよ。

タイトルから内容がいまいち分かりづらい今回の解説。どういうお話かというと、


どこかで見たレイアウト。こういう常に固定ウィンドウが表示されたレイアウトで進行するゲームを作りたいとしましょう。

普通に右と下にウィンドウをピクチャ表示させればOKかというと、もちろんそれだけでは×よ。

この状態で主人公を移動させて画面スクロールしてみると、


こういうことになってしまう。わかる?

スクロールの基準位置、つまり画面中央の座標は当然「画面の真ん中」よね? この例で言えば画面サイズが320×240だから、中央はその半分のX160×Y120になるわね。

でもこのレイアウトでゲームを作りたいのであれば、


画面中央はここ、移動したときにここを中央としてスクロールしてくれないといけないわよね?(この例ならX120×Y90)

このように、本来の画面中央とは別の座標を画面スクロールの基準位置に調整するにはどうすればよいか、というのが今回の解説よ。

画面中央の位置を調整する方法

やり方は簡単。並列実行で画面スクロールをかけ続けることで実現できるわ。


まずは画面スクロールを停止させる。
→■画面スクロール:スクロールロック

※ゲーム開始直後から調整してしまいたいなら、タイトル用イベントでやってしまっていいわ。


画面スクロールの停止は「エフェクト」コマンドから実行できるのよ。


そしたら並列実行のコモンを新規作成。名前は「スクロール位置調整」とでもしておくわ。


まずは主人公の画面座標を取得。変数操作+を使うのよ。
→■変数操作+: CSelf10[中央X] = 主人公 の 画面X座標
→■変数操作+: CSelf11[中央Y] = 主人公 の 画面Y座標


そして取得した座標から中央にしたい座標の値だけマイナスする。
→■変数操作: CSelf10[中央X] -= 120 + 0
→■変数操作: CSelf11[中央Y] -= 90 + 0

後に使う「画面スクロール」は「今の位置から画面を右と下にスクロールさせる」というコマンドで、マイナスの値なら左と上にスクロールさせることができるの。

今回は「普段より左上に中央座標をズラす」ことになるから、主人公の画面座標から基準とする座標の値をマイナスすることで任意の位置に調整することができるのね。わかる?

ただしこれだけでは不十分。やってみると分かるのだけど、


……なんか、中央よりもちょっと位置が高いわね。

これはなぜかというと、変数操作+で取得できる主人公の画面座標というのは「中央」ではなく「足元」だからなの。


キャラの真ん中じゃなくて足もとのY座標が取得されてしまう。だからちょっと上にズレちゃうのね。

というわけで半マスだけY座標を調整してあげる必要があるわ。1マス=使用しているタイルチップのサイズになるから、16×16なら8、32×32なら16になるわね。


使用しているタイルチップのサイズはシステム変数118番に格納されているから、それを÷2した値をY座標からマイナスしてあげればいいわ。
→■変数操作: CSelf11[中央Y] -= Sys118:[読]タイルサイズ / 2 


そしたらこの座標を指定して画面スクロールを実行。
→■画面スクロール:画面移動 瞬間倍速 右方向:CSelf10[中央X] 下方向:CSelf11[中央Y]


画面のスクロールは停止の時と同様、「エフェクト」コマンドから実行できるわ。座標は変数呼び出し値でコモンセルフを指定するのよ。その他の項目は↑の画像を参考にして頂戴。

これでOK。こうやって、並列実行のコモンイベントを使って画面スクロールをかけ続けることで中央位置を調整することができるわけね。

画面中央位置を調整する際の注意点


というわけで、実際に調整したのがこちら。成功していれば、このように指定した位置に中央座標が調整されているはずよ。

※分かりやすくコモンに実行条件を設定してメニューから起動しているけど、不要なら並列実行(常時)でいいわ。

仕組みはちょっとわかりづらいところもあるかもだけど、まぁやること自体は簡単だったわね。

ちなみに、この中央位置調整を行う際には注意点がいくつかあるの。

注意点①マップ移動時に中央位置が一瞬もどってしまう

この状態で「場所移動」コマンドで主人公を移動させると、「一瞬だけ中央位置が本来の座標に戻ってしまう」という現象が起きてしまうわ。

なぜかというと、並列実行コモンで行っている画面スクロールが一瞬だけ間に合わないからよ。まぁどうしようもないわね。

対処としてはいろいろあるのだけど、


「トランジション準備」で画面更新を停止→ウェイトを1フレームだけかけてから解除してあげて、画面がズレている瞬間を隠してしまうのが簡単ね。

注意点②固定画面用のウィンドウにめり込んでしまう

それと、これは中央位置の調整というよりも「固定ウィンドウ表示のレイアウトにしたことによる影響」といった方が正しいのだけど、


はい、ウィンドウにめり込んでいます。普通にマップを作ってしまうとこういうことが起こってしまうわ。


対策は簡単。めり込んで欲しくないマスだけマップサイズを広く作成しておけばいいわ。今回の例だと右と下にウィンドウを表示させているから、このように暗黒空間を作ってあればいいわ。

とりあえず思いつく注意点はこの2つくらいかしら。まぁ「常に画面スクロールをかけ続ける」ということをしている以上、何かしらの弊害は起きてしまうかもしれないわね。

何かうまくいかないことがあったら、コメントにでも書いて頂戴。