【ツクールMV】変数でマップスクロールの幅を変えてみた

「プレイヤーの位置によってマップスクロール幅・向きを変える」というのを実装してみた!という備忘録です。

ツクール初心者なもんで色々手探りです。「こうするともっといいよ!」みたいなのがあればTwitterとかで教えてもらえるととっても嬉しいです!


★実装したいのはこんなやつ

  1. プレイヤーがマップをうろちょろしている状態
  2. 時間切れ
  3. 別の位置で待機しているヒロインがピンチに直面するイベント発生!

3でいい感じにヒロインにスポットが当たるよう、画面スクロールするイベントを実装したい!

たとえプレイヤーがマップ上のどこにいたとしても!


★とりあえずマップスクロールをスクリプトで指定してみる

ツクールのイベントコマンド入力画面に「マップスクロール」はある。あるけど変数指定ができない…!

よってスクリプトで動かす方法をググってみた。

$gameMap.startScroll(方向,距離,速度) //マップのスクロール

this.setWaitMode('scroll'); //上記マップスクロールが完了するまでウェイト

※方向…2(下)、4(左)、6(右)、8(上)

※速度…1(1/8倍速)、2(1/4倍速)、3(1/2倍速)、4(標準速)、5(2倍速)、6(4倍速)

参考にさせていただいたのはコチラ

意外と簡単じゃーん!これさえ分かれば方向と距離を変数使って操作するだけだぜウェーイ!


★位置情報を変数に格納するやで

以下をそれぞれ変数として格納。()内は設定している変数IDね。

  • プレイヤーのX座標(変数0010)
  • プレイヤーのY座標(変数0011)
  • スクロール先のX座標(変数0020)
  • スクロール先のY座標(変数0021)


★変数の値はこうやって引っ張ってくる、と…

$gameVariables.value(変数ID)

スクリプト内で変数を指定するならこれね。なるほどなるほど…。

これは今後もよく使いそう。


★プレイヤー位置によってスクロール方向・幅を変えるやで

さっき変数として格納した位置情報を使って…


◆条件分岐:プレイヤーのX座標<スクロール先のX座標

 ◆変数の操作:#0020 スクロール先のX座標 -= プレイヤーのX座標

 ◆スクリプト:$gameMap.startScroll(6,$gameVariables.value(20),5)

 ◆スクリプト:this.setWaitMode('scroll');

 ◆

:それ以外のとき

 ◆変数の操作:#0010 プレイヤーのX座標 -= スクロール先のX座標

 ◆スクリプト:$gameMap.startScroll(4,$gameVariables.value(10),5)

 ◆スクリプト:this.setWaitMode('scroll');

 ◆

:分岐終了

◆条件分岐:プレイヤーのY座標<スクロール先のY座標

 ◆変数の操作:#0021 スクロール先のY座標 -= プレイヤーのY座標

 ◆スクリプト:$gameMap.startScroll(2,$gameVariables.value(21),5)

 ◆スクリプト:this.setWaitMode('scroll');

 ◆

:それ以外のとき

 ◆変数の操作:#0011 プレイヤーのY座標 -= スクロール先のY座標

 ◆スクリプト:$gameMap.startScroll(8,$gameVariables.value(11),5)

 ◆スクリプト:this.setWaitMode('scroll');

 ◆

:分岐終了


できた!できてません(後述の追記参照)

これでプレイヤーがマップ上のどこをほっつき歩いていても、指定した座標にスクロールしてくれる!

記述としては「座標を減算した結果を変数に格納して、プラスかマイナスかで方向判定をする」の方がシンプルな構文になるのだけど

スクロール時の演出を分けるかもしれないし、この形を使いまわして行こうかな。


2020/3/1 追記

色々やってるうちに、考慮漏れがあった事に気付きました。

お漏らし事項は「プレイヤーが必ずしも画面中央にいるわけではない」ということ。

マップの端っこなんかはプレイヤーが画面中央にいないもんね…。そしたらスクロールする数値も変わるよね…。うっかり。

よって以下、赤字箇所下線箇所を追記。(赤字で記載してましたが、スマホだとうまく表示されなかったので修正)


◆条件分岐:プレイヤーのX座標<スクロール先のX座標

 ◆条件分岐:プレイヤーのX座標<8

  ◆変数の操作:#0010 プレイヤーのX座標 = 8

  ◆

 :分岐終了

 ◆変数の操作:#0020 スクロール先のX座標 -= プレイヤーのX座標

 ◆スクリプト:$gameMap.startScroll(6,$gameVariables.value(20),5)

 ◆スクリプト:this.setWaitMode('scroll');

 ◆

:それ以外のとき

 ◆条件分岐:プレイヤーのX座標>41

  ◆変数の操作:#0010 プレイヤーのX座標 = 41

  ◆

 :分岐終了

 ◆変数の操作:#0010 プレイヤーのX座標 -= スクロール先のX座標

 ◆スクリプト:$gameMap.startScroll(4,$gameVariables.value(10),5)

 ◆スクリプト:this.setWaitMode('scroll');

 ◆

:分岐終了

◆条件分岐:プレイヤーのY座標<スクロール先のY座標

 ◆条件分岐:プレイヤーのY座標<6

  ◆変数の操作:#0011 プレイヤーのY座標 = 6

  ◆

 :分岐終了

 ◆変数の操作:#0021 スクロール先のY座標 -= プレイヤーのY座標

 ◆スクリプト:$gameMap.startScroll(2,$gameVariables.value(21),5)

 ◆スクリプト:this.setWaitMode('scroll');

 ◆

:それ以外のとき

 ◆条件分岐:プレイヤーのY座標>23

  ◆変数の操作:#0011 プレイヤーのY座標 = 23

  ◆ 

 :分岐終了

 ◆変数の操作:#0011 プレイヤーのY座標 -= スクロール先のY座標

 ◆スクリプト:$gameMap.startScroll(8,$gameVariables.value(11),5)

 ◆スクリプト:this.setWaitMode('scroll');

 ◆

:分岐終了



マップのサイズが49×29での記述例。

プレイヤーが画面中央に来ないケース毎の処理としては

  • プレイヤーX座標が8未満の場合→プレイヤーX座標に8を代入
  • プレイヤーX座標が42以上の場合→プレイヤーX座標に41を代入
  • プレイヤーY座標が6未満の場合→プレイヤーY座標に6を代入
  • プレイヤーY座標が24以上の場合→プレイヤーY座標に23を代入

ってので対応。

プレイヤーの座標というよりは「画面中央の座標」と言った方が正しい気がする。。

とりあえずこれで何とかなりました。よかったよかったー


以上、備忘録でした。






あつかん部屋

自作イラストと自作ゲームについて不定期に更新します。

0コメント

  • 1000 / 1000