一分耕耘,一分收获,我们要学会推迟自己的满足感,暂时的辛苦说不定会带来更大的汇报,你说是不是呀,悟空?(孙悟空:孩儿们,甭听他乱扯,咱们舞起来~)
</br>这次我们打算为孙悟空设计这样的技能教育教育它:
> 积蓄:摸牌阶段,你可以少摸一张牌并进行一次判定,若结果为基本牌,则回合结束阶段开始时,你可以摸X张牌,其中X为此基本牌的点数。
</br>显然,这个技能可以分成两个部分,一个在摸牌阶段进行判定,另一个在回合结束阶段摸牌。相应地,就有了两个触发时机。代码如下:
![](https://img.kancloud.cn/49/f9/49f9385db7d829fbda413f46ee0d0f2b_620x351.png)
</br>先实现少摸一张牌的效果,这可以类比摸牌技能的代码:
![](https://img.kancloud.cn/d9/72/d972d7fb5828c7153a4848ae330d5add_634x177.png)
</br>然后是进行一次判定。值得注意的是我们只关心这次判定的结果是不是基本牌,所以对判定牌具体的类型啊、花色啊、点数啊什么的都没有要求,于是判定规则那里就可以直接写`sgs.QRegExp("(.*):(.*):(.*)")`了,而且也不需要分辨判定结果是否有利了。
![](https://img.kancloud.cn/c8/39/c83992f7682d053d68316e98811aaedd_554x195.png)
</br>当判定结束后,我们需要检查判定牌是否为基本牌。这当然还要用Card的成员函数`isKindOf`了:
![](https://img.kancloud.cn/83/32/833299ec8b202982e0a45f266c986a45_508x109.png)
</br>其中"BasicCard"表示基本牌。而装备牌是"EquipCard",锦囊牌则是"TrickCard"。锦囊牌还可以继续细分,比如“DelayedTrickCard”表示延时性锦囊,“NDTrickCard”表示非延时性锦囊,还有“AOE”似乎表示多目标锦囊等。
</br>现在我们遇到了一个麻烦:得到的点数怎么处理?或者说,在回合结束阶段,我们怎样知道当初摸牌阶段判定时得到了一个什么点数呢?
</br>所以我们使用了一项之前没有用过的手段:标签。
</br>我们可以在房间里设置一个标签,用来保存我们在游戏过程中产生的一些信息;当其它时候我们需要查看这些信息的时候,就可以从标签中得到它们了。
</br>设置一个标签,用到的是Room的一个成员函数`setTag`。它的函数原型是:
```
setTag(key, value)
```
![](https://img.kancloud.cn/dd/80/dd80c8ac791350f76e592ad818723e0f_550x26.png)
</br>这里,参数`key`表示标签的名字,而`value`就是我们要存放的信息了。
</br>考虑到信息的多种多样,value在太阳神三国杀的支持下投靠了sgs.QVariant,所以我们可以通过`setValue`对它进行传值。当然,我们也可以直接在我们的信息外面套上一层sgs.QVariant()作为参数的值。
</br>现在我们把获得到的这个基本牌的点数放到一个标签里保存起来,让回合结束阶段可以继续使用它。嗯,标签的名字就叫作"Jixu_count"好了。
</br>代码如下:
![](https://img.kancloud.cn/0f/9a/0f9ade5dd8e26a6dccc3085a901981d0_509x134.png)
</br>现在我们在摸牌阶段干的活就完成了,然后把目光转向回合结束阶段吧。
</br>回合结束阶段要做的事情是多摸X张牌,那么首先我们要从标签中把存起来的数值拿到才行。这个动作是通过Room的另一个成员函数 `getTag`实现的:
```
getTag(key)
```
![](https://img.kancloud.cn/18/cf/18cf81fd352c0ab3039c945f662e1b29_425x25.png)
</br>这个key就是刚才提到的标签名字了。
</br>于是我们顺利地写出了下面的代码:
![](https://img.kancloud.cn/56/93/5693b471e1cefadfd1016e0a77afa7e1_558x197.png)
</br>至此我们的技能就实现了所有的描述,不过还有一点事情要做,那就是把我们设置的这个标签清除掉。因为标签本身就是提供给未来使用的,系统并不知道什么时候会使用完它,所以并不像标志那样主动清除它,需要我们在代码里面进行清除。要是不清除的话,以后每个回合,不论我们是否发动了技能,回合结束后就都能摸X张牌了,显然不是技能所期盼的样子。
</br>清除标签所用的方法依然是Room的成员函数,一个叫做`removeTag`的,函数原型是:
```
removeTag(key)
```
![](https://img.kancloud.cn/66/8e/668e0f586b8d4f3aa6a65f836983f805_354x23.png)
</br>其中`key`表示标签的名字。
</br>所以这里我们要加上这样的一句代码:
```
room:removeTag("Jixu_count")
```
![](https://img.kancloud.cn/d0/4f/d04fc18f6f48fc876a34dfe3a72d5fae_477x95.png)
</br>这样就真正完整地完成了。(编者:孙悟空!去看看积蓄有多好去!)
</br>游戏记录如下:
![](https://img.kancloud.cn/26/d5/26d537bc3bf0b959ff125dace4f80b76_223x234.png)
</br>由于判定结果为雷杀(属于基本牌),点数为8,所以在回合结束阶段摸了8张牌。(孙悟空:……孩儿们,咱们舞起来~编者:唉……)
- 编写说明
- 第一章 创建一个新武将
- 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 立即胜利