004 Proc
那么我们现在来看第三个板块的内容。
这个板块其实就是特性真正发挥作用的地方,特性的代码就是写在这个板块里面的。
在之前的教程中,我们已经是知道了,第一个板块是决定了有哪些Handler,第二个板块是决定了每一个Handler的可用参数。
那么第三个板块呢?
第三个板块其实就是特性真正的代码实现的地方。
在第三个板块中,我们需要使用第二个板块传递的可用参数,在对应的Handler下,写出实现特性所需要的代码。
我们可以大概浏览一下这个板块,很容易就可以发现,在这个板块里,每一个特性大概是这么一个结构——
我们暂且可以把这个结构称为特性实现的基本结构。
如果上面你看着有点晕的话,我们可以修改一下,变成这样——
把这个基本结构的代码都写在同一行,就可以看得比较清楚了。
那么,我们现在来解释一下基本结构里的每一个部分——
Battle::AbilityEffects,这个没什么好说的,之前已经讲到过了,这个就是特性效果模块。
XxxxXxxx,这个就是Handler。
addXXX, proc { |xxx1, xxx2, xxx3| }),这个的意思是,在XxxxXxxx里面,增加一个新的特性效果,新增加的特性效果就是add后面括号里面的内容。
:XXX, proc { |xxx1, xxx2, xxx3| },这个就是新增加的特性效果,这里总共分为两个部分,由逗号分隔开。
:XXX,这个是特性效果的前半部分,是新增加的特性效果的ID,或者说名字,按照它的格式来写,全部英文大写。
proc { |xxx1, xxx2, xxx3| },这个是特性效果的后半部分,是新增加的这个特性的效果,这个效果是怎样的,是由你写的代码来决定的,目前这里没有写任何代码,所以这个特性没有任何效果,也就是说,特性的效果是由proc决定的,特性具有怎样的效果,取决于你在proc部分是怎么写的,proc就是特性效果的处理。
|xxx1, xxx2, xxx3|,这个是proc,也就是特性效果实现所允许使用的参数,这些参数由Handler在第二个板块对应的参数方法决定,目前这里允许使用3个参数,分别是xxx1、xxx2和xxx3。
所以,这个基本结构的意思就是,在Battle::AbilityEffects的XxxxXxxx下新增加一个名字叫做XXX的特性。
另外还需要说一点,那就是,在同一个Handler下,不要添加多个同名的特性。
如果你在同一个Handler下增加了多个同名的特性的话,那么只有最后一个会生效。
那么,既然我们已经清楚了基本结构的每一个部分,现在是时候来实践一下了,那我们就快速写一个新特性——
活力焕发(Lively):每回合开始时,特攻增加1级。
首先,我们需要思考,这个特性需要放在哪个Handler下,对于活力焕发来说,很明显,需要放到StartOfRoundEffect下,那我们就可以直接这样写——
接着,我们还需要特攻增加1级,那么我们怎么才能用代码实现特攻增加1级呢?
很简单,抄!
抄相似的代码!
抄代码并不是什么丢脸的事情,这其实就是一件非常正常的事情。
在刚开始时,这就是学习的最好的方法,说抄我们其实是说得难听点了,其实这种学习方法叫做模仿。
我们需要从模仿开始,不断的学习,一点点的进步。
一开始,你可以只做一些比较简单的效果,等水平上来了之后,你自然也就能做出复杂的特性效果了。
不要一上来就想着做复杂的效果,不要做自己根本就做不到的事情。
你需要知道哪些东西你是会的,你可以轻而易举的做出来,而哪些东西你是不太会的,但是磨一下也能够自己摸索出来;而哪些东西你是根本就不知道如何下手的,你的极限大概在哪里。
而在这里,对于特攻增加1级,我们其实很容易就可以想到好胜,好胜的效果是——当自身的能力被降低时,特攻增加2级。
可以发现,好胜完全就符合我们想要实现的效果,那我们就搜索一下好胜——
不难发现,battler.pbRaiseStatStageByAbilitySPECIAL_ATTACK, 2, battler)这个部分就是特攻增加2级的代码,那么我们只需要把其中的2改成1就可以了,这样——
这样活力焕发的代码就完成了。
这里你会发现,我把新加的这行代码往后挪了一下,它并没有和proc这行对齐,这叫做缩进。
实际上,你缩不缩进对代码的生效都不会产生任何影响,缩进只是为了美观和让代码易于阅读,通过缩进可以非常清楚的看出来,哪一部分代码是在哪一级的。
我希望你能养成缩进的好习惯。
那么,如何缩进呢?
很简单,敲两下空格就行了。
那么,在这里也稍微解释一下battler.pbRaiseStatStageByAbilitySPECIAL_ATTACK, 1, battler)的意思,这一行代码的意思是,对battler调用pbRaiseStatStageByAbility方法。
而pbRaiseStatStageByAbility这个方法是用来增加能力等级的,所以其实就是让battler增加能力等级。
我们可以看到,pbRaiseStatStageByAbility后面是有括号的,也就是说,后面括号里的内容,就是pbRaiseStatStageByAbility这个方法的参数。
某个方法具体可以什么参数、需要什么参数,你需要去定义那个方法的地方去了解。
通过pbRaiseStatStageByAbility这个方法,让battler增加能力等级,那么增加能力等级,具体是什么能力,增加多少级,就是由pbRaiseStatStageByAbility后面括号里传递的参数所决定的。
这里的话是增加特攻,1级。
另外,可能还会有人有疑惑,那么battler是什么意思呢?
对于一些简单的参数,你能够一眼就看出来,并且举一反三,比如:SPECIAL_ATTACK就是指特攻的能力等级,1就是指增加1级,那么后面这个battler呢?
说实话,其实不太能够看出这个battler指的是什么,但是至少在这里,你也只能写battler,因为可用的参数总共就3个,不可能是ability,也不可能是battle。
如果你想要真的了解一个方法做了什么的话,最好的办法就是去看一下这个方法是如何定义的,当然前提是你能看懂。
那么如何找到某一个方法呢?
很简单,全局搜索“def XXX”。
def就是define,就是定义的意思,即定义XXX这个方法;
XXX就是你要搜索的方法的名字,搜索时不需要带后面的参数,比如说这样——
这个就是我们的搜索结果,你只需要双击点进去就可以看到这个方法是怎么定义的了。
可以看到,第三个参数是user,也就是使用者,也就是使用这个方法的精灵。
也就是说,对于pbRaiseStatStageByAbility这个方法来说,可接受3-4个参数,你只允许使用3个或者4个参数,并且参数的顺序是严格一一对应的,你不能多用,也不能少用。
如果使用的参数的数量不对,那么就会报错,比如说,我们把前面这个特性的代码改一下,接着运行——
我们加上一点东西——
①,可用的参数数。
②,你用了的参数数。
③,错误发生的方法。
④,发生错误的方法所在的文件。
⑤,发生错误的方法所在的文件的行数。
这里的意思就是,pbRaiseStatStageByAbility允许接受3-4个参数,但是你用了5个。
但是,这个方法本身并不会错,只能是你调用这个方法传递参数过去的时候错了,所以——
你需要再往下面看,发生错误的文件为①特性效果文件,行数为②第3223行,那我们就找到相应的地方——
可以看到,这里传递了5个参数,所以才报错了。
那么我们继续回来,很明显,活力焕发这个特性,是精灵自身通过活力焕发,让自身的能力等级提高。
所以第三个参数应该是battler。
这里的话可能有同学会有疑问,为什么battler就代表自身呢?
这个问题我们会在下一篇教程中解答。
那么我们继续,我之前说全局搜索什么什么,实际上全局搜索这个词在之前的教程中也出现了,但是可能有些同学还是不太清楚是什么意思。
全局搜索的意思,是在提供的所有文件中,搜索你写的关键词。
它和普通搜索的区别在于,普通搜索只搜索当前文件,全局搜索会搜索所有提供的文件,即一整个目录,或者说文件夹。
我们来看这个图——
①,普通搜索;
②,全局搜索;
③,搜索所使用的关键词;
④,全局搜索的文件夹。
可能还会有人有疑问,那么怎么打开这个对话框呢?
很简单,使用快捷键Ctrl + F(普通搜索),或者Ctrl + Shift + F(全局搜索)。
这里需要注意,你最好不要在中文输入法的时候使用这两个快捷键,可能会无效。
说了这么多,那么请思考,现在活力焕发在战斗中会生效吗?
答案其实是不会。
我们在前面的教程中其实也已经是说过了,我们还需要在“其他的地方需要完善代码才能使StartOfRoundEffect生效”,现在是活力焕发这个特性本身没有问题,但是活力焕发所在的StartOfRoundEffect并没有接入到战斗系统中,我们还需要把它接入到战斗系统中,才能使这个Handler里面的特性在战斗中生效。
那么,关于如何把Handler接入到战斗系统中,我们将在下期教程中讲解。
感谢阅读。
那么我们现在来看第三个板块的内容。
这个板块其实就是特性真正发挥作用的地方,特性的代码就是写在这个板块里面的。
在之前的教程中,我们已经是知道了,第一个板块是决定了有哪些Handler,第二个板块是决定了每一个Handler的可用参数。
那么第三个板块呢?
第三个板块其实就是特性真正的代码实现的地方。
在第三个板块中,我们需要使用第二个板块传递的可用参数,在对应的Handler下,写出实现特性所需要的代码。
我们可以大概浏览一下这个板块,很容易就可以发现,在这个板块里,每一个特性大概是这么一个结构——
我们暂且可以把这个结构称为特性实现的基本结构。
如果上面你看着有点晕的话,我们可以修改一下,变成这样——
把这个基本结构的代码都写在同一行,就可以看得比较清楚了。
那么,我们现在来解释一下基本结构里的每一个部分——
Battle::AbilityEffects,这个没什么好说的,之前已经讲到过了,这个就是特性效果模块。
XxxxXxxx,这个就是Handler。
addXXX, proc { |xxx1, xxx2, xxx3| }),这个的意思是,在XxxxXxxx里面,增加一个新的特性效果,新增加的特性效果就是add后面括号里面的内容。
:XXX, proc { |xxx1, xxx2, xxx3| },这个就是新增加的特性效果,这里总共分为两个部分,由逗号分隔开。
:XXX,这个是特性效果的前半部分,是新增加的特性效果的ID,或者说名字,按照它的格式来写,全部英文大写。
proc { |xxx1, xxx2, xxx3| },这个是特性效果的后半部分,是新增加的这个特性的效果,这个效果是怎样的,是由你写的代码来决定的,目前这里没有写任何代码,所以这个特性没有任何效果,也就是说,特性的效果是由proc决定的,特性具有怎样的效果,取决于你在proc部分是怎么写的,proc就是特性效果的处理。
|xxx1, xxx2, xxx3|,这个是proc,也就是特性效果实现所允许使用的参数,这些参数由Handler在第二个板块对应的参数方法决定,目前这里允许使用3个参数,分别是xxx1、xxx2和xxx3。
所以,这个基本结构的意思就是,在Battle::AbilityEffects的XxxxXxxx下新增加一个名字叫做XXX的特性。
另外还需要说一点,那就是,在同一个Handler下,不要添加多个同名的特性。
如果你在同一个Handler下增加了多个同名的特性的话,那么只有最后一个会生效。
那么,既然我们已经清楚了基本结构的每一个部分,现在是时候来实践一下了,那我们就快速写一个新特性——
活力焕发(Lively):每回合开始时,特攻增加1级。
首先,我们需要思考,这个特性需要放在哪个Handler下,对于活力焕发来说,很明显,需要放到StartOfRoundEffect下,那我们就可以直接这样写——
接着,我们还需要特攻增加1级,那么我们怎么才能用代码实现特攻增加1级呢?
很简单,抄!
抄相似的代码!
抄代码并不是什么丢脸的事情,这其实就是一件非常正常的事情。
在刚开始时,这就是学习的最好的方法,说抄我们其实是说得难听点了,其实这种学习方法叫做模仿。
我们需要从模仿开始,不断的学习,一点点的进步。
一开始,你可以只做一些比较简单的效果,等水平上来了之后,你自然也就能做出复杂的特性效果了。
不要一上来就想着做复杂的效果,不要做自己根本就做不到的事情。
你需要知道哪些东西你是会的,你可以轻而易举的做出来,而哪些东西你是不太会的,但是磨一下也能够自己摸索出来;而哪些东西你是根本就不知道如何下手的,你的极限大概在哪里。
而在这里,对于特攻增加1级,我们其实很容易就可以想到好胜,好胜的效果是——当自身的能力被降低时,特攻增加2级。
可以发现,好胜完全就符合我们想要实现的效果,那我们就搜索一下好胜——
不难发现,battler.pbRaiseStatStageByAbilitySPECIAL_ATTACK, 2, battler)这个部分就是特攻增加2级的代码,那么我们只需要把其中的2改成1就可以了,这样——
这样活力焕发的代码就完成了。
这里你会发现,我把新加的这行代码往后挪了一下,它并没有和proc这行对齐,这叫做缩进。
实际上,你缩不缩进对代码的生效都不会产生任何影响,缩进只是为了美观和让代码易于阅读,通过缩进可以非常清楚的看出来,哪一部分代码是在哪一级的。
我希望你能养成缩进的好习惯。
那么,如何缩进呢?
很简单,敲两下空格就行了。
那么,在这里也稍微解释一下battler.pbRaiseStatStageByAbilitySPECIAL_ATTACK, 1, battler)的意思,这一行代码的意思是,对battler调用pbRaiseStatStageByAbility方法。
而pbRaiseStatStageByAbility这个方法是用来增加能力等级的,所以其实就是让battler增加能力等级。
我们可以看到,pbRaiseStatStageByAbility后面是有括号的,也就是说,后面括号里的内容,就是pbRaiseStatStageByAbility这个方法的参数。
某个方法具体可以什么参数、需要什么参数,你需要去定义那个方法的地方去了解。
通过pbRaiseStatStageByAbility这个方法,让battler增加能力等级,那么增加能力等级,具体是什么能力,增加多少级,就是由pbRaiseStatStageByAbility后面括号里传递的参数所决定的。
这里的话是增加特攻,1级。
另外,可能还会有人有疑惑,那么battler是什么意思呢?
对于一些简单的参数,你能够一眼就看出来,并且举一反三,比如:SPECIAL_ATTACK就是指特攻的能力等级,1就是指增加1级,那么后面这个battler呢?
说实话,其实不太能够看出这个battler指的是什么,但是至少在这里,你也只能写battler,因为可用的参数总共就3个,不可能是ability,也不可能是battle。
如果你想要真的了解一个方法做了什么的话,最好的办法就是去看一下这个方法是如何定义的,当然前提是你能看懂。
那么如何找到某一个方法呢?
很简单,全局搜索“def XXX”。
def就是define,就是定义的意思,即定义XXX这个方法;
XXX就是你要搜索的方法的名字,搜索时不需要带后面的参数,比如说这样——
这个就是我们的搜索结果,你只需要双击点进去就可以看到这个方法是怎么定义的了。
可以看到,第三个参数是user,也就是使用者,也就是使用这个方法的精灵。
也就是说,对于pbRaiseStatStageByAbility这个方法来说,可接受3-4个参数,你只允许使用3个或者4个参数,并且参数的顺序是严格一一对应的,你不能多用,也不能少用。
如果使用的参数的数量不对,那么就会报错,比如说,我们把前面这个特性的代码改一下,接着运行——
我们加上一点东西——
①,可用的参数数。
②,你用了的参数数。
③,错误发生的方法。
④,发生错误的方法所在的文件。
⑤,发生错误的方法所在的文件的行数。
这里的意思就是,pbRaiseStatStageByAbility允许接受3-4个参数,但是你用了5个。
但是,这个方法本身并不会错,只能是你调用这个方法传递参数过去的时候错了,所以——
你需要再往下面看,发生错误的文件为①特性效果文件,行数为②第3223行,那我们就找到相应的地方——
可以看到,这里传递了5个参数,所以才报错了。
那么我们继续回来,很明显,活力焕发这个特性,是精灵自身通过活力焕发,让自身的能力等级提高。
所以第三个参数应该是battler。
这里的话可能有同学会有疑问,为什么battler就代表自身呢?
这个问题我们会在下一篇教程中解答。
那么我们继续,我之前说全局搜索什么什么,实际上全局搜索这个词在之前的教程中也出现了,但是可能有些同学还是不太清楚是什么意思。
全局搜索的意思,是在提供的所有文件中,搜索你写的关键词。
它和普通搜索的区别在于,普通搜索只搜索当前文件,全局搜索会搜索所有提供的文件,即一整个目录,或者说文件夹。
我们来看这个图——
①,普通搜索;
②,全局搜索;
③,搜索所使用的关键词;
④,全局搜索的文件夹。
可能还会有人有疑问,那么怎么打开这个对话框呢?
很简单,使用快捷键Ctrl + F(普通搜索),或者Ctrl + Shift + F(全局搜索)。
这里需要注意,你最好不要在中文输入法的时候使用这两个快捷键,可能会无效。
说了这么多,那么请思考,现在活力焕发在战斗中会生效吗?
答案其实是不会。
我们在前面的教程中其实也已经是说过了,我们还需要在“其他的地方需要完善代码才能使StartOfRoundEffect生效”,现在是活力焕发这个特性本身没有问题,但是活力焕发所在的StartOfRoundEffect并没有接入到战斗系统中,我们还需要把它接入到战斗系统中,才能使这个Handler里面的特性在战斗中生效。
那么,关于如何把Handler接入到战斗系统中,我们将在下期教程中讲解。
感谢阅读。