Is there any way to recreate the Battle Entry animation from Deltarune in RPG Maker MZ?

Is there any way to recreate the Battle Entry animation from Deltarune in RPG Maker MZ? I just think it looks nice.
Doesn’t necessarily need to have characters move to the left side of the screen, they can still go to the right, I just want to know if this is possible to do with any existing plugins.

DeltaruneBattleTransition-2

うーん、確かに 可能 ではあるんですが、かなり難易度が高いですね。まず、RPGMakerではマップ上のスプライトと戦闘シーンのスプライトが全く別物になっています。たとえそれらのスプライトを同じように見せていたとしても、実際には異なるスプライトです。

こんな感じから始めてみるといいかもしれません(未検証ですが)…

(function(old){
	const MOVEMENT_DURATION = 30; // ここを編集:移動のフレーム数
	Game_Party.prototype.onBattleStart = function(isSurprised) {
		old.call(this, isSurprised);
		let sprites = SceneManager._scene._spriteset._actorSprites;
		for(let who of sprites) {
			if(!who._actor) continue;
			let character = null;
			if(who._actor == $gameParty.leader()) {
				character = $gamePlayer;
			} else {
				character = $gamePlayer.followers().find(follow => follow.actor() == who._actor);
			}
			let x = character.screenX(), y = character.screenY();
			who._movementDuration = MOVEMENT_DURATION;
			who._offsetX = x - who.x;
			who._offsetY = y - who.y;
		}
	};
})(Game_Party.prototype.onBattleStart);

このロジックは理論的には動くはずですが、onBattleStart が適切な設置場所かどうかは確信が持てません。また、あなたの例にあるような特殊効果は一切追加されていません。ただし、それらは Window_BattleLog を使って実装できると思います。

「いいね!」 1

新しいプロジェクトで他のアクティブなプラグインなしでテストしましたが、残念ながら動作しませんでした。

マップのぼかしが問題になるとは、正直考えてもみませんでした。特殊エフェクトがない点も問題ありません。確かにあった方が良いでしょうが、プラグインがエントリアニメーションのために戦闘キャラクターシートからデータを取得すると仮定すれば、それらを事前に含めておくことができるでしょう。(もしかして、あなたが指しているエフェクトはそれらではないのでしょうか?)

うーん。コードの基本的なロジックは正しいと確信しています(「Emerges」のメッセージが表示されている画面で、そのコードの一部を実行する quick test をエンジンで既に実施済みです)。そのため、完全な動作で問題が生じる場合、考えられる理由は以下の2つです:

  1. onBattleStart はバトラーの開始位置を調整する適切なタイミングではない可能性があります。代わりに startEntryMotion で試してみてください:
    (function(old){
    	const MOVEMENT_DURATION = 30; // 編集:フレーム単位の移動時間
    	Sprite_Actor.prototype.startEntryMotion = function() {
    		old.call(this);
    		if(!this._actor) return;
    		let character = null;
    		if(this._actor == $gameParty.leader()) {
    			character = $gamePlayer;
    		} else {
    			character = $gamePlayer.followers().find(follow => follow.actor() == this._actor);
    		}
    		let x = character.screenX(), y = character.screenY();
    		who._movementDuration = MOVEMENT_DURATION;
    		who._offsetX = x - who.x;
    		who._offsetY = y - who.y;
    	};
    })(Sprite_Actor.prototype.startEntryMotion);
    
  2. screenXscreenY の呼び出しが機能しない可能性があります。これは、あなたがもはやマップ画面にいないためです。これが問題の場合、これらの値を一時的にどこかに保存する必要があります。幸いなことに、それらを保存する場所は、ぼかし効果を調整する場所と同じである可能性が高いです。

しかし、#1 の方が #2 よりも可能性が高いと思います。両方が当てはまる可能性もあります。

プラグインを交換してバトルを開始したら、こんなエラーが出た

image

おっと!whoをすべてthisに置き換えるはずだったのですが、いくつか見落としてしまいました。前の投稿を編集して修正しました。もしまだ見落としがあれば確認するためにCtrl+Fを使って確認してみてください。

image

今回は別のエラーです

前の投稿のコードにもう1つの修正を加えました(途中に ._data が欠けていました)。

わあ!動いた!本当にありがとう!!

あとはトランジションを削除(またはキャラクターのスプライトに重ならないように別のものに変更)すれば完了ですね。

「いいね!」 1

これを洗練させるためにできることは他にもあります。例えば、Window_BattleLog の関数を呼び出してアニメーションを再生したり、適切なタイミングでキャラクターのモーションを設定したり、ぼかしトランジションを調整したりといったことです。ただし、少なくともこれは確実に良いスタートだと思います。

正直なところ、どちらも他のプラグインでできるんじゃないかと思うよ
確かにバトルのトランジションを削除できるプラグインは存在するし、その後にモーション用のバトルシーケンスプラグインを使えばいいだろう

「いいね!」 1