我对这个问题很生气.好吧,让我们开始吧.我想根据存储在MySQL数据库中的级别为不同的Minecraft事件添加一些修饰符(例如在EntityDamageByEntityEvent中处理多少损坏).
这个级别系统将有99个级别(1到100),默认级别为50; 例如,在EntityDamageByEntityEvent的情况下,我想更改损坏,所以:
a)如果玩家的等级为50,则不会修改损坏(只会乘以1).
b)如果玩家有1级,则所处的伤害将乘以1/3.
c)如果玩家的等级为100,那么伤害将被提高3.
到目前为止,这么好,但是对于17或89等级的玩家,我怎么能这样做呢?我想知道的是如何转换,比方说,1/100比例在1比3比3,比如50 = 1 ......有点介意......提前谢谢,希望你能理解我!
如果您在图表上绘制点 (1, 1/3)、(50, 1) 和 (100, 3),您会发现它们没有形成一条线。因此,尚不清楚你的伤害修正函数在这些点之间应如何表现。
您可以采用分段线性方式,从 1 到 50 和(分别)从 50 到 100 进行线性插值:
final float scalingFactor;
if (level < 50) {
// Convert (1..50) range into (0..1) range.
final float interp = (level - 1) / 49.0;
// Convert (0..1) range into (1/3..3/3) range.
scalingFactor = ((interp * 2.0) + 1.0) / 3.0;
}
else {
// Convert (50..100) range into (0..1) range.
final float interp = (level - 50) / 50.0;
// Convert (0..1) range into (1..3) range.
scalingFactor = (interp * 2.0) + 1.0;
}
return damage * scalingFactor;
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意将 1/3 伤害设为 0 级而不是 1 级,则可以使用指数函数:
// Convert (0..100) range into (-1..+1) range.
final float interp = (level - 50) / 50.0;
// 3^(-1) == 1/3
// 3^0 == 1
// 3^(+1) == 3
final float scalingFactor = Math.pow(3.0, interp);
return damage * scalingFactor;
Run Code Online (Sandbox Code Playgroud)
使用分段线性方法,从一个级别到下一个级别的伤害差异对于 1 到 50 级之间是相同的,对于 50 到 100 级之间也是如此,但从 50 级到 51 级之间的伤害差异明显更大比从49级到50级。
指数函数为您提供了一条平滑的曲线,其中每个级别的伤害差异在整个范围内逐渐增加。