本帖最后由 chinx 于 2021-11-25 19:04 编辑
你想要的这种分段伤害显示,目前有2个比较推荐的方法可以支持:
一是用moghunter(MOG)的动画闪光伤害,也就是说,只要动画发生闪光,就跳伤害,也可以配置什么情形下生效、调低闪光强度降低画面污染提高观感。但这个插件似乎有一些问题我不太记得了。
二是用yanfly(YEP)的战斗行动序列插件,亲自编排什么时候第几帧执行什么动作,第几帧发生伤害,综合演出效果最好但学习成本较高。
第二个问题关于打击感,说它是玄学也没毛病,这完全是靠自己的理解了,因为打击感这种东西,事实上是行动产生的结果的反馈,
这些结果包括了画面闪烁、晃动、音效声场响度的变化配合、所有动作嵌合的精准程度、帧速率的迟滞/加速变化等等。
目前看来MV还没有现成的插件可以做到这些全部内容。你可以先从震动入手(yanfly的行动序列3插件会导致震动只能横向晃动,Y轴需要自己修改插件)。
顺便提一下,我个人修改YEP_X_ActSeqPack3.js以支持Y轴震动的方法如下,供参考:
//============================================================================= // Spriteset_Battle //============================================================================= Yanfly.ASP3.Game_Screen_prototype_startShake = Game_Screen.prototype.startShake; Game_Screen.prototype.startShake = function(power, speed, duration){ Yanfly.ASP3.Game_Screen_prototype_startShake.call(this, power, speed, duration); this._randomRateX = [-1, 0, 1][Math.randomInt(3)]; this._randomRateY = [-1, 0, 1][Math.randomInt(3)]; }; Spriteset_Battle.prototype.updatePosition = function() { var zoom = $gameScreen.zoomScale(); var clamp = BattleManager.cameraClamp(); this.scale.x = zoom; this.scale.y = zoom; var screenX = -1 * $gameScreen.zoomX() * zoom + Graphics.boxWidth / 2; var screenY = -1 * $gameScreen.zoomY() * zoom + Graphics.boxHeight / 2; if (clamp && zoom >= 1.0) { var clampX1 = -Graphics.boxWidth * zoom + Graphics.boxWidth; var clampY2 = -Graphics.boxHeight * zoom + Graphics.boxHeight; this.x = Math.round(screenX.clamp(clampX1, 0)); this.y = Math.round(screenY.clamp(clampY2, 0)); } else if (clamp && zoom < 1.0) { this.x = Math.round((Graphics.boxWidth - Graphics.boxWidth * zoom) / 2); this.y = Math.round((Graphics.boxHeight - Graphics.boxHeight * zoom) / 2); } else { this.x = Math.round(screenX); this.y = Math.round(screenY); } if($gameScreen._shakeDuration % 10 == 0){ $gameScreen._randomRateX = [-1, 0, 1][Math.randomInt(3)]; $gameScreen._randomRateY = [-1, 0, 1][Math.randomInt(3)]; } this.x += Math.round($gameScreen.shake()*($gameScreen._randomRateX || 1)); this.y += Math.round($gameScreen.shake()*($gameScreen._randomRateY || 1));//震动加Y轴 };
//=============================================================================
// Spriteset_Battle
//=============================================================================
Yanfly.ASP3.Game_Screen_prototype_startShake = Game_Screen.prototype.startShake;
Game_Screen.prototype.startShake = function(power, speed, duration){
Yanfly.ASP3.Game_Screen_prototype_startShake.call(this, power, speed, duration);
this._randomRateX = [-1, 0, 1][Math.randomInt(3)];
this._randomRateY = [-1, 0, 1][Math.randomInt(3)];
};
Spriteset_Battle.prototype.updatePosition = function() {
var zoom = $gameScreen.zoomScale();
var clamp = BattleManager.cameraClamp();
this.scale.x = zoom;
this.scale.y = zoom;
var screenX = -1 * $gameScreen.zoomX() * zoom + Graphics.boxWidth / 2;
var screenY = -1 * $gameScreen.zoomY() * zoom + Graphics.boxHeight / 2;
if (clamp && zoom >= 1.0) {
var clampX1 = -Graphics.boxWidth * zoom + Graphics.boxWidth;
var clampY2 = -Graphics.boxHeight * zoom + Graphics.boxHeight;
this.x = Math.round(screenX.clamp(clampX1, 0));
this.y = Math.round(screenY.clamp(clampY2, 0));
} else if (clamp && zoom < 1.0) {
this.x = Math.round((Graphics.boxWidth - Graphics.boxWidth * zoom) / 2);
this.y = Math.round((Graphics.boxHeight - Graphics.boxHeight * zoom) / 2);
} else {
this.x = Math.round(screenX);
this.y = Math.round(screenY);
}
if($gameScreen._shakeDuration % 10 == 0){
$gameScreen._randomRateX = [-1, 0, 1][Math.randomInt(3)];
$gameScreen._randomRateY = [-1, 0, 1][Math.randomInt(3)];
}
this.x += Math.round($gameScreen.shake()*($gameScreen._randomRateX || 1));
this.y += Math.round($gameScreen.shake()*($gameScreen._randomRateY || 1));//震动加Y轴
};
|