然而阶段触发技能并不一定是“进入”某个阶段才可以触发的,有时我们会考虑“跳过”某个阶段以达到某些效果。比如巧变(可以选择跳过判定、摸牌、出牌、弃牌四个阶段)。
</br>为了实现跳过某个阶段,首先要先给自己灌输一个叫做“阶段变更”的概念。在前一个阶段刚刚结束、后一个阶段刚要开始的这个时间点,就是阶段变更时机了。
</br>所以说,sgs.EventPhaseChanging也是和阶段有关的一个触发时机哦。
</br>在这个触发时机,太阳神三国杀会自动填充一个名叫PhaseChangeStruct的结构体,用来描述这种阶段变更的活动。依然可以从源码(可在群文件里搜索 秒沉水 查找到源码)的src\core\structs.h中找到对这个结构体的描述:
![](https://img.kancloud.cn/41/72/41725b450eb75defd84f1efce064ac56_293x121.png)
</br>这个阶段变更结构体只有两个参数,分别是用来表示前一个阶段的`from`和表示后一个阶段的`to`,很简单吧?
</br>那么,我们怎样在代码中获取到这个结构体中的信息呢?
还记得环境数据data吧?当时在sgs.Damage触发时机的时候,它储存着载有伤害信息的DamageStruct对象。同样地,在这个sgs.EventPhaseChanging触发时机,它储存的就是我们期望的载有阶段变更信息的PhaseChangeStruct对象了。
</br>而获取这个PhaseChangeStruct对象,只需要使用sgs.QVariant为我们提供的一个方法:`toPhaseChange()`就可以了。
</br>至于说具体的实现跳过阶段的工作,就要交给ServerPlayer对象的一个成员函数`skip`了。下面是它的函数原型:
```
skip(phase)
skip()
```
![](https://img.kancloud.cn/52/55/525516a1acdfea5cb743fac3ee4ea1d7_322x47.png)
</br>原型有两个,因为我们要跳过的是一个特定的阶段,所以这里我们只用第一个就好了。它有一个参数`phase`,就是具体要跳过的那个阶段了。
</br>现在理论上我们可以开始写代码了,只是还有一点要注意的。如果说要跳过一个阶段,首先这个阶段应当存在,不能是一个已经被跳过的阶段。比如中了乐不思蜀而跳过出牌阶段的刘禅就不能再发动技能放权了,因为放权也是要跳过出牌阶段的。
</br>检测一个阶段是否已经被跳过,可以使用ServerPlayer的另一个成员函数`isSkipped`,它的原型是:
```
isSkipped(phase)
```
![](https://img.kancloud.cn/2d/82/2d82e853a11021f926cc14b1c0e463f0_369x25.png)
</br>其中参数`phase`表示需要检测的那个阶段。
</br>所以,如果我们要创造这样的一个技能:
> 如意:锁定技,你跳过判定阶段。
</br>代码就是这样的:
![](https://img.kancloud.cn/e8/89/e889269a3451ad90e461f520e588db17_740x306.png)
</br>结果:
![](https://img.kancloud.cn/07/0f/070fcb23f460f0f8f50044d43dc44651_242x65.png)
</br>这下孙悟空就不再有判定阶段了……
- 编写说明
- 第一章 创建一个新武将
- 1.1 开发环境准备
- 1.2 创建一个新的武将扩展包
- 1.3 创建我们的新武将
- 第二章 添加技能
- 第三章 武将美化
- 3.1 美化环境准备
- 3.2 添加武将卡牌
- 3.3 添加武将头像
- 3.4 添加武将标签
- 第四章 创建一个新技能
- 第五章 添加音效
- 5.1 打造自己的声音工作室
- 5.2 添加技能使用音效
- 5.3 添加武将阵亡音效
- 第六章 添加提示信息
- 6.1 添加代码注释
- 6.2 显示提示信息
- 6.3 启动全屏信息特效
- 第七章 武将变更
- 第八章 启用AI
- 8.1 创建我们的AI文件
- 8.2 真实的AI
- 8.3 动手写AI
- 第九章 修改距离
- 第十章 技能管理
- 10.1 技能判定
- 10.2 创建技能
- 10.3 获得技能
- 10.4 失去技能
- 第十一章 修改手牌上限
- 第十二章 体力变更
- 12.1 流失体力
- 12.2 制造伤害
- 13.3 恢复体力
- 12.4 流失体力上限
- 12.5 增长体力上限
- 第十三章 游戏进程的变更
- 13.1 创建阶段触发技能
- 13.2 跳过回合阶段
- 13.3 插入一个额外的回合阶段
- 13.4 启用翻面
- 13.5 获得一个额外的回合
- 第十四章 启用标记(Mark)
- 14.1 添加标记
- 14.2 获得标记
- 14.3 失去标记
- 14.4 查看标记数目
- 第十五章 卡牌转换
- 15.1 主动牌的转换
- 15.2 被动牌的转换
- 第十六章 卡牌传递
- 16.1 创建摸牌技能
- 16.2 游戏中摸牌
- 16.3 游戏中弃牌
- 16.4 从其他武将处获得牌
- 16.5 判断目标区域是否有牌
- 16.6 移动场上的牌
- 第十七章 用牌实现技能效果
- 第十八章 启用标志(Flag)
- 第十九章 涉足判定领域
- 19.1 启用判定
- 19.2 更改判定
- 19.3 获得判定牌
- 第二十章 私家牌堆
- 20.1 向牌堆中添加牌
- 20.2 查看牌堆中牌的数量
- 20.3 从牌堆中移除牌
- 第二十一章 牌的锁定
- 第二十二章 免疫牌
- 第二十三章 让房间提供牌
- 23.1 提供主动牌
- 23.2 提供被动牌
- 第二十四章 启用标签(Tag)
- 第二十五章 濒死结算
- 第二十六章 交换座次
- 第二十七章 创建主公技
- 27.1 创建由主公发起的主公技
- 27.2 创建由他人发起的主公技
- 第二十八章 强力技能
- 28.1 直接死亡
- 28.2 改换身份
- 28.3 原地复活
- 28.4 立即胜利