RPG Maker MZ Actor для битвы нацелена на битвуJavascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 RPG Maker MZ Actor для битвы нацелена на битву

Сообщение Anonymous »

ОК, у меня есть сценарий в .js для RPG Maker. Я пытаюсь переместить актера на Target - анимация атаки - вернуться в исходную позицию. Я не могу, казалось, сначала перезаписать анимацию атаки с помощью Dash Forward. назад.
Несмотря на то, что журналы отладки говорят, что это происходит в правильном порядке, что странно. Это почти так, как будто сценарий правильный, но ядра RMMZ перезаписывают определенные вещи самостоятельно./*:
* @target MZ
* @plugindesc Moves actor close to enemy when attacking, then attacks. (No return movement yet)
* @ScarredInteractive
* @help
* This plugin modifies attack behavior so that:
* 1. The actor moves directly to the enemy.
* 2. The actor stops before attacking.
* 3. The attack animation plays at the correct time.
*
* Debugging logs will appear in the console (F12 in playtest).
*/

(() => {
const _Game_Battler_performActionStart = Game_Battler.prototype.performActionStart;
const _Game_Battler_performActionEnd = Game_Battler.prototype.performActionEnd;
const _Game_Action_apply = Game_Action.prototype.apply;

// **Intercept step-forward behavior**
Game_Battler.prototype.performActionStart = function (action) {
if (this.isActor() && action?.isAttack()) {
console.log("Blocking default step-forward before attack.");
return; // Prevent RPG Maker from stepping forward automatically
}
_Game_Battler_performActionStart.call(this, action);
};

// **Intercept attack execution and force movement first**
Game_Action.prototype.apply = function (target) {
const subject = this.subject();
if (subject.isActor() && target.isEnemy()) {
console.log(`--- ATTACK SEQUENCE INITIATED ---`);

// **Stop default attack animation from playing too soon**
subject._delayedAttack = this; // Store the attack for later execution
subject.requestMotion("wait");

moveToEnemy(subject, target, () => {
console.log(`Actor reached enemy. Now attacking...`);

// **Now we manually trigger the stored attack**
executeDelayedAttack(subject, target);
});

} else {
_Game_Action_apply.call(this, target);
}
};

// **Override step-back behavior**
Game_Battler.prototype.performActionEnd = function () {
if (this.isActor()) {
console.log("Blocking default step-back after attack.");
return; // Prevent RPG Maker's auto return movement
}
_Game_Battler_performActionEnd.call(this);
};

function moveToEnemy(actor, enemy, callback) {
const spriteActor = SceneManager._scene._spriteset.findActorSprite(actor);
const spriteEnemy = SceneManager._scene._spriteset.findEnemySprite(enemy);

if (spriteActor && spriteEnemy) {
console.log(`Actor Original Position: x=${spriteActor.x}, y=${spriteActor.y}`);
console.log(`Enemy Position: x=${spriteEnemy.x}, y=${spriteEnemy.y}`);

actor._originalX = spriteActor.x;
actor._originalY = spriteActor.y;

const targetX = spriteEnemy.x - 40;
const targetY = spriteEnemy.y;

console.log(`Moving to target: x=${targetX}, y=${targetY}`);

spriteActor.startMove(targetX - spriteActor.x, targetY - spriteActor.y, 10);

const movementChecker = setInterval(() => {
if (Math.abs(spriteActor.x - targetX) < 2 && Math.abs(spriteActor.y - targetY) < 2) {
clearInterval(movementChecker);
console.log("Movement to enemy completed!");
if (callback) callback();
}
}, 50);
} else {
console.error("Could not find actor or enemy sprite!");
}
}

function executeDelayedAttack(actor, target) {
if (actor._delayedAttack) {
console.log(`Executing stored attack!`);

actor.requestMotion("attack");

setTimeout(() => {
_Game_Action_apply.call(actor._delayedAttack, target);
console.log(`Attack logic applied!`);

waitForAttackAnimation(actor, () => {
console.log("Attack animation finished. Moving back...");
returnToStart(actor);
});

actor._delayedAttack = null; // Clear stored attack

}, 200); // Smooth delay before applying attack
}
}

function returnToStart(actor) {
const spriteActor = SceneManager._scene._spriteset.findActorSprite(actor);
if (spriteActor) {
console.log(`Returning Actor to Original Position: x=${actor._originalX}, y=${actor._originalY}`);
spriteActor.startMove(actor._originalX - spriteActor.x, actor._originalY - spriteActor.y, 10);

const returnChecker = setInterval(() => {
if (Math.abs(spriteActor.x - actor._originalX) < 2 && Math.abs(spriteActor.y - actor._originalY) < 2) {
clearInterval(returnChecker);
console.log("Actor fully returned to original position.");
actor.requestMotion("wait");
}
}, 50);
}
}

function waitForAttackAnimation(actor, callback) {
const spriteActor = SceneManager._scene._spriteset.findActorSprite(actor);

if (spriteActor) {
console.log("Waiting for attack animation to finish...");
const animationDuration = 30; // Approximate time for an attack animation (adjust as needed)

setTimeout(() => {
console.log("Attack animation completed.");
callback();
}, animationDuration * 16); // 16ms per frame
} else {
console.error("Could not find actor sprite for attack animation timing!");
callback();
}
}

Spriteset_Battle.prototype.findActorSprite = function (actor) {
return this._actorSprites.find(sprite => sprite._battler === actor);
};

Spriteset_Battle.prototype.findEnemySprite = function (enemy) {
return this._enemySprites.find(sprite => sprite._battler === enemy);
};

})();
< /code>
Вот журналы, указывающие его в абсолютном совершенном порядке, но геймплей не ... < /p>
--- Инициированная последовательность атаки --- < /p>
movebattle.js:64 Оригинальная позиция актера: x = 664, y = 376 < /p>
movebattle.js:65 Позиция противника: x = 302, y = 270 < /p>
movebattle.js:73 Перемещение к цели: x = 262, y = 270 < /p>
movebattle.js:80 Движение к врагу завершено! < /p>
movebattle.js:39 Актер достиг врага. Теперь атакует ...
movebattle.js:91. Выполнение сохраненной атаки!
movebattle.js:97 Применяется логика атаки! br /> movebattle.js:130 В ожидании анимации атаки, чтобы закончить ... < /p>
movebattle.js:134 Анимация атаки завершена. < /p>
Movebattle.js: 100 анимация атаки закончена. Движение назад ... < /p>
movebattle.js:113 возвращающего актера в исходную позицию: x = 664, y = 376 < /p>
movebattle.js:119 Актер полностью вернулся в исходную позицию.>

Подробнее здесь: https://stackoverflow.com/questions/794 ... get-battle
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»