辞别邓艾的我们依然对田地风光印象深刻,孙悟空不禁回忆起当年在花果山和一帮小弟“寄情山水”的情景,尤其是那一颗颗鲜嫩的桃子和果子,更是难以忘怀。(编者:想不想看孙悟空穿越时空回归美猴王的样子?孙悟空:偶尔回去玩一次也不错……)
</br>于是迫不及待的我们创建了一个新的武将:
</br>孙悟空(xiaosunwukong),称号"美猴王",5体力上限男性群雄武将。
![](https://img.kancloud.cn/0c/62/0c62672b1b71c4d60ceb0feb86a7112e_451x104.png)
</br>并且为他量身打造了一个这样的技能:
> 贪嘴:锁定技,你的红心牌均视为桃。
</br>这个技能一看就应该是一个视为技,毕竟技能里面都直接告诉我们了“视为桃”。不过它又跟之前我们见过的视为技有些区别。一般的视为技是在我们发动技能的时候才将某些卡牌当作其它卡牌;而这个技能要求不论什么时候,我们的红心手牌都锁定地视为了桃。没错,这就是我们曾经提到的锁定视为技了。
</br>还记得创建锁定视为技用的是什么方法吗?sgs.CreateFilterSkill,就是它了。
```
sgs.CreateFilterSkill{name, view_filter, view_as}
```
![](https://img.kancloud.cn/be/0f/be0f5965d5387ae9214e39a136124580_515x224.png)
</br>其中:
1. name表示技能的名字。
2. `view_filter`表示受这个技能影响的卡牌所应满足的条件,用来判断一张卡牌是否应当被锁定视为其它的卡牌。它是用函数进行传值的,函数原型是:
`function(self, to_select)`
其中self表示技能本身,to_select就是等待判断的卡牌了。
3. `view_as`表示被技能影响的卡牌锁定视作的卡牌。它也有一个传值函数,原型是:
`function(self, card)`
其中self依然表示技能本身,card就是那张被影响的卡牌了。
</br>在我们的这个贪嘴技能里面,名字就还按照惯例取作"LuaTanzui"了。
</br>`view_filter`方面,由于受到技能影响的牌只有红心牌,所以只需要判断`to_select`的花色就是不是sgs.Card_Heart(红心)就可以了。
</br>而对于`view_as`,与一般视为技的有些区别,第二个传值参数从`cards`变成了`card`,所以我们可以直接拿来用了。在这部分中,我们依然要先创造出一个虚构的桃子卡牌出来:
![](https://img.kancloud.cn/0d/78/0d78186a5ba1ba14a277b62deadf7d84_689x351.png)
</br>接下来要干什么?
</br>按照一般视为技的思路,应该是通过卡牌编号id,将发动技能的卡牌card填充到这个桃子里去。不过,锁定视为技毕竟不一样,不存在一般视为技“转化”卡牌的过程,只是卡牌本身的内涵变化了,所以处理的方式当然也就不一样了。
</br>为了表达这样的意味,文艺范儿的Card甚至向我们展示了它修炼多年的分身之术。现在它的形象变成了——WrappedCard!
</br>据说,小报记者们通过层层挖掘,终于探知Card当年修炼之地,也就是这WrappedCard诞生之所,就在源码(可在群文件里搜索 秒沉水 查找到源码)的src\core\WrappedCard.h里面……
</br>话说回来,锁定视为技对卡牌的处理方式,是直接赋予被影响的卡牌新的涵义,那么首先我们要先获得这张被影响的卡牌。这可不能是传进来的参数`card`哦,要用新形象了!
</br>Engine大仙如此神通,早就知道了Card影分身的事情,向我们提供了一个成员函数来欢迎WrappedCard的出现。这个函数是
`getWrappedCard`,它的原型是这样的:
```
getWrappedCard()
```
![](https://img.kancloud.cn/97/fc/97fc1f4472c71097ad926545e255053c_402x25.png)
</br>在这里,参数`cardId`就是卡牌的编号了。
</br>这下通过刚才我们得到的卡牌编号id就能见到新形象下,这张被影响的卡牌了。
</br>至于接下来的事情,正好WrappedCard有一个绝学,是一个叫作`takeOver`的成员函数,可以帮我们赋予一张卡牌以新的内涵。它的原型是:
```
takeOver(card)
```
![](https://img.kancloud.cn/8f/c7/8fc7977ea853f493795afdbeaa5333f6_264x26.png)
</br>其中,参数`card`表示一张虚构的卡牌,那就代表了卡牌新的内涵了。比如说,我们这个技能中的那个虚构的桃子。
于是事情就好办多了。经各方协商,代码应该是这样的:
![](https://img.kancloud.cn/7b/04/7b04c7e3c07b9188f03e335dce4401fc_689x414.png)
</br>到游戏中看看效果吧!
![](https://img.kancloud.cn/82/db/82dbcea8b866a4d4539859cdab29f60f_219x156.png)
</br>好吧,连判定牌都改了……(神关羽:好可怕的结果。)
![](https://img.kancloud.cn/9b/6e/9b6e6413a58f7b0615ee99bf1292368c_214x62.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 立即胜利