【ウディタ講座】SRPGをつくろう! 任意のマスへスクロールする(酔い止め機能付き)

ゲームのウィンドウサイズ調整やSRPG用のスクロール処理を踏まえた今、その気になれば50×50サイズの大型マップ(ステージ)も作れるようになりました。

そこで気になってくるのが「ユニットの画面外問題」です。

敵(AI)ターンなどで、スクロールによってゲーム画面の外に出てしまったユニットが動き出すとプレイヤーにはなにが起こっているのかわかりません。

マウス追従のスクロールとは別に、任意のマスにフォーカスするタイプのスクロール処理が必要です。

「任意のマスにフォーカスする」とは

フォーカスの意味と必要性

画面外または画面ハジにいる赤の夕一(ニワトリ)が行動するとき、赤夕一が画面の中央あたりに来るようにスクロールした方がわかりやすいですね。

任意のマスが画面中央に来るようスクロールすることを、ここでは仮にフォーカスと呼んだわけです。

移動力が6~7あるようなユニットだと、ただ歩くだけでも画面外へ出ていきかねません。フォーカス処理はAIターン以外でも頻繁に使うことになるでしょう。

画面の中央とはどこか

「解像度(画面サイズ)320×240でタイルサイズ16、スクロール値0,0」のとき、上図のように座標(9,7)あたりが真ん中に見えますね。

1画面におさまるマス数は、《画面サイズX,Y/タイルサイズ》です。320/16=20と、240/16=15。

1画面におさまるマス数を2で割ると10と7.5で、ちょうど画面の真ん中座標の近似値です。

この規則を使えば、任意のマスへのフォーカスができそうですね。

左上ハジ(カド)が(0,0)のとき中央が(9,7)ということは、見方を変えると「中央にしたい座標(フォーカスしたい座標)」から(x-9,y-7)した座標を左上ハジにすればよい、ということでもあるのです。

フォーカスに必要なスクロール量を計算する

上記の計算で真ん中座標の近似値(10,7)を求めたら、フォーカスしたい座標からその値を減算します。

その座標が左上ハジに来るとフォーカスは成功です。その座標こそが「理想の左上ハジ座標」ですね。

また、前回記事の自作スクロールの仕様上、システム変数のスクロール値をタイルサイズで割ると「現在の左上ハジの座標」になりますので、左上ハジの理想と現実の差をもとにして、スクロール処理をかければよいわけです。

さまざまな局面で出番はありそうですが、ひとまずAIがユニットを動かす際にフォーカスするようにしてみると効果のほどがわかります。

MEMO

AI操作のユニットにフォーカスする場合、「なにもしない」時はフォーカスをかけない方が良いでしょう。敵を10体ほど配置して、半分を移動、半分をなにもしないで待機するだけ……なんて設定してみると理由はわかりやすいはず。

あとはプレイヤーキャラの操作でも、選択時や長距離の移動時などでフォーカスをかますとよさげ。

フォーカスの危険性

スクロールが多すぎると画面酔いしてしまう

AIの操作でユニットが動くとき、その一体一体がフォーカスされるとします。

基本的には番号(=行動順)の近いユニットはそばに集まっているでしょうし、密集した6体のユニットへ次々に1~2マス程度のスクロールがガクガクガクッと続いたとすると……

確実に画面酔いを起こします。2Dなのに。筆者は酔いました。

 

ほぼ一瞬とはいえ、スクロール中は「退屈な見るだけ時間」です。あまり頻々と画面に変化のない軽微なスクロールが続くのも考え物ですね。

酔い止め処理

話は簡単で、計算で求めたスクロール量が一定値以下ならスクロール(フォーカスをやめる)という分岐をかければよいでしょう。

一方、「イベント演出でボスユニットを目立たせるためのフォーカス」なんてのもありそうです。

スクロール量が少なくてもフォーカスしてほしいタイミングもあるということで、酔い止めのフォーカス抑制機能は入力値でオン/オフ指定できると便利かも。

仮に「4以下はカット」としていますが、この閾値は画面サイズなどに合わせて微調整してください。

MEMO

ついでですから、さらにモード(入力値)を増やして「フォーカス座標へマウスカーソルも移動させる」機能を足すと、プレイヤーユニット検索機能なんかにも使えて便利です(コンシューマーのSRPGでよくLRに割り振られている機能)

 

【ウディタ講座】SRPGをつくろう! まとめ