ゲームのウィンドウサイズ調整や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がユニットを動かす際にフォーカスするようにしてみると効果のほどがわかります。
あとはプレイヤーキャラの操作でも、選択時や長距離の移動時などでフォーカスをかますとよさげ。
フォーカスの危険性
スクロールが多すぎると画面酔いしてしまう
AIの操作でユニットが動くとき、その一体一体がフォーカスされるとします。
基本的には番号(=行動順)の近いユニットはそばに集まっているでしょうし、密集した6体のユニットへ次々に1~2マス程度のスクロールがガクガクガクッと続いたとすると……
確実に画面酔いを起こします。2Dなのに。筆者は酔いました。
ほぼ一瞬とはいえ、スクロール中は「退屈な見るだけ時間」です。あまり頻々と画面に変化のない軽微なスクロールが続くのも考え物ですね。
酔い止め処理
話は簡単で、計算で求めたスクロール量が一定値以下ならスクロール(フォーカスをやめる)という分岐をかければよいでしょう。
一方、「イベント演出でボスユニットを目立たせるためのフォーカス」なんてのもありそうです。
スクロール量が少なくてもフォーカスしてほしいタイミングもあるということで、酔い止めのフォーカス抑制機能は入力値でオン/オフ指定できると便利かも。
仮に「4以下はカット」としていますが、この閾値は画面サイズなどに合わせて微調整してください。