【1月プラン記事②】マップギミック(落石)の作り方

今月の有料プランの特典として「移動ルートの拡張プラグイン」を公開しました!


この記事では、プラグインを使ってマップギミックの作り方を解説していきます!


落石ギミックを作る

当たるとダメージを受ける落石ギミックを作っていきます!
(※完成した移動ルートは記事の一番下にまとめてます)


まずは画面上部に岩のイベントを配置して…


イベントの設定を行います。
(※「イベントから接触」でダメージ処理を行う仕様とします)

岩の動きをつける

まずは岩の動きの流れを作っていきましょう!

スクリプト・注釈コマンドでルート設定

自律移動のルートの設定のスクリプト欄にコマンドを入力することができますが…

見切れてしまって後から見返すときに非常に見づらいです…


イベントページの「スクリプトコマンド」あるいは「注釈コマンド」から設定することができるので、ぜひこちらを使いましょう!

(※MZの方は行数無制限の「スクリプトコマンド」で1つのコマンド内にすべて入力、MVの方は複数の「注釈」コマンドをつなげてコマンドを入力していきましょう)


まずは、自律移動のタイプが「カスタム」であることを確認し、イベントページの頭にスクリプト・注釈コマンドを挿入して以下のように入力してください。

@route custom repeat skippable


@route*以降のパラメータはそれぞれ次の意味を表します。

  • カスタム(custom)の移動ルート設定
  • 動作を繰り返す(repeat)
  • 移動できない場合は飛ばす(skippable)

(※ repeat、skippableが不要な場合は抜かせばOKです)
(※ 自律移動ルート以外にも、イベント「移動ルートの設定」にもこの記述方法が使えます。customを対象(this / player / event:イベントID)に変えればOK)


岩の動作の移動ルートコマンド

動作のコマンドは↓の通り

順に説明していきます!


「y」コマンド

//1マス上(マップ外)に瞬時に移動
cmd y 0 d:0

岩が画面外から落ちてくるように見せるため、
「y」コマンドを使ってイベントを1マス上に移動させています。

「y」コマンドは通常の上下移動(上に進む/下に進む)と違い、接触判定/接触によるイベント発生がありません。


そのため使い所は限られますが、移動にかかるフレーム数を指定し、イージング(緩急)をつけてなめらかに移動させることができます。



パラメータが多く難解に見せますが、基本的には下の形で使うことが多いです。

「cmd y 移動量 d:所要フレーム数 (イージング)」

今回の場合は、移動量(value)が-1、所要フレーム数が0で瞬時に移動させています。

(※「abs」をつけることで絶対座標(マップ座標)で指定することもできます。「cmd y -1 abs d:0」 → y=0の座標に瞬時に移動)


次の行も「y」コマンドで、画面上から岩を落下させています。

//落下(yコマンドは当たり判定ないので注意)
cmd y 6 d:35 cubicIn

35フレーム(d)かけて、イージング「cubicIn」で+6だけ移動させています。


イージングの種類

イージング(緩急のかけかた)はいろいろな種類がありますが、覚えるならおすすめは↓

  • 「easeIn」:イーズイン、徐々に早く
  • 「easeOut」:イーズアウト、徐々に遅く
  • 「easeInOut」:イーズインアウト、最初と最後をゆっくり
  • 「cubicIn / cubicOut / cubicInOut」:↑のイージングよりも緩急が激しいバージョン
  • 「backIn / backOut / backInOut」:一度通りすぎて戻ってくる少しコミカルな緩急

岩が落下時に徐々にスピードが増すので、In系の「cubicIn」を採用しています。

(※本来はイージングは「easing:イージング種類」で指定しますが、イージング種類は略号が用意されているため好きな位置でイージング種類のみで記述が可能です。詳しくは前回の記事参照)



まだまだ続く「y」コマンド!
岩が道の上に落ちた後に、少しだけ上にバウンドさせます。

//ちょっとバウンド
cmd y -0.5 d:10 cubicOut
cmd y 0.5 d:10 cubicIn

それぞれ10フレームかけて上に0.5マス、下に0.5マス移動させています。

(※イージングは最初の跳ね上がりは勢いがついた状態なので徐々に遅くする「cubicOut」、勢いが落ちた状態で落下するので「cubicIn」)



その後は、下に1歩だけ通常移動してから、また「y」コマンドで緩急をつけて画面下に落下させています。

//1マス転がる
cmd down

//崖下に落下
cmd y 10 d:60 cubicIn

移動 / 向きの変更コマンド

通常の移動ルート設定でも使用頻度が多い「移動」「向きの変更」コマンド。


拡張コマンドでは下の通り↓

  • 下に移動 | 下を向く:down | turndown(またはturnd)
  • 左に移動|左を向く:left | turnleft(またはturnl)
  • 右に移動|右を向く:right | turnright(またはturnr)
  • 上に移動|上を向く:up | turnup(またはturnu)

ちなみに、複雑な移動ルートで *「右に5歩、下に3歩移動してからまた右に3歩……」みたいな場合は「walkX / walkY」コマンドがおすすめです!

cmd walkX 5
cmd walkY 3
cmd walkX 3

こちらは「x / y」コマンドと違って、一歩ごとに当たり判定があります。


また、「abs」をつけて絶対座標(マップ座標)で指定することもできます。

cmd walkX 10 abs   //X=10まで移動
cmd walkY 5 abs    //Y=5まで移動
cmd walkX 13 abs   //X=13まで移動

動作を繰り返す

さて、先程までの解説で岩の基本の動きができました。

このままでは繰り返しても延々と下に落ち続けるので、繰り返しごとに位置を戻す必要があります。


↓のように「cmd y -1 d:0」コマンドの下にコマンドを挿入しましょう。

「save」「restore」コマンド:位置の保存&復元

//現在の位置を保存
cmd save

挿入した1行目の「save」コマンドは、コマンド実行時の位置と向きを保存するシンプルなコマンドです。

「restore」コマンドを使うことで、保存した位置に瞬時に戻ることができます。


「repeat」コマンド:繰り返し開始箇所の変更

「repeat」コマンドは移動ルートを繰り返す際に、繰り返しの開始箇所を変更するコマンドです。

最初だけ実行する「初期化処理」とメインの「繰り返し処理」を分けたいときに便利なコマンドです。

今回の場合は、「save」コマンドは1度だけ実行すれば良い(むしろ何度も実行すると、変な場所で保存する可能性も…)ので「repeatコマンド」を使って繰り返し地点を変更しています。


今回は、移動ルートが最後まで終わり「cmd repeat」に戻ってから「cmd restore」コマンドで最初の位置に復元しています。


これで、何度も繰り返されるようになりました!


衝突処理を作る

岩と接触時に、ダメージを受ける処理を作っていきましょう!

イベントの「トリガー」が「イベントから接触」になっていることを確認し、次のような感じで接触時の処理を実装します。

何度もダメージ処理が走らないように、セルフスイッチAを使って2回目以降はダメージを受けないようにしています。

あとの部分(SEや画面演出など)はお好みでOK!




さて、実はこのままでは2つ問題点があります……

  • 岩の落下地点にいてもイベントが開始されない

  • セルフスイッチ「A」をOFFに戻さないと移動ルートを繰り返してもイベントが開始されない

という2点です。


セルフスイッチの方は簡単に解決できるので先に見てみましょう!


「selfSwitch」コマンド

リピート開始後に「selfSwitch(selfSw)」コマンドでセルフスイッチAの値をfalseに戻せばOKです!

ちなみに、true=on、false=offに置き換えてもOK。
keyとvalueの順番が正しければ、

cmd selfSw A off

と簡単に書いてもOKです!


「if」コマンド & 「event」コマンド

さて、もう1つの問題

  • 岩の落下地点にいてもイベントが開始されない

ですが、これは「y」コマンドに接触判定がないためです。


ここでは、落下直後に「もし、プレイヤーとの距離が一定以下ならイベントを開始」させるコマンド処理を挟んで対応します。



…岩の着地時のエフェクト用コマンドも挟んでるので先に簡単に説明しておきます。

//着地エフェクト
cmd shake p:5 s:5 d:16 @ //画面シェイク
cmd se Blow1 90 100 0 @ //SE「Blow1」再生

「shake」コマンドはイベントコマンド「画面のシェイク」にあたるコマンドです。

  • 強さ(power/p)スピード(speed/s)所要時間(d)を指定
  • ここでは強さ5、スピード5、所領時間16フレーム

「se」コマンドはSEの再生。パラメータは順にSE名、ボリューム(volume)、ピッチ(pitch)、パン(pan)となります。
(※よく使うコマンドなので、パラメータ名を覚えるよりも、パラメータの順番を覚えた方が良いと思います)**


さて、改めて衝突判定のコマンドを見てみます

//衝突判定(距離が0.3以下ならイベント開始)
cmd if dist 0.3; event

まず前提として、コマンドはセミコロン「;」つなぎで1つの行で複数のコマンドを実行させることが可能です。
(※2つ目以降は最初の「cmd」が不要)

  • 例)「cmd pattern 0; turnleft」
     └パターンを0にして左を向く

そして、「if」コマンド条件を満たした場合にのみ、同じ行のその後のコマンドを実行するというコマンドです。


「if」コマンドにはいくつかタイプがあり「cmd if タイプ 判定値...」の形式をとります。


「if dist」コマンドでは「プレイヤーとの距離」により判定を行います。

  • 「cmd if dist 判定距離; 判定距離以下のときに実行する処理」

(※プレイヤーとの「距離が一定以上のとき」を判定するには「dist」のかわりに「!dist」を使用)


今回は↓のように距離が0.3以下のときに「event」コマンドでイベントを開始させ、イベント接触時のイベント開始を擬似的に行っています。

cmd if dist 0.3; event

これで、イベント接触の問題を両方解決できました!

あとは、イベントをコピペしてタイミングをずらせば完成!!


……なのですが、今後のこと(移動ルートの修正など)を考えてもうひと手間加えていきます。


移動ルートをうまく使い回す

このイベントをコピー&ペーストして複製した場合、

「移動ルートを修正したくなったときにすべてのイベントの移動ルートを修正する必要」

が出てきます……。


ここでは移動ルートをコモンイベントにまとめ、そこから呼び出すことで修正の手間を省くようにしていきます。


まは「移動ルートの設定コマンド」をコピーし、そのままコモンイベントにペーストしましょう。



あとは、イベントのページに戻り、「スクリプト・注釈」による移動ルートの設定コマンドを次のように書き換えればOK!


@route custom common:落石

「common:コモンイベント名」あるいは「common:コモンイベントID」でコモンイベント上のルート設定を読み込むことができます!



あとは、イベントをコピー&ペーストすれば……!


………さて、タイミングをずらすにはどうすれば良いでしょうか?



コマンドの各種パラメータは制御文字に対応しているのですが、イベントによってパラメータの値を変えるのに便利なオリジナル制御文字を用意しています!


データベースを開いてコモンイベント上のルートを修正してみましょう!


初期設定(「repeat」コマンドより前)として、「save」コマンドで位置の保存を行った直後に「wait」コマンドによりウェイトを設定します。

本来は「cmd wait フレーム数」の形式で指定しますが、ここではフレーム数の値に制御文字を使ってイベントのメタパラメータを使用します。


メタパラメータはイベントページのメモ欄に<パラメータ名:値>の形式で記入します。

ここでは、「startW」というパラメータ名で、イベントごとににタイミングをずらすフレーム数を記入します。


そして、制御文字「\MT[メタパラメータ名@デフォルト値]」を使用してこの値をwaitコマンドのフレーム数に使用します。

(※@デフォルト値はメモ欄にパラメータを設定しなかったときのデフォルト値で、省略も可能。)



あとは、イベントごとに<startW:ウェイト値>の値を設定すれば岩の落下タイミングを自由にずらすことができます!

長かったですが、ここまでお疲れさまでした!!



……ここまででギミック完成でも全然問題ないのですが、実際にプレイしてみると1つだけ気になる点が出てくると思います。


「画面外のイベントは移動ルートが動かない」という仕様のため、タイミングがずれる!

→ おまけ機能でメモ欄に「<force>」とメタパラメータを設定すると画面外でも移動ルートが実行されます!




これで解決したかと思いきや…

何回も岩にぶつかると徐々にタイミングがずれる……!!
(※これは実はルートの設定に問題があるからなのですが、動作上問題ないのでここでは割愛します)

今度はコモンイベントのルート設定を開き、「repeat」コマンドを次のように修正してみてください。(repeatのあとに180を加えればOK)


これで移動ルート実行中に何らかの影響でタイミングがずれても、
きっかり180フレームごとにリピートが繰り返される
ようになります!

(※仮に繰り返しが120フレームで終わった場合、repeatの箇所に戻ってから残りの60フレームを待機してから次の行に進みます。逆に180フレームを超えて190フレームかかった場合はそのサイクルはスキップしてさらに170フレーム待機して次のサイクルを開始します。)


今度こそ本当に終わり。お疲れさまでした!


最終的な移動ルートのコマンド

@route custom repeat skippable

//1マス上(マップ外)に瞬時に移動
cmd y -1 d:0

//現在の位置を保存
cmd save

//メモ欄<startW:値>で設定しただけ待機(設定無ければ0)
cmd wait \MT[startW@0]


//リピート開始位置を設定、サイクルを180フレームに
cmd repeat 180

cmd restore @ //位置の復元
cmd selfSw key:A value:false //セルフスイッチAをオフに

//落下(yコマンドは当たり判定ないので注意)
cmd y 6 d:35 cubicIn

//着地エフェクト
cmd shake p:5 s:5 d:16 @ //画面シェイク
cmd se Blow1 90 100 0 @ //SE「Blow1」再生

//衝突判定(距離が0.3以下ならイベント開始)
cmd if dist 0.3; event

//ちょっとバウンド
cmd y -0.5 d:10 cubicOut
cmd y 0.5 d:10 cubicIn

//1マス転がる
cmd down

//崖下に落下
cmd y 10 d:60 cubicIn

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

記事を検索