移動拡張

簡易挙動設定

移動ルートの実行において、頻繁に組むと予想される挙動を簡易実行します。
対象となるのは以下の5種類です。

  1. ドアの挙動
  2. ジャンプ
  3. 不透明度の変更
  4. 特定方向にnマス移動
  5. 範囲内判定

また、特定のダウン画像は足踏みのパターンに応じて仰向けやうつ伏せに変わるものもありますが、移動ルートの実行ではこれらを直接指定することができません。
この問題を解決するためのスクリプトも実装しています。

ジャンプの実行や透明度の変更などがスクリプト1つで解決します。

【ドアの挙動】

ドアや宝箱の開閉処理を簡易実行できるようになります。

開閉処理はプラグインコマンドとして呼び出すことができます。

>>関連プラグインコマンド

<軽挙動・重挙動>

ドアや宝箱の開閉に重量感をもたせるために、開閉速度を設定します。
向き変更の間に置かれるウェイト処理のフレームが、これらのパラメーターの値に自動設定されます。
どちらの値を参照するかは、後述するプラグインコマンドで指定可能です。
このパラメーターが未設定の場合、軽挙動は3、重挙動は15として扱われます。


【ジャンプ】

キャラクターの向きに合わせて、自動的に着地座標を修正してジャンプを実行します。
また、ユーザー定義の「壁」に対して、手前で着地してくれます。

イベントの実行内容として呼び出す際はプラグインコマンドを使用します。

>>関連プラグインコマンド

また、マップイベントの自律移動や移動ルートコマンドでも、次のスクリプトにより実行可能です。

this.autoJump(x, y, dirFix, 'jumpType', recalc)

x y には、それぞれキャラクターが下向きの時のオフセット値を記入します。
dirFix はジャンプ中に向きを固定するかに関する設定です。
false と記入した場合は固定せず、それ以外の場合は固定します。

jumpTypeには以下の4つが使用できます。
選択したタイプによって、ジャンプの挙動が変化します。
デフォルト(未設定)の時はstepとして機能します。

  • jumpType
  • 挙動
  • step
    (ステップ)
    • 崖や壁タイル、B~Eの通行不可のタイルで止まる
  • ride
    (跳躍)
    • 崖や壁タイルで止まる
    • B~Eの通行不可タイルに侵入できる
      (ジャンプでのみ脱出可能)
  • fall
    (落下)
    • 崖や壁、滝タイルでは平地まで落下する
    • B~Eの通行不可タイルに侵入できる
      (ジャンプでのみ脱出可能)
    • A4タイルやA5の高台タイルから飛び降りる
    • 逆に平地タイルからA4タイル、A5の高台タイルへは飛び乗れない
    • 後述する特定のタイルに到達すると、指定のスイッチがOnになる
  • climb
    (崖登り)
    • 滝タイル以外の崖、壁、B~Eの通行不可タイルに侵入できる
      (ジャンプでのみ脱出可能)
    • スタミナ制を導入している場合、崖に掴まっている間はスタミナが自然回復しない
    • 崖に掴まっている間にスタミナが0になると落下する
      以降は着地するまで落下の挙動に準拠する
ステップ
跳躍
落下
崖登り

※β7.1.0〜
新たにrecalcという引数が追加されました。
ここに true を入れることで、キャラクターの向きに合わせてxとyを自動再計算するようになります。
プラグインコマンドの recalc とは少し仕様が異なっていますので、原則的にtrueで設定しておくことをオススメします。

<壁判定リージョン>

自動ジャンプの際に「壁」として判定するためのリージョンIDのリストを構成します。
キャラクターと着地地点の直線間に該当するリージョンがあるとき、壁にぶつかったと判定します。
なお、船の移動領域は自動的に壁として判定されます。

また、1つ目に設定したリージョンIDはアクションで実行されるアニメーションでも壁として判定されます。
逆に言えば2つ目以降のリージョンIDはキャラクターのジャンプにのみ影響しますので、「プレイヤーを侵入させたくないが射撃魔法は通過させたい」という場合には複数IDの設定が有効です。

この例では、設置エリアへのプレイヤーのジャンプ移動もアニメーションの侵入もできません

<落下死スイッチ>

自動ジャンプにおいてjumpTypeがfallの場合、あるいはclimb中に落下挙動に変わった場合、特定のタイルに到達した際にOnにするスイッチを設定します。
特定のタイルとは次の3種類を指します。

  • マップ外のタイル
    (x座標が0未満か幅以上の値、あるいはy座標が0未満か高さ以上の値)
  • Aタイルが設置されていない、虚無のタイル
    ※A5タイルに含まれる透明タイルは対象外です。
    タイル設置済みの部分を虚無化したい場合は、新規マップの透明タイルを右クリックでコピーしてくるのがオススメです。
    (デバッガ機能を強化している時、タイルIDの最下段のIDが0になっていれば虚無のタイルです)

  • 海のような、船が通行できるタイル
    うっかり水に飛び込んだら……

あくまでもスイッチをOnにするだけなので、具体的にどのような結果を実行するかはユーザーが自由に設定して下さい。
たとえば強制的にゲームオーバーにするコモンイベントを起動しても良いですし、地下に落ちたり空中都市から地上に戻ったりといったマップごとの固有ギミックに活用するのも良いでしょう。
ただし、自動でOffにする機能はありません。
スイッチの切り忘れで無限ループしてしまう不具合には注意して下さい。

<落下の空気抵抗>

落下挙動の際、落下の加速にかかる時間を設定します。
このパラメーターの値が大きいほど、加速までに要する時間は長くなります。
落下速度に関してですが、初速は落下開始時の移動速度に対して1段階遅い状態で設定されます。
たとえば、「4:標準速」であれば「3:1/2倍速」から始まります。
そして最大速度は「9:32倍速」までになります。
着地した時点で落下前の移動速度に自動復元されます。

抵抗が40の時と15の時の比較

【不透明度の変更】

キャラクターが徐々に消えたり現れたりするための、不透明度の変更を自動化します。
パラメーターは存在しません。

移動ルートで不透明度処理を行うと、定数指定であるがゆえの手間や微調整の煩わしさ、そして長大な行数よる可読性の低下が懸念されます。
これをプラグインコマンド1つで解決します。

>>関連プラグインコマンド

【ジャンプ】と同様に、自律移動でもスクリプトが利用可能です。

this.setAutoChangeOpacity(start, end, offset, wait)

start と end はそれぞれ、処理開始時の不透明度・終了時の不透明度を指定します。
入力可能な値は共に 0〜255 です。
未設定の場合は、start なら 255、 endなら 0 として扱われます。
ただし、offset やwait を指定する場合はstart と end も明記してください。

offset は不透明度の変動値です。
こちらも 0〜255 で設定し、未設定の場合は30 として扱われます。
start の不透明度からoffset の値ずつ変動し、end の不透明度を超過した時点でこの処理は終了します。
また、start と end の大小関係に応じて、自動的に加算・減算を判断します。

wait はoffset 処理の間のウェイトフレーム設定です。
未設定の場合は3フレームとして扱います。


【足踏み画像の指定強化】

○足踏み画像の直接指定と固定化

移動ルートの実行において、スクリプトとして次のコマンドを実行すると指定の画像で固定できます。

this.setFixPattern(true, patternID);

patternIDには固定化したい画像のインデックスを記入します。
デフォルトでは左から 0 1 2 の3パターンとなっています。
もしパターンを増やしている場合は、さらに 3 4 ... と続いていきます。
解除したい場合、true の部分を false にしてください。
この際patternID は不要で、自動的に棒立ち状態(パターンのインデックス1)に戻ります。

なお、実行内容でこのスクリプトを使う際は、次のようにcharacter(0)が必要です。

this.character(0).setFixPattern(true, patternID);
this.character(0).setFixPattern(false);

○モーションの演出

足踏みのパターンを応用して、最大で12枚までの動作アニメーションを作ることができます。
移動ルートの実行において、スクリプトとして次のコマンドを実行してください。

this.startMotion(startID, motionType, waitFrames);

  • startID:

    モーション開始時の足踏みパターンのインデックスを記入します。

  • motionType:

    足踏みの流れを左から右、あるいは右から左かのどちらにするかを設定します。
    前者であれば1 、後者であれば-1 を記入してください。

  • waitFrames:

    各足踏みのパターンにおいて、そのパターンを維持する時間をフレームで設定します。
    記述方法は配列となっており、[a, b, c ...]で書きます。

モーションが最後まで完了すると、モーション開始前のグラフィックに自動的に戻ります。
ただし、プレイヤー操作感でリーダーの画像を固定している場合、プレイヤーのモーションは正常に動作しません。
このスクリプトを実行する場合はリーダー画像の固定を解除しておいてください。
また、ウェイトコマンドの機能はありません。
ウェイトをかけたい場合は別途ウェイトを設定してください。

なお、こちらも足踏み画像の固定化と同様、実行内容でスクリプトを使う際はcharacter(0)が必要です。

this.character(0).startMotion(startID, motionType, waitFrames);

足踏み関係のスクリプト記入例
3つ目のスクリプトと移動ルートは同時に実行されます

【特定方向にnマス移動】

移動ルートの設定でたとえば5マス下に移動したい場合、デフォルトでは「下に移動」というコマンドを5つ書く必要があります。
少ないマス移動であれば問題ありませんが、何マスも移動しなければならない時や何度もジグザグに移動させたい場合、どうしても1つの移動ルートが実行内容で占める行数が多くなります。
こうなると可読性が下がります。
次のスクリプトを移動ルートコマンドで使うと、この移動が非常にコンパクトになります。

this.move(x, y);

このスクリプトに制限する統括スイッチはありません。
MELOSを導入すると、いつでも使うことができます。
xおよびyには、それぞれ移動させたい距離を記入して下さい。
負の値を設定するとxなら左、yなら上方向に移動します。
ただし、このスクリプト1回でのx軸方向の移動とy軸方向の移動は同時に行われます。
そのため、「最初に上へ5マス進めて、その後に右へ4マス進めたい」場合は

this.move(0, -5);
this.move(4, 0);

というように分けて使用してください。

また、移動ルートコマンドでは歩幅設定0の状態で小数の座標にいると移動が実行されなくなりますが、このスクリプトはその影響を受けません。
ただし移動後に小数座標となり、それが歩幅とマッチしていない場合は以降の移動ができなくなる恐れがあります。ご注意ください。

※β7.1.0〜
進行方向の通行判定に従うようになりました。
進行先が移動できない場合、そこで移動が停止します。
加えて、移動時の向きがより自然な形に設定されるようになりました。
これまではy軸移動の影響を最も強く受けていましたが、x軸移動の移動距離が長い場合、横向きになります。

加えて、β7.1.0〜は新たなスクリプトが追加されました。

this.moveAiming(id, distance);

このスクリプトを移動ルートコマンドで使うと、idで指定したキャラクター目掛けて移動します。
idに -1 を入れるとプレイヤーを、1以上の数値を入れるとそのIDのイベントを狙います。
distanceには、移動させたい歩数を1以上の整数値で記入して下さい。
前後左右の直進と同じく、斜め移動も1歩としてカウントされます。

「キャラクター目掛けて移動する」という処理は一見、「プレイヤーに近づく」処理と同じに見えます。
このスクリプトのメリットは「キャラクターそのものではなく、その座標を目指す」ことにあります。
たとえばこのスクリプトでプレイヤーを狙って移動中、プレイヤーが移動した場合でも、軌道を修正せずプレイヤーが居た座標に向かって移動します。
さらに、座標に到達してもまだ距離が残っている場合、そのまま真っすぐ移動を続けます。
内部処理として上記のmove(x, y)を利用しているため、移動中に壁があればそこで止まります。

すなわちこのスクリプトは、アクションゲームにおいては必須級の「回避可能な、プレイヤーを狙う弾」の実現をサポートします。
もちろん、使い方次第ではアクション以外でも使えるかもしれません。
ぜひ様々な使い方で理想のゲーム制作を叶えて下さい。

※β8.0.0〜

「近づく」「離れる」の利便性を向上させる、以下の4つのスクリプトを追加しました。

  • this.moveTowardCharacterById(id, variable);
  • this.moveAwayFromCharacterById(id, variable);
  • this.turnTowardCharacterById(id, variable);
  • this.turnAwayFromCharacterById(id, variable);

いずれもイベントコマンド「移動ルートの設定」もしくはキャラクターの自律移動で使用できます。
それぞれ指定したキャラクターへ近づく、キャラクターから離れる、キャラクターの方を向く、キャラクターの逆を向く挙動を実行します。
id には指定するキャラクターのイベントIDを記入します。
0を入れるとプレイヤーを対象にしますが、そちらはデフォルトのコマンドで実装されているので、あえて使う理由はないでしょう。
また、2つ目の引数 variable に true を入れると、idが変数のIDとして判定されます。
このとき、指定した変数の値がキャラクターのIDとして設定されます。
変数指定しない場合は未設定にしてください。

ツクールデフォルトの仕様では、特定のイベントに対してこの挙動を取らせる際、直接移動方向を指定する形になっていたため、ランダムな位置関係になる場合に対応させづらい環境でした。
このスクリプトはその問題を解決するために役立ちます。

ちなみにmoveTowardCharacterByIdおよびmoveAwayFromCharacterByIdの2つで移動する距離は1回分です。
複数歩数移動させたい場合は、その分だけスクリプトを実行させて下さい。


【範囲内判定】※β7.1.0〜

キャラクターAがキャラクターBから指定の範囲内にいるかどうかを判定するためのスクリプトが追加されました。
条件分岐のスクリプトで次のスクリプトが使えます。

this.character(id).checkDistance(targetId, range, backfront, arround);

  • id

    キャラクターBのIDを記入して下さい。
    -1ならプレイヤーを、0ならこの処理を実行するイベントを、1以上なら該当するIDのイベントになります。

  • targetId

    キャラクターAのIDを記入します。
    IDによる対象はidと同じです。

  • range

    判定を取る距離を数値で記入して下さい。
    たとえば5マス以内にいるかどうかを見たければ 5 を記入します。

  • backfront

    0 1 2 のいずれかを記入します。
    これは距離を見る際、キャラクターBの前後関係をどう扱うかを決定するための引数です。
    0ならキャラクターBの前方のみ、1なら後方のみ、2なら前後関係なく全てを対象とします。
    たとえばrange が 5 の時にこの値を 0 にしたとしましょう。
    もしBのすぐ背後にAがいたとしても、そこは判定の対象外のため「範囲外」と判断されます。

  • arround

    キャラクターBが向いている軸から何マスのズレを許すかに関する設定です。
    基本的に0 〜 rangeの値までで設定して下さい。
    たとえば上記の例のまま arround を 3 としましょう。(下図)
    Bが左を向いているとき、まず左前方5マスが判定範囲となります。
    そしてそこから3マスまで外れた上下のエリアも判定範囲となります。
    逆に、そのエリアの外側は、たとえAがBから5マス以内にいたとしても「範囲外」とみなされます。
    Bから見て左右にも判定を広げたい場合は range の設定値にすると良いでしょう。

青が「範囲内」、
黃が「range内だがarround外なので範囲外」、
赤が「backfrontが後ろを見ないので範囲外」
範囲に入ると喜ばれますが、
範囲外にいると悲しくなるそうです。

範囲内判定を取る処理自体は、ツクールのイベントコマンドだけでも十分作ることはできます。
しかし、そのためには変数をいくつも使う必要があり、その度に処理の負荷がかかってしまいます。
また、Bの向きをはじめとして多数の条件分岐を使う必要があるので、必然的に行数は長くなり、可読性も下がります。
このスクリプトはそうした制作上のコストを低減するためのものです。

なお、似たMELOS産のスクリプトにthis.character(0).isInTargetEvent(eventId, distance, isCross);があります。
そちらは簡易的に範囲判定を取りたい場合に、こちらは厳密に範囲判定を取りたい時に有効となります。
使用感が異なりますので、制作の状況に合わせて使い分けてください。



関連プラグインコマンド

door exe weight eventId

ドアや宝箱の開閉を行います。
SEやMEは鳴らないので、プラグインコマンドの前後に演奏を設定してください。

  • exe

    open または close を記入します。
    未設定の場合は open として実行します。

  • weight

    light または heavy を記入します。
    前者なら軽挙動、後者なら重挙動のパラメーターを参照します。
    未設定の場合は light として実行します。

  • eventId

    開閉する対象のイベントIDを記入します。
    未設定の場合、このプラグインコマンドを実行するイベントが対象になります。

autoJump id x y dirFix jumpType coordType recalc

キャラクターの自動ジャンプを実行します。
各引数である x y dirFix jumpType に関しては、原則的に上述のスクリプトと同様の扱いです。(x y は下記参照)
id はこのプラグインコマンドの対象にするイベントIDを記入します。
-1にするとプレイヤー、0にするとプラグインコマンドを記述したイベントが対象となります。

例)x = 3, y = -2の場合、それぞれ青マスに着地します

※jumpTypeを指定する場合

dirFixの true あるいは false は原則的に明記して下さい。
(stepの時で向きを固定したい場合は省略可能です)

なお、プラグインコマンドではjumpTypeを指定する際に文字列を表す' 'は不要です。

※β7.1.0〜
新たな2つの引数 coordType recalc が追加されました。

  • coordType

    direct か variable のいずれかを記入してください。
    これはxとyを直接指定するか、変数指定するかを決める引数です。
    variableの時、xとyはそれぞれ変数のIDとしてみなされます。
    そのため、たとえばxを19、yを13とした上でcoordType を variableにすると、xは変数19の値を、yは変数13の値を実際のジャンプ距離として見るようになります。
    なお、この引数はスクリプトの方にはありません。

  • recalc

    x y をキャラクターの向きに合わせて再計算するかを決める引数です。
    falseとすると再計算しません。
    ここがスクリプトの方とは異なります。
    具体的に言うならば、スクリプトの方でrecalcを未設定、つまり空欄にするとfalseとして扱われます。
    しかしこちらでは「falseではない」ということで true として扱われます。

autoOpacity id start end offset wait

キャラクターの不透明度を自動で変更します。
start end offset wait に関しては、上述のスクリプトと同様です。
また、id に関しては【ジャンプ】のプラグインコマンドautoJump の実行データ id と同様です。