加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 怠惰な騎士 于 2017-6-9 12:27 编辑
结论
修改Game_Action.prototype.makeDamageValue来实现对伤害系统的改写。
废话
对RMMV的伤害判定机制进行了初步摸索,基本确定了RMMV的伤害判定流程。
于是在这里将研究成果记录下来,梳理梳理脑子,顺带做个备份避免以后忘了(〃´-ω-) 。
如果发现这里对伤害机制的说明有问题,欢迎指正_(:з」∠)_ 。
启动流程
RMMV需要进入战斗场景并在执行操作时进行伤害计算,其中战斗场景可以通过多种方式进入:
* 地图随机遇敌
* 编辑器测试战斗
* 事件触发战斗
* 通过F8窗口输入脚本手动进入(略)
但无论通过什么方式进入战斗场景,在进入之前都会调用BattleManager.setup完成对战斗数据的配置。
地图随机遇敌
脚本调用顺序:
* Scene_Map.prototype.update
* Scene_Map.prototype.updateScene
* Scene_Map.prototype.updateEncounter
* 进入战斗场景:Scene_Battle
编辑器测试战斗
脚本调用顺序:
* Scene_Boot.prototype.start
* 进入战斗场景:Scene_Battle
事件触发战斗
脚本调用顺序:
* Game_Interpreter.prototype.command301
* 进入战斗场景:Scene_Battle
战斗数据流程
进入战斗场景后,游戏的主逻辑将会开始在Scene_Battle中循环。
Scene_Battle会处理战斗场景的UI表现逻辑。
战斗数据的相关逻辑会被Scene_Battle通过updateBattleProcess转交给BattleManager来推进。
脚本调用顺序(从Scene_Battle到实际演算伤害的代码块):
* Scene_Battle.prototype.update
* Scene_Battle.prototype.updateBattleProcess
* BattleManager.update
* BattleManager.updateAction
* BattleManager.invokeAction
* BattleManager.invokeNormalAction
* Game_Action.prototype.apply
* Game_Action.prototype.makeDamageValue
其中决定回合战斗中,某次战斗所造成的实际伤害的方法是:“Game_Action.prototype.makeDamageValue”。
通过修改Game_Action.prototype.makeDamageValue,就可以实现对伤害系统的改写。
示例
假设现在游戏中需要有一个光和暗的系统,其中光属性的角色可以对暗属性的角色造成双倍伤害,反之伤害减半,则可以通过如下代码来改写:
var makeDamageValue = Game_Action.prototype.makeDamageValue; Game_Action.prototype.makeDamageValue = function(target, critical) { var value = makeDamageValue.call(this, target, critical); value *= this.applyElementType(target); return Math.round(value); // 放置Math.round的位置会影响伤害的精度。 }; Game_Action.prototype.applyElementType = function(target) { var subject = this.subject(); var element_a = subject.elementType(); // elementType是不存在的方法,这里假设elementType可以获取战斗角色的光暗属性 var element_b = target.elementType(); return { "light": { "light": 1, "dark": 2 }, "dark": { "light": 0.5, "dark": 1 }, }[element_a][element_b]; };
var makeDamageValue = Game_Action.prototype.makeDamageValue;
Game_Action.prototype.makeDamageValue = function(target, critical) {
var value = makeDamageValue.call(this, target, critical);
value *= this.applyElementType(target);
return Math.round(value); // 放置Math.round的位置会影响伤害的精度。
};
Game_Action.prototype.applyElementType = function(target) {
var subject = this.subject();
var element_a = subject.elementType(); // elementType是不存在的方法,这里假设elementType可以获取战斗角色的光暗属性
var element_b = target.elementType();
return {
"light": { "light": 1, "dark": 2 },
"dark": { "light": 0.5, "dark": 1 },
}[element_a][element_b];
};
|