【ウディタ講座】自作スクロールの作り方・考え方

あなたの作りたいゲームによっては、画面スクロール処理をアレンジしたくなるかもしれません。
マウス操作のSRPGだとか、強制スクロールのあるSTGや横スクACTなんかは特にそうですね。
こういうとき、「エフェクト」コマンドの画面スクロールでは満足できないこともあるでしょう。移動量や速度の細かい指定ができないのです。
しかしウディタは、実はスクロール処理まで自作化できるのです。

スクロール具合はシステム変数から直接いじれる

次の手順(イベント)を実行してみましょう。
  • 少し広めのマップを用意
  • 「エフェクト」コマンドからデフォルトのスクロール処理を停止
  • システム変数104~105(スクロール値X,Y)で適当な値を入力
どうなるかというと、システム変数に手打ちした値だけ、任意のスクロールをさせられるのです。

自作スクロールを作ってみる

仕様決め

作りたいゲームによって必要な自作スクロールの仕様も千差万別。
ひとまず、「マップ拡大率200%のときに、主人公が見切れないスクロール」を作ってみましょう。
というのも、マップの拡大(ズーム)について、公式のマニュアルで次のような説明があるためです。
拡大率を100%以上にした場合、主人公が画面の端に行った場合に見切れて
主人公が見えなくなりますが、マップのズームとしてはこれで正常な仕様です。
拡大したままプレイさせる場合は、マップの端の方を通行不能にするなどの工夫が必要です。
適当なマップを用意して、ゲーム開始直後に「エフェクト」でマップ拡大率を200%にしましょう。
↓ マップ拡大率200%で表示
↓ 画面右側へ移動
マニュアルにある通り、はやい段階からスクロールが主人公を追いかけきれなくなっていますね。

自作スクロールの考え方

作りたいスクロールの仕様(要件)は、「主人公が見切れない」ことです。
もうちょっとウディタのコマンドに落とし込めそうな言い方にするなら、「常に主人公が画面の中央に表示されている」ことですね。
「変数操作+」には「主人公の画面座標」を取得するコマンドがありますので、これを駆使するとなんとかなりそうです。
次のような考え方で組み立ててみましょう。
  • ゲームのウィンドウサイズなどから主人公の「居るべき画面座標」を計算
  • 主人公の「居るべき画面座標」と「実際の画面座標」の差を取得
  • 上記の差の値を、システム変数のスクロール値に加算

ソース

■事前にどこかで行う
■画面スクロール:スクロールロック
■マップエフェクト:[ズーム] 中心X 0 / 中心Y 0 / 200% (0)フレーム
■処理本体の並列コモン(適当な変数を起動条件とする)
▼ <01>居るべき画面座標を求める
■変数操作: CSelf12[拡大率/50] = 200 / 50
■変数操作: CSelf20[居るべきX] = 320 / CSelf12[拡大率/50] ■変数操作: CSelf21[居るべきY] = 240 / CSelf12[拡大率/50] ▼
▼ <02>画面座標「居るべき値」と「実際の値」の差を求めて、スクロール値に加算
■変数操作+: CSelf10[現画面座標X] = 主人公 の 画面X座標
■変数操作+: CSelf11[現画面座標Y] = 主人公 の 画面Y座標
■変数操作: CSelf30[X差] = CSelf10[現画面座標X] – CSelf20[居るべきX] ■変数操作: CSelf31[Y差] = CSelf11[現画面座標Y] – CSelf21[居るべきY] ■変数操作: Sys104:Xスクロール値 += CSelf30[X差] + 0
■変数操作: Sys105:Yスクロール値 += CSelf31[Y差] + 0
<01>の居るべき画面座標の求め方は場合によりけりですが、今回は短い計算でそれっぽくなるようにしてあります。
スクロールを自作化した結果、主人公が見切れることなく、だいたい画面中央をキープできました。

自作化の留意点

おそらく、ピクチャ表示の「スクロールとリンク」時の挙動や、マニュアルでも言及のあるマップ見切れについては、デフォルトのスクロール処理の時とは違った見え方になってくるでしょう。
このあたりはそれぞれのゲームに合わせて調整が必要です。