想像张郃一样把一张牌从场上牵来牵去的吗?想像鲁肃、吴国太一样把两个人的牌换来换去的吗?那么好啦,现在我们趁着孙悟空又去找关羽决斗的时候,悄悄来看一下怎么移动场上的卡牌吧。
</br>这回,我们偷偷地拉来了Room的一个成员函数moveCardTo,它的原型是这样的:
```
moveCardTo(card, dstPlayer, dstPlace, forceMoveVisible=false)
moveCardTo(card, dstPlayer, dstPlace, reason, forceMoveVisible=false)
moveCardTo(card, srcPlayer, dstPlayer, dstPlace,
reason, forceMoveVisible=fasle)
moveCardTo(card, srcPlayer, dstPlayer, dstPlace, pileName,
reason, forceMoveVisible=false)
```
![](https://img.kancloud.cn/96/65/9665b5319946353a84376da486bd1cb4_1134x226.png)
</br>啊……四个原型……快要窒息了……
</br>我们还是只看第一个好了,那个看上去还简单点……
```
moveCardTo(card, dstPlayer, dstPlace, forceMoveVisible=false)
```
</br>有四个参数,分别是:
1. `card`,表示要移动的卡牌对象;
2. `dstPlayer`,表示卡牌要被移动到的目标角色;
3. `dstPlace`,表示卡牌要被移动到的位置,有以下一些取值:
sgs.Player_PlaceHand(手中)
sgs.Player_PlaceEquip(装备区)
sgs.Player_PlaceDelayedTrick(判定区)
sgs.Player_PlaceJudge(放置判定牌的区域)
sgs.Player_PlaceSpecial(武将牌上:放置移出游戏的牌的区域)
sgs.Player_DiscardPile(弃牌堆)
sgs.Player_DrawPile(摸牌堆)
sgs.Player_PlaceTable(处理区)
sgs.Player_PlaceUnknown(未知区域)
sgs.Player_PlaceWuGu
4. `forceMoveVisible`,表示是卡牌否以正面朝上的方式移动。填true就是使用正面朝上的方式,所有人都能看到这是什么卡牌;填false就是按原样移动,不公开给大家看。默认是false,也就是不公开的方式。
</br>至于其它的原型和参数,或许……
* `reason`表示卡牌移动的原因;
* `srcPlayer`表示卡牌原先所在的角色;
* `pileName`表示卡牌将移动到的牌堆名字。
</br>比如我们现在模仿一下巧变的做法,设计这样的一个技能:
“挖角:弃牌阶段开始时,你可以将一名角色装备区内的防具牌置入你的装备区。”
</br>获取一名角色已经装备的防具,可以使用Player的一名成员函数
```
getArmor()
```
![](https://img.kancloud.cn/01/14/011480cf7c3a659fed70d86f67f94768_308x24.png)
</br>这个函数可以告诉我们当前武将装备的防具是什么,而如果它什么也没说,只默默地写了一个nil出来,我们就知道这名武将当前没有防具了。
</br>所以首先我们在触发的时机,应当做的事情有:
1. 检查自己是否装备了防具;
2. 询问是否发动技能
</br>接下来,就是选择一名场上的角色,并判断选择TA是否有防具了。
</br>一切准备好之后,移动开始……
</br>表现在代码上,就是:
![](https://img.kancloud.cn/4a/99/4a99bdec65b22e27634fff4bd4d85000_895x543.png)
</br>哦,那个`askForPlayerChosen`是Room的一个成员函数,用来询问选择一名角色的。还记得当年的`askForCardChosen`吗?都是一样的道理。这个函数的原型是:
```
askForPlayerChosen(player, targets, reason)
```
![](https://img.kancloud.cn/5e/17/5e17c6637b9ac5ba66632af907463855_1082x47.png)
</br>其中`player`表示被询问的对象,`targets`是一个列表,表示可供选择的角色备选名单,而`reason`就是询问原因了,一般是所在技能的名字。
因为`targets`需要我们提供一个备选名单,所以事先动用了`getOtherPlayers`,获得了全场除了自身之外的所有武将列表。就是这个思路了。
</br>到游戏中体验一下挖角的乐趣吧!
</br>呃……忘记孙悟空还在和关羽决斗了……还是先把之前的齐天大圣孙悟空的资料调出来实验一下吧。
![](https://img.kancloud.cn/6a/96/6a969de65da8c9f97d2b97d656b0bc95_535x89.png)
</br>诶?怎么游戏启动不了了?
</br>原来,我们添加技能的位置出错了,太阳神三国杀在加载扩展包文件的时候,需要按照文件的内容顺序加载。如果添加技能的位置在技能创建之前,会导致找不到这个技能,也就没法继续启动下去了……
</br>所以按照这个思路,只好把添加技能的代码后移,放到技能后面吧:
![](https://img.kancloud.cn/cf/55/cf554e0e4ff79ad23ab7190f8728cfc0_438x96.png)
</br>OK,启动成功!
</br>看好!神赵云有装备了!
![](https://img.kancloud.cn/56/87/5687863fefce1c6297b5ce45a0bcde85_176x195.png)
</br>果断发动挖角!
![](https://img.kancloud.cn/08/54/08542da98367464789b6da75fd47f6ac_223x101.png)
</br>结果:
![](https://img.kancloud.cn/9a/3f/9a3fe3dfb849d3bf9b7f3bb21f693215_366x187.png)
</br>Good job!
- 编写说明
- 第一章 创建一个新武将
- 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 立即胜利