这个类实在是过于冗长,以至于RMXP将其分为三个部分书写。本节我们解析其第一部分,并在解析其整个类之后分析出它是如何使用Game_BattleAction的。
Game_Battle(分割定义一)代码解析
#==============================================================================
# ■ Game_Battler (分割定义 1)
#------------------------------------------------------------------------------
# 处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
# 超级类来使用。
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_reader :battler_name # 战斗者 文件名
attr_reader :battler_hue # 战斗者 色相
attr_reader :hp # HP
attr_reader :sp # SP
attr_reader :states # 状态
attr_accessor :hidden # 隐藏标志
attr_accessor :immortal # 不死身标志
attr_accessor :damage_pop # 显示伤害标志
attr_accessor :damage # 伤害值
attr_accessor :critical # 会心一击标志
attr_accessor :animation_id # 动画 ID
attr_accessor :animation_hit # 动画 击中标志
attr_accessor :white_flash # 白色屏幕闪烁标志
attr_accessor :blink # 闪烁标志
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
@battler_name = ""
@battler_hue = 0
@hp = 0
@sp = 0
@states = []
@states_turn = {} #角色状态的维持回合数的集合
@maxhp_plus = 0 #以下几个都是基础属性的增加量
@maxsp_plus = 0 #
@str_plus = 0 #
@dex_plus = 0 #
@agi_plus = 0 #
@int_plus = 0 #
@hidden = false
@immortal = false
@damage_pop = false
@damage = nil
@critical = false
@animation_id = 0
@animation_hit = false
@white_flash = false
@blink = false
@current_action = Game_BattleAction.new #战斗中正在发生的行为对象
end
#--------------------------------------------------------------------------
# ● 获取 MaxHP
#--------------------------------------------------------------------------
def maxhp #暂且不知道base_maxhp是什么,推测是修改前的基础maxhp,应该是从存档文件里读取的 #后来我知道这个是一个方法
n = [[base_maxhp + @maxhp_plus, 1].max, 999999].min #让角色hp不超上下限[1,999999]
for i in @states #之前我们说过状态是可以叠加的
n *= $data_states[i].maxhp_rate / 100.0 #有些状态会对角色的最大hp造成影响(RM本体没有预设这样的状态)
end
n = [[Integer(n), 1].max, 999999].min #让角色hp不超限
return n
end
#--------------------------------------------------------------------------
# ● 获取 MaxSP
#--------------------------------------------------------------------------
def maxsp #同上,下面都一样
n = [[base_maxsp + @maxsp_plus, 0].max, 9999].min
for i in @states
n *= $data_states[i].maxsp_rate / 100.0
end
n = [[Integer(n), 0].max, 9999].min
return n
end
#--------------------------------------------------------------------------
# ● 获取力量
#--------------------------------------------------------------------------
def str #力量等属性值的范围为[1,999]
n = [[base_str + @str_plus, 1].max, 999].min
for i in @states
n *= $data_states[i].str_rate / 100.0
end
n = [[Integer(n), 1].max, 999].min
return n
end
#--------------------------------------------------------------------------
# ● 获取灵巧
#--------------------------------------------------------------------------
def dex
n = [[base_dex + @dex_plus, 1].max, 999].min
for i in @states
n *= $data_states[i].dex_rate / 100.0
end
n = [[Integer(n), 1].max, 999].min
return n
end
#--------------------------------------------------------------------------
# ● 获取速度
#--------------------------------------------------------------------------
def agi
n = [[base_agi + @agi_plus, 1].max, 999].min
for i in @states
n *= $data_states[i].agi_rate / 100.0
end
n = [[Integer(n), 1].max, 999].min
return n
end
#--------------------------------------------------------------------------
# ● 获取魔力
#--------------------------------------------------------------------------
def int
n = [[base_int + @int_plus, 1].max, 999].min
for i in @states
n *= $data_states[i].int_rate / 100.0
end
n = [[Integer(n), 1].max, 999].min
return n
end
#--------------------------------------------------------------------------
# ● 设置 MaxHP
# maxhp : 新的 MaxHP
#--------------------------------------------------------------------------
def maxhp=(maxhp) #从这里就能明显的看出了,角色基础的属性和后期游戏内设置的属性值是分开存放的
@maxhp_plus += maxhp - self.maxhp #求出新值和基础值的差,然后赋给@maxhp_plus,这系列变量应为在基础值上的变化值
@maxhp_plus = [[@maxhp_plus, -9999].max, 9999].min #hp与sp的增减能力值范围为[-9999,9999]
@hp = [@hp, self.maxhp].min
end
#--------------------------------------------------------------------------
# ● 设置 MaxSP
# maxsp : 新的 MaxSP
#--------------------------------------------------------------------------
def maxsp=(maxsp) #同上,以下也是
@maxsp_plus += maxsp - self.maxsp
@maxsp_plus = [[@maxsp_plus, -9999].max, 9999].min
@sp = [@sp, self.maxsp].min
end
#--------------------------------------------------------------------------
# ● 设置力量
# str : 新的力量
#--------------------------------------------------------------------------
def str=(str)
@str_plus += str - self.str
@str_plus = [[@str_plus, -999].max, 999].min #力量等属性的增减能力值范围为[-999,999]
end
#--------------------------------------------------------------------------
# ● 设置灵巧
# dex : 新的灵巧
#--------------------------------------------------------------------------
def dex=(dex)
@dex_plus += dex - self.dex
@dex_plus = [[@dex_plus, -999].max, 999].min
end
#--------------------------------------------------------------------------
# ● 设置速度
# agi : 新的速度
#--------------------------------------------------------------------------
def agi=(agi)
@agi_plus += agi - self.agi
@agi_plus = [[@agi_plus, -999].max, 999].min
end
#--------------------------------------------------------------------------
# ● 设置魔力
# int : 新的魔力
#--------------------------------------------------------------------------
def int=(int)
@int_plus += int - self.int
@int_plus = [[@int_plus, -999].max, 999].min
end
#--------------------------------------------------------------------------
# ● 获取命中率
#--------------------------------------------------------------------------
def hit
n = 100 #状态正常的状况下命中率为100%
for i in @states
n *= $data_states[i].hit_rate / 100.0 #根据状态增减命中率
end
return Integer(n) #百分制取整
end
#--------------------------------------------------------------------------
# ● 获取攻击力
#--------------------------------------------------------------------------
def atk #原理跟命中率差不多,下同
n = base_atk
for i in @states
n *= $data_states[i].atk_rate / 100.0
end
return Integer(n)
end
#--------------------------------------------------------------------------
# ● 获取物理防御
#--------------------------------------------------------------------------
def pdef
n = base_pdef
for i in @states
n *= $data_states[i].pdef_rate / 100.0
end
return Integer(n)
end
#--------------------------------------------------------------------------
# ● 获取魔法防御
#--------------------------------------------------------------------------
def mdef
n = base_mdef
for i in @states
n *= $data_states[i].mdef_rate / 100.0
end
return Integer(n)
end
#--------------------------------------------------------------------------
# ● 获取回避修正
#--------------------------------------------------------------------------
def eva #回避修正是只增减的
n = base_eva
for i in @states
n += $data_states[i].eva
end
return n
end
#--------------------------------------------------------------------------
# ● 更改 HP
# hp : 新的 HP
#--------------------------------------------------------------------------
def hp=(hp)
@hp = [[hp, maxhp].min, 0].max #限定取值然后赋值
# 解除附加的战斗不能状态
for i in 1...$data_states.size #也就是遍历所有状态
if $data_states[i].zero_hp #RPG::State.zero_hp,本方法在调用对象中有“当作hp为0”的设定时返回True
if self.dead? #如果改后的hp是hp为0的情况
add_state(i) #增加这个状态
else
remove_state(i) #移出这个状态
end
end
end
end #既然如此,理论上最好只定义一个“当作hp为0”的战斗不能状态,如果有特殊情况也要把特殊状态放在战斗不能状态的后面
#--------------------------------------------------------------------------
# ● 更改 SP
# sp : 新的 SP
#--------------------------------------------------------------------------
def sp=(sp) #同上,但是移除状态判定和修改
@sp = [[sp, maxsp].min, 0].max
end
#--------------------------------------------------------------------------
# ● 全回复
#--------------------------------------------------------------------------
def recover_all
@hp = maxhp #我想了半天这个变量从哪里来,原来是上面定义的方法
@sp = maxsp
for i in @states.clone #object.clone,此方法返回此对象的克隆对象(浅拷贝)
remove_state(i) #移除所有状态
end
end
#--------------------------------------------------------------------------
# ● 获取当前的动作
#--------------------------------------------------------------------------
def current_action
return @current_action
end
#--------------------------------------------------------------------------
# ● 确定动作速度
#--------------------------------------------------------------------------
def make_action_speed #可以看出每一次行动的速度是有随机性的
@current_action.speed = agi + rand(10 + agi / 4)
end
#--------------------------------------------------------------------------
# ● 战斗不能判定
#--------------------------------------------------------------------------
def dead?
return (@hp == 0 and not @immortal) #没有不死身标记而且hp=0
end
#--------------------------------------------------------------------------
# ● 存在判定
#--------------------------------------------------------------------------
def exist? #之前测试了battler调用的频率,感觉角色死亡之后是不是@hidden置True了,待验证
return (not @hidden and (@hp > 0 or @immortal))
end
#--------------------------------------------------------------------------
# ● HP 0 判定
#--------------------------------------------------------------------------
def hp0? #被@hidden的对象不参与计算,真好
return (not @hidden and @hp == 0)
end
#--------------------------------------------------------------------------
# ● 可以输入命令判定
#--------------------------------------------------------------------------
def inputable? #强制普攻敌人和强制普攻队友、不行动时不能输入命令(也就是选择行动)
return (not @hidden and restriction <= 1) #Game_Battler 2.restriction方法,返回状态的限制
end
#--------------------------------------------------------------------------
# ● 可以行动判定
#--------------------------------------------------------------------------
def movable? #除了不行动状态都可以行动
return (not @hidden and restriction < 4)
end
#--------------------------------------------------------------------------
# ● 防御中判定
#--------------------------------------------------------------------------
def guarding? #参考Game_BattleAction可知这是行为0基本1,也就是防御
return (@current_action.kind == 0 and @current_action.basic == 1)
end
#--------------------------------------------------------------------------
# ● 休止中判定
#--------------------------------------------------------------------------
def resting? #目前不知道什么情况下basic会置3
return (@current_action.kind == 0 and @current_action.basic == 3)
end
end
思考
我之前曾经说过Ruby的方法隐藏括号调用很有歧义不该提倡,但是今天我在思考,定义函数和定义变量都是定义,这样明明更加符合Ruby一切皆对象的思想,倒是反而衬托出我思想的僵化了。
不过说真的,我想了老半天那个maxhp是啥变量了……人傻起来真就没药医- -。