魔塔样板用的是前一种方法,可能原因是方便管理。于是我们就也用第一种方法进行。这样,在生成产品的时候,需要告诉它敌人的编号。于是我们就把initialize部分改成:
def initialize(enemy_id)
end
enemy_id就是我们输入的敌人编号,以后在计算的时候也会用到这个编号。当然如果你要换成其他的名字,比如eid,也是可以的,只要在后面涉及这个名字的时候全部统一就行了。
为什么还不切入主题呢?那么,我们就先把initialize放一下,去研究如何才能计算出敌人的伤害。在def initialize…end后面换一行,加上:
def cal_damage
end
cal_damage就是计算伤害的方法。说了这么多,可能会问:我从刚才的内容中只知道class里面要套def,那么def是什么意思呢?def是定义方法的关键词,也就是说,获得了类的实例产品后,它有哪些功能。它有了这些功能你才能用它去实现你的目的,比如计算。
现在我们可以把目光集中到def
cal_damage … end的内部了。刚才说过,计算伤害有三个步骤。我们先从第一步获取能力开始。按照魔塔样板的惯例,也为了方便编辑,角色的能力我们就从默认角色的力量、灵巧等属性读取,敌人的能力就从数据库中敌人的各种信息读取。
在魔塔样板中,通常会看到这样一句话:
$game_actors[$game_variables[1]+1].hp/str/dex/……
$game_actors[n]就是代表第n号角色,后面.str等等表明了角色的哪一条信息。相信很多制作者已经对这方面有了解了。但是,初遇这个的制作者可能会问,下划线和点有什么区别呢?
下划线可以理解为连接符号,前面和后面属于一个整体,也就是说$game_actors是一个整体来看的。点表示访问属性或者方法,可以理解成从前面的对象中取出一个特定的属性或者特定的方法。为了方便理解,点读成“的”有的时候也能理解脚本的意思。比如
$game_actors[1].hp = 3 可以读成:游戏角色第一号的生命成为(变成或者赋予)3。至于前面的$符号,下面将会讲解到相关的内容。
为了方便大家参考,我们假定这部魔塔只有一个角色,如果掌握了以后制作多角色的也同样没问题。并且,假设游戏中用到的角色是1号(也就是默认的阿尔西斯)。那么我们的角色当然就是$game_actors[1]。同样,按照惯例,力量和灵巧分别代表角色的攻击和防御,那么就可以得到下面两行脚本:
actor_atk = $game_actors[1].str
actor_def = $game_actors[1].dex
actor_atk和actor_def是计算过程中会使用到的变量,每次写$XXXXXX总让人觉得有点麻烦,并且以后可能会添加敌人属性,比如让角色防御暂时下降50%一类,那么直接改$game_actors[1].dex,战斗后角色防御力就永远下降了,最后再加一条语句恢复倒是也行,不过总让人觉得很麻烦。
角色到这里应该没问题了,接下来是敌人。敌人的攻击防御肯定也是要了,并且敌人要加上生命。为什么不计算主角的生命呢?在计算的时候,我们就假设主角的生命是无穷多的,主角永远能够继续战斗下去,直到敌人被打败,经过计算得到一个总的伤害。如果事实上角色没有那么强,总的伤害已经超过角色的生命了,那么再去执行角色死亡游戏结束的事件。敌人从数据库中读取,假设敌人的ID是1号,那么下面需要的脚本就是:
enemy_hp = $data_enemies[1].hp
enemy_atk = $data_enemies[1].atk
enemy_def = $data_enemies[1].pdef
注意,这里用的属性是pdef,因为数据库中敌人除了pdef物理防御外还有魔法防御,而魔法防御是我么你用不上的。
但是,我们需要的敌人不一定是1号啊。魔塔中那么多敌人,如果像上面那样写,就永远只能获得1号敌人的能力了。怎么办,要把cal_damage后面也加个括号也加个enemy_id么?
没有那么麻烦。回到initialize上,现在initialize里面还是空白,一行代码也没有。于是,我们就加一行:
@enemy_id = enemy_id
可能你会说,为什么这里出现两个enemy_id了,不会出错么?另外那个@符号在这里使用是什么原因呢?
首先,@enemy_id和enemy_id是两个不同的东西。enemy_id是我们刚才通过initialize后面的括号传送进去的敌人编号,@enemy_id是刚刚第一次出现的变量。至于@符号,是说明下面那个变量是一个实例变量。F1帮助是这样说的:实变量可以在其类或子类的方法中引用。什么意思呢?就是整个类中,不管哪个def,都可以用到这个变量,如果没@,一个def中用完这个变量就抛弃了,更不能在另外一个def中用。所以说,要把initialize里面收到的敌人编号继续用在计算伤害的cal_damage,就得借助一个全局变量。这样下面的内容就好修改了,直接写成这样:
enemy_hp = $data_enemies[@enemy_id].hp
enemy_atk = $data_enemies[@enemy_id].atk
enemy_def = $data_enemies[@enemy_id].pdef
到现在,我们已经进入了伤害计算的大门。剩下的工作涉及到的新知识就不会很多了,如果大家已经对伤害计算有了思路,可以直接写出来,并且测试一下自己计算的结果对不对。