019 Example:Overgrow EX
这期教程,我们继续来讲解特性实例。
那么,这期教程我们要讲解的是茂盛EX。
茂盛EX(Overgrow EX)——
当使用草属性技能攻击时,自身每损失10%的HP,该技能的威力就增加5%;
当损失的HP达到95%时,技能威力增加50%。
这个特性来自Exceeded,也就是EE——

首先是PBS部分——

这是原本茂盛的代码——

关于这个特性,总的来说就是加强了一下原本的特性,原本的特性实在是太鸡肋了,你也可以照着这期教程里的内容,把御三家的特性都改成这种类型的。
这个特性主要的就是把增加伤害和自身的HP联系了起来,让它变成了随动,而不是固定,自身的HP越少,自身的伤害就越高。
那我们现在就来看一下这个特性写好之后的代码吧——

我们来看一下,简单的说就是10%的HP对应5%的技能威力加成;
但是,这样的话,最多只能增加9段,9 * 10% = 90%,也就是说,最多只能增加45%的技能威力;
因此,在最后的10%的HP的时候,只要损失5%的HP,就增加5%的技能威力。
同时,这个特性增加技能威力是分段数的,每10%HP为1段,不足10%不参与计算,比如说损失了25%的HP,那么此时只有2段,所以此时技能威力增加10%。
当然,这个特性本身并不难,主要是想通过这个特性,来讲解一些细节上面的东西。
首先,通过这一行type == :GRASS,检查使用的技能是不是草属性,如果是草属性,再往下处理。
那么,如果我想让多个属性的技能都增加威力,该怎么办?
很简单,当涉及到“多个”的时候,我们只需要使用数组就好了。
比如说这样[:GRASS, :WATER]。
那么该如何检查呢,可以直接这样嘛type == [:GRASS, :WATER]?
绝对不行,这样的做法大错特错。
因为type是一个单独的属性,而[:GRASS, :WATER]是一个数组,一个单独的属性怎么能是一个数组呢。
我们其实是需要检查type的这个属性,是否在数组里面。
那么怎么做呢?
很简单,使用include?就好了,这样[:GRASS, :WATER].include?(type),意思就是前面这个数组里面的元素是否包括type。
接着,通过missing_hp_percentage = ((user.totalhp - user.hp).to_f / user.totalhp) * 100来得到当前损失的HP的百分比。
其中,user.totalhp表示总HP;user.hp表示当前的HP;这里需要注意的就是这个to_f了,这里是将user.totalhp - user.hp结果转换成浮点数的意思。
这是因为,在计算除法时,如果分子和分母都是整数,那么将会应用整数除法,但是,只要分子或者是分母中有任意一个是浮点数,那么就会应用浮点数除法。
它们的区别就在于,整数除法会直接舍弃小数点后面的数。
比如说,对于90除以100,整数除法的结果是0,而浮点数除法的结果才是0.9。
所以,对于我们这里的代码,这里必须使用浮点数除法,因为这里是一个百分数,是零点多少多少,如果使用整数除法,那么结果始终是0。
那么,怎么让程序应用浮点数除法呢?
对于一个变量,你可以使用to_f,而对于一个整数,你可以直接在后面加个“.0”。
比如90 / 100和90.0 / 100,前者是整数除法,结果是0,后者是浮点数除法,结果是0.9。
接着,我们通过对missing_hp_percentage分情况处理,分了两种情况,分别是大于等于95的情况,和小于95的情况。
当然,这里没有直接写小于95的情况,而是使用了else,因为第一个if是大于等于95的情况,那么其他情况就只能是小于95的情况。
同时,这里出现了>=,这个和==一样,是比较,>=就是大于或者等于;同理,<=就是小于或者等于。
当missing_hp_percentage >= 95时,直接multiplier = 1.5;
当missing_hp_percentage < 95时,通过计算得到multiplier。
那么,怎么计算呢?
首先,通过stages = (missing_hp_percentage / 10).floor得到技能威力增加的段数。
这里出现了floor,这个是取整的意思,因为这里的段数必定是一个整数,必定是1段、2段和3段,等等,这样,是不可能出现1.5段、2.3段和3.4段,等等,的这种情况的,所以我们需要取整。
接着就简单了,通过boost = stages * 0.05计算出总的提升的技能威力。
最后,让multiplier = 1 + boost。
这个时候,其实还应该思考一下极限的情况,那就是,如果失去的HP小于10%会怎么样,代码能不能兼容不提升技能威力的情况。
经过检查,显然是可以的,因为如果失去的HP小于10%,那么boost就是0,也就是最终multiplier是1,所以代码是兼容的,就算不提升技能威力也不会报错。
当然,你也可以在一开始就检查要求自身的HP必须小于等于90%时才会发动这个特性。
那么,通过两种情况,都能得到一个multiplier。
最后,我们还要通过mults[
ower_multiplier] *= multiplier应用这个multiplier。
这里的话还需要重点强调一下,在计算伤害时,是有4种multiplier的。
分别是,power_multiplier、attack_multiplier、final_damage_multiplier和defense_multiplier。
这4个是不一样的,我们可以来看一下这里——

这个方法是用来伤害计算的。
所以,我们可以清楚的看到——
power_multiplier指的是技能的威力。
attack_multiplier指的是攻击力,注意是攻击力,不是攻击,也不是物攻,就是攻击力,攻击力同时作用于物攻和特攻。
final_damage_multiplier指的是最终伤害。
defense_multiplier指的是防御力,同样的,防御力同时作用于物防和特防。
这些multiplier中,其中power_multiplier、attack_multiplier计算的是攻击方的技能威力和攻击力;defense_multiplier计算的是被击方的防御力。
这其实也很容易理解,如果defense_multiplier计算的是攻击方的话,在自身进行攻击时,改变自身的防御力,这是没有意义的。
根据我们这个特性的描述,增加伤害是通过增加技能威力实现的,所以我们这里应该要使用的是power_multiplier,而不是attack_multiplier。
这边还是需要额外提一下,目前,power_multiplier和attack_multiplier没有任何区别,你可以混淆使用。
但是,你自己一定要知道,技能威力是技能威力,攻击力是攻击力,这是两个完全不一样的东西。
还有一点是保持统一,就是不要你特性描述是增加攻击力,但是内部的代码却是增加技能威力,反过来也一样;
最好保持统一,特性描述里写的增加什么,代码的实现也用相应的multiplier,不要混用。
最后还有一点,multiplier的改变只会发生在计算伤害时,并且不会改变原本的技能威力、物攻、特攻、物防和特防,等等。
所以,技术高手是不会受到power_multiplier的影响的。
那么,请自行进入游戏中测试这个特性。
那么这期教程就到此为止。
感谢阅读。
这期教程,我们继续来讲解特性实例。
那么,这期教程我们要讲解的是茂盛EX。
茂盛EX(Overgrow EX)——
当使用草属性技能攻击时,自身每损失10%的HP,该技能的威力就增加5%;
当损失的HP达到95%时,技能威力增加50%。
这个特性来自Exceeded,也就是EE——

首先是PBS部分——

这是原本茂盛的代码——

关于这个特性,总的来说就是加强了一下原本的特性,原本的特性实在是太鸡肋了,你也可以照着这期教程里的内容,把御三家的特性都改成这种类型的。
这个特性主要的就是把增加伤害和自身的HP联系了起来,让它变成了随动,而不是固定,自身的HP越少,自身的伤害就越高。
那我们现在就来看一下这个特性写好之后的代码吧——

我们来看一下,简单的说就是10%的HP对应5%的技能威力加成;
但是,这样的话,最多只能增加9段,9 * 10% = 90%,也就是说,最多只能增加45%的技能威力;
因此,在最后的10%的HP的时候,只要损失5%的HP,就增加5%的技能威力。
同时,这个特性增加技能威力是分段数的,每10%HP为1段,不足10%不参与计算,比如说损失了25%的HP,那么此时只有2段,所以此时技能威力增加10%。
当然,这个特性本身并不难,主要是想通过这个特性,来讲解一些细节上面的东西。
首先,通过这一行type == :GRASS,检查使用的技能是不是草属性,如果是草属性,再往下处理。
那么,如果我想让多个属性的技能都增加威力,该怎么办?
很简单,当涉及到“多个”的时候,我们只需要使用数组就好了。
比如说这样[:GRASS, :WATER]。
那么该如何检查呢,可以直接这样嘛type == [:GRASS, :WATER]?
绝对不行,这样的做法大错特错。
因为type是一个单独的属性,而[:GRASS, :WATER]是一个数组,一个单独的属性怎么能是一个数组呢。
我们其实是需要检查type的这个属性,是否在数组里面。
那么怎么做呢?
很简单,使用include?就好了,这样[:GRASS, :WATER].include?(type),意思就是前面这个数组里面的元素是否包括type。
接着,通过missing_hp_percentage = ((user.totalhp - user.hp).to_f / user.totalhp) * 100来得到当前损失的HP的百分比。
其中,user.totalhp表示总HP;user.hp表示当前的HP;这里需要注意的就是这个to_f了,这里是将user.totalhp - user.hp结果转换成浮点数的意思。
这是因为,在计算除法时,如果分子和分母都是整数,那么将会应用整数除法,但是,只要分子或者是分母中有任意一个是浮点数,那么就会应用浮点数除法。
它们的区别就在于,整数除法会直接舍弃小数点后面的数。
比如说,对于90除以100,整数除法的结果是0,而浮点数除法的结果才是0.9。
所以,对于我们这里的代码,这里必须使用浮点数除法,因为这里是一个百分数,是零点多少多少,如果使用整数除法,那么结果始终是0。
那么,怎么让程序应用浮点数除法呢?
对于一个变量,你可以使用to_f,而对于一个整数,你可以直接在后面加个“.0”。
比如90 / 100和90.0 / 100,前者是整数除法,结果是0,后者是浮点数除法,结果是0.9。
接着,我们通过对missing_hp_percentage分情况处理,分了两种情况,分别是大于等于95的情况,和小于95的情况。
当然,这里没有直接写小于95的情况,而是使用了else,因为第一个if是大于等于95的情况,那么其他情况就只能是小于95的情况。
同时,这里出现了>=,这个和==一样,是比较,>=就是大于或者等于;同理,<=就是小于或者等于。
当missing_hp_percentage >= 95时,直接multiplier = 1.5;
当missing_hp_percentage < 95时,通过计算得到multiplier。
那么,怎么计算呢?
首先,通过stages = (missing_hp_percentage / 10).floor得到技能威力增加的段数。
这里出现了floor,这个是取整的意思,因为这里的段数必定是一个整数,必定是1段、2段和3段,等等,这样,是不可能出现1.5段、2.3段和3.4段,等等,的这种情况的,所以我们需要取整。
接着就简单了,通过boost = stages * 0.05计算出总的提升的技能威力。
最后,让multiplier = 1 + boost。
这个时候,其实还应该思考一下极限的情况,那就是,如果失去的HP小于10%会怎么样,代码能不能兼容不提升技能威力的情况。
经过检查,显然是可以的,因为如果失去的HP小于10%,那么boost就是0,也就是最终multiplier是1,所以代码是兼容的,就算不提升技能威力也不会报错。
当然,你也可以在一开始就检查要求自身的HP必须小于等于90%时才会发动这个特性。
那么,通过两种情况,都能得到一个multiplier。
最后,我们还要通过mults[
这里的话还需要重点强调一下,在计算伤害时,是有4种multiplier的。
分别是,power_multiplier、attack_multiplier、final_damage_multiplier和defense_multiplier。
这4个是不一样的,我们可以来看一下这里——

这个方法是用来伤害计算的。
所以,我们可以清楚的看到——
power_multiplier指的是技能的威力。
attack_multiplier指的是攻击力,注意是攻击力,不是攻击,也不是物攻,就是攻击力,攻击力同时作用于物攻和特攻。
final_damage_multiplier指的是最终伤害。
defense_multiplier指的是防御力,同样的,防御力同时作用于物防和特防。
这些multiplier中,其中power_multiplier、attack_multiplier计算的是攻击方的技能威力和攻击力;defense_multiplier计算的是被击方的防御力。
这其实也很容易理解,如果defense_multiplier计算的是攻击方的话,在自身进行攻击时,改变自身的防御力,这是没有意义的。
根据我们这个特性的描述,增加伤害是通过增加技能威力实现的,所以我们这里应该要使用的是power_multiplier,而不是attack_multiplier。
这边还是需要额外提一下,目前,power_multiplier和attack_multiplier没有任何区别,你可以混淆使用。
但是,你自己一定要知道,技能威力是技能威力,攻击力是攻击力,这是两个完全不一样的东西。
还有一点是保持统一,就是不要你特性描述是增加攻击力,但是内部的代码却是增加技能威力,反过来也一样;
最好保持统一,特性描述里写的增加什么,代码的实现也用相应的multiplier,不要混用。
最后还有一点,multiplier的改变只会发生在计算伤害时,并且不会改变原本的技能威力、物攻、特攻、物防和特防,等等。
所以,技术高手是不会受到power_multiplier的影响的。
那么,请自行进入游戏中测试这个特性。
那么这期教程就到此为止。
感谢阅读。