本帖最后由 我为鱼肉 于 2023-1-18 18:51 编辑
Scene_Battle的update方法里有这么几句
# Branch according to phase case @phase when 1 # pre-battle phase update_phase1 when 2 # party command phase update_phase2 when 3 # actor command phase update_phase3 when 4 # main phase update_phase4 when 5 # after battle phase update_phase5 end
# Branch according to phase
case @phase
when 1 # pre-battle phase
update_phase1
when 2 # party command phase
update_phase2
when 3 # actor command phase
update_phase3
when 4 # main phase
update_phase4
when 5 # after battle phase
update_phase5
end
也就是分歧@phase,如果这个值是1那么就执行update_phase1,如果是2那么就执行update_phase2,如果是3那么就执行update_phase3
在main方法里用了start_phase1方法,也就是初始化时@phase值是1,在Scene_Battle 1和Scene_Battle 2中有阶段1的详细代码。
大概过程是这样的:阶段1时初始化全体同伴的行动,设置战斗事件,判定战斗胜负,如果战斗没有结束就进入第二阶段@phase赋2
Scene_Battle 2中有阶段2的详细代码。
大概过程是这样的:初始化一些实例变量(@actor_index = -1,@active_battler = nil,$game_temp.battle_main_phase = false,$game_party.clear_actions),
这几个实例变量分别与当前正在输入命令的同伴、活跃的战斗者,是否正在战斗中(阶段4),全体同伴的行动有关。
隐藏“攻击”“特技”“防御”“物品”窗口,展示“战斗”“逃跑”命令窗,同时开始“战斗”和“逃跑”的选择,如果选择“战斗”就进入第三阶段@phase赋3
Scene_Battle 3中有阶段3的详细代码phase3_next_actor下一个同伴,phase3_prior_actor上一位同伴
大概过程是这样的:在start_phase3时因为把@active_battler赋为nil,故在phase3_next_actor时需要begin~end结构捕捉错误,否则会因为nil执行不了inputable?方法而报错退出。
until是循环修饰符,也就是在表达式的计算值变为真之前,一直循环执行 until 中的内容(详见F1)。
也就是必须找到一个可输入命令的同伴,然后才会phase3_setup_command_window(开始输入战斗命令“攻击”“特技”“防御”“物品”),如果没有找到这个同伴就一直循环下去,
当然了,在循环到最后一个角色时就会直接进入第四阶段@phase赋4。inputable?方法是判定当前同伴是否允许输入命令(比如死亡等限制状态就不允许该同伴输入命令)。
Scene_Battle 4中有阶段4的详细代码(第四阶段又分为6个小阶段)。
大概过程是这样的:回合数+=1,初始化$game_temp.battle_event_flags(当前回合的事件是否执行过),窗口全部隐藏,生成敌人行动,生成战斗者行动顺序。
设置强制行动,按顺序选择一个战斗者,如果所有战斗者都已行动完进入第二阶段,状态回合掉血,刷新自动状态,重绘状态窗口,判定当前战斗者能否允许行动(不允许就下一位)
分歧行动指令生成对应的行动结果(攻击,特技,物品),展示行动方动画,展示对象方动画和显示伤害,刷新状态窗口,设置战斗事件,以上循环。 |