015 Example:Dragon Break
这期教程,我们继续来讲解特性实例。
那么,这期教程我们要讲解的是斩龙。
斩龙(Dragon Break):攻击时,将目标视为龙属性。
首先是PBS部分——

关于这个特性,我的第一感觉就是,可以按照破格来做,因为它也是仅仅只是在攻击时生效的。
那我们就动手吧——

接着初始化——

接着按照破格的逻辑——


我们暂且把这个效果称为属性破坏效果。
也就是说,斩龙依赖于属性破坏效果,并且,战龙属于属性破坏类效果。
属性破坏类效果就是在攻击时将目标视为某某属性的这么一类效果。
也就是说,我们新创造了一类效果。
接着——

通过这个方法来开启属性破坏效果。
现在,属性破坏效果有了,那么接着就是如何应用这个效果了——
我们需要搞清楚两点,一,对谁应用;二,怎么应用。
先来看第一点,对谁应用。
这一点很简单,当然是对目标应用。
所以,我们可以在属性破坏效果开启后就对目标应用——

就是这一行代码targets.each { |b| b.typeBreakType(user) if @battle.typeBreak }。
因为技能不一定只有一个目标,所以我们要对所有目标应用属性破坏效果。
事实上,你也只能使用targets,用不了target。
这一行代码的意思就是,当属性破坏效果开启时,对所有目标应用属性破坏效果。
其实,属性破坏效果是通过typeBreakType(user)这个方法来实现的。
这里,出现了xxx.each { |a| a.yyy if zzz }这样的格式。
这里其实是迭代,或者说循环,或者说遍历,就是对xxx里的每一个元素做同样的处理。
也就是说,xxx是一个数组,我们用a来指代xxx里面的每一个元素,当zzz时候,就对a调用yyy方法。
xxx.each { |a| a.yyy if zzz }也可以写成——
你要写的完整一点的话就是这样——
这两种写法,一种只需要一行,一种是分了多行。
我不能说它们是完全一模一样的,但是,你就当它们是完全一模一样的就好了。
当用一行就可以写完的时候,你可以直接一行写完;当你想要代码更好理解的话,你可以用多行的,并且是最完整的这种写法,并且,我也推荐你用这种。
那么我们回来,实际上,我们把怎么应用,也就是第二点,也差不多讲完了。
怎么应用其实就是看typeBreakType(user)这个方法是怎么写的——

这里的话,是通过检查技能的使用者是否有某一个特性,进而来决定技能的目标的@breakType这个变量的值。
也就是说,我们是新加了一个基于battler的变量@breakType,用来记录被属性破坏之后的属性。
所以,我们把这个变量的前两步补齐——


那么就还剩最后一步了,那就是应用这个被属性破坏之后的属性。
找到pbTypes这个方法——

增加上这一行代码——

pbTypes这个方法就是在计算精灵的属性的时候用的。
也就是说,我们只需要在计算精灵的属性的时候,直接使用我们之前保存在@breakType中的数据就好了。
这一行return @typeBreak if @typeBreak && @battle.typeBreak的这种写法,还有一个好处是,因为pbTypes这个方法会在很多地方、很多时候被调用,但是,我们其实并不需要知道它会在什么地方、什么时候被调用。
因为这个方法只有在@breakType本身有数据,并且场上存在属性破坏效果的时候,才会使用@breakType的数据计算属性。
当场上没有属性破坏效果时,精灵并不会被属性破坏。
另外,通过这两个方法,可以更加方便的管理和添加新的属性破坏类特性——

比如说这样——
这里我又新加了一个属性破坏类特性XXX,这个特性的精灵在攻击时,会将目标的属性视为水属性和火属性。
现在,我们来总结一下——
首先,由技能的使用者是否有某个特性来确定场上是否存在属性破坏效果;
接着,当场上存在属性破坏效果时,对所有目标应用属性破坏。
这期教程,我们继续来讲解特性实例。
那么,这期教程我们要讲解的是斩龙。
斩龙(Dragon Break):攻击时,将目标视为龙属性。
首先是PBS部分——

关于这个特性,我的第一感觉就是,可以按照破格来做,因为它也是仅仅只是在攻击时生效的。
那我们就动手吧——

接着初始化——

接着按照破格的逻辑——


我们暂且把这个效果称为属性破坏效果。
也就是说,斩龙依赖于属性破坏效果,并且,战龙属于属性破坏类效果。
属性破坏类效果就是在攻击时将目标视为某某属性的这么一类效果。
也就是说,我们新创造了一类效果。
接着——

通过这个方法来开启属性破坏效果。
现在,属性破坏效果有了,那么接着就是如何应用这个效果了——
我们需要搞清楚两点,一,对谁应用;二,怎么应用。
先来看第一点,对谁应用。
这一点很简单,当然是对目标应用。
所以,我们可以在属性破坏效果开启后就对目标应用——

就是这一行代码targets.each { |b| b.typeBreakType(user) if @battle.typeBreak }。
因为技能不一定只有一个目标,所以我们要对所有目标应用属性破坏效果。
事实上,你也只能使用targets,用不了target。
这一行代码的意思就是,当属性破坏效果开启时,对所有目标应用属性破坏效果。
其实,属性破坏效果是通过typeBreakType(user)这个方法来实现的。
这里,出现了xxx.each { |a| a.yyy if zzz }这样的格式。
这里其实是迭代,或者说循环,或者说遍历,就是对xxx里的每一个元素做同样的处理。
也就是说,xxx是一个数组,我们用a来指代xxx里面的每一个元素,当zzz时候,就对a调用yyy方法。
xxx.each { |a| a.yyy if zzz }也可以写成——
你要写的完整一点的话就是这样——
这两种写法,一种只需要一行,一种是分了多行。
我不能说它们是完全一模一样的,但是,你就当它们是完全一模一样的就好了。
当用一行就可以写完的时候,你可以直接一行写完;当你想要代码更好理解的话,你可以用多行的,并且是最完整的这种写法,并且,我也推荐你用这种。
那么我们回来,实际上,我们把怎么应用,也就是第二点,也差不多讲完了。
怎么应用其实就是看typeBreakType(user)这个方法是怎么写的——

这里的话,是通过检查技能的使用者是否有某一个特性,进而来决定技能的目标的@breakType这个变量的值。
也就是说,我们是新加了一个基于battler的变量@breakType,用来记录被属性破坏之后的属性。
所以,我们把这个变量的前两步补齐——


那么就还剩最后一步了,那就是应用这个被属性破坏之后的属性。
找到pbTypes这个方法——

增加上这一行代码——

pbTypes这个方法就是在计算精灵的属性的时候用的。
也就是说,我们只需要在计算精灵的属性的时候,直接使用我们之前保存在@breakType中的数据就好了。
这一行return @typeBreak if @typeBreak && @battle.typeBreak的这种写法,还有一个好处是,因为pbTypes这个方法会在很多地方、很多时候被调用,但是,我们其实并不需要知道它会在什么地方、什么时候被调用。
因为这个方法只有在@breakType本身有数据,并且场上存在属性破坏效果的时候,才会使用@breakType的数据计算属性。
当场上没有属性破坏效果时,精灵并不会被属性破坏。
另外,通过这两个方法,可以更加方便的管理和添加新的属性破坏类特性——

比如说这样——
这里我又新加了一个属性破坏类特性XXX,这个特性的精灵在攻击时,会将目标的属性视为水属性和火属性。
现在,我们来总结一下——
首先,由技能的使用者是否有某个特性来确定场上是否存在属性破坏效果;
接着,当场上存在属性破坏效果时,对所有目标应用属性破坏。