设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1176|回复: 2
打印 上一主题 下一主题

[已经过期] 问战斗脚本的一个问题

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3925
在线时间
254 小时
注册时间
2013-10-13
帖子
790
跳转到指定楼层
1
发表于 2023-1-18 17:27:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x

设置第一个角色选择敌人后,有个程序段,是phase3_next_actor,执行这段话后,第二个角色开始选择敌人,它重新执行程序段update_phase3,我看不出它是怎么执行的?它是重新执行start_phase3吗?

Lv3.寻梦者

梦石
0
星屑
2821
在线时间
585 小时
注册时间
2022-7-13
帖子
89
2
发表于 2023-1-18 18:46:37 | 只看该作者
本帖最后由 我为鱼肉 于 2023-1-18 18:51 编辑

Scene_Battle的update方法里有这么几句
RUBY 代码复制
  1. # Branch according to phase
  2. case @phase
  3. when 1  # pre-battle phase
  4.   update_phase1
  5. when 2  # party command phase
  6.   update_phase2
  7. when 3  # actor command phase
  8.   update_phase3
  9. when 4  # main phase
  10.   update_phase4
  11. when 5  # after battle phase
  12.   update_phase5
  13. 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(当前回合的事件是否执行过),窗口全部隐藏,生成敌人行动,生成战斗者行动顺序。
设置强制行动,按顺序选择一个战斗者,如果所有战斗者都已行动完进入第二阶段,状态回合掉血,刷新自动状态,重绘状态窗口,判定当前战斗者能否允许行动(不允许就下一位)
分歧行动指令生成对应的行动结果(攻击,特技,物品),展示行动方动画,展示对象方动画和显示伤害,刷新状态窗口,设置战斗事件,以上循环。

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
24
星屑
7017
在线时间
247 小时
注册时间
2020-12-4
帖子
306

极短24获奖极短23获奖极短22获奖

3
发表于 2023-1-18 23:04:10 | 只看该作者
本帖最后由 纯属小虫 于 2023-1-18 23:05 编辑

2楼分析的各种大【phase】都很详细,这里主要详细说说【phase3】的内容吧——

首先理解一下phase3——
  1.   def update_phase3
  2.     # 敌人光标有效的情况下
  3.     if @enemy_arrow != nil
  4.       update_phase3_enemy_select
  5.     # 角色光标有效的情况下
  6.     elsif @actor_arrow != nil
  7.       update_phase3_actor_select
  8.     # 特技窗口有效的情况下
  9.     elsif @skill_window != nil
  10.       update_phase3_skill_select
  11.     # 物品窗口有效的情况下
  12.     elsif @item_window != nil
  13.       update_phase3_item_select
  14.     # 角色指令窗口有效的情况下
  15.     elsif @actor_command_window.active
  16.       update_phase3_basic_command
  17.     end
  18.   end
复制代码

【update_phase3】这个指令在战斗中每一帧都会执行一次,其各个子内容是根据某光标或窗口是否有效,来决定这一帧应该更新哪个子内容
如:@skill_window != nil  特技窗口被调出的情况下,那便每一帧执行的都是【update_phase3_skill_select】里面的内容,也就是选择要使用的特技的那部分的操作。
然后记住倒数第三行的【update_phase3_basic_command】这个指令,后面会说到~~

接下来说说【phase3_next_actor】——
  1.   def phase3_next_actor
  2.     # 循环
  3.     begin
  4.       # 角色的明灭效果 OFF
  5.       if @active_battler != nil
  6.         @active_battler.blink = false
  7.       end
  8.       # 最后的角色的情况
  9.       if @actor_index == $game_party.actors.size-1
  10.         # 开始主回合
  11.         start_phase4
  12.         return
  13.       end
  14.       # 推进角色索引
  15.       @actor_index += 1
  16.       @active_battler = $game_party.actors[@actor_index]
  17.       @active_battler.blink = true
  18.     # 如果角色是在无法接受指令的状态就再试
  19.     end until @active_battler.inputable?
  20.     # 设置角色的命令窗口
  21.     phase3_setup_command_window
  22.   end
复制代码

这个指令出现在很多个步骤的后面,其意义就是为一个角色设置的行动完成之后(或者是刚刚开始phase3的时候),判定是否有下一个可以执行指令的角色
情况1:如果有,则为【角色index】+1,并且执行【phase3_setup_command_window】角色命令窗口,也就是选择攻击、防御、技能、物品的那个角色命令的最初始的窗口。
情况2:如果当前的【角色index】不满足接受指令的条件(如死亡,眩晕等限制效果),则回到begin那一步,再来一遍。
情况3:如果【角色index】已经等于队伍人数,也就是“最后一个队员无法行动”或者“所有队员已经设置完行动”的情况下,则终止phase3,开始phase4(播放动画开始对打的那个环节)

【phase3_next_actor】会出现在很多步骤的后面,如执行普通攻击选择完敌人目标后,或者使用物品选中完目标后,或者防御后等等,执行了这个指令代表这个角色的指令已经操作完了,开始寻找下一个可以接受指令的角色或者直接就开始【主回合】
至于【phase3_prior_actor】其实是前者的反向操作,用于在命令角色时按【ESC】的时候转向前一个角色时使用(毕竟XP的战斗是在将四个角色全部命令玩之后才会操作的,所以可以取消这个命令回到上一个命令;当然,CP战斗就是另一回事了!)

不知道这样能不能给你解惑~

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-29 07:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表