如果说代码注释是写游戏的人们之间的交流,那么提示信息就让我们玩游戏的人也加入了这个温馨的圈子。
</br>说到提示信息,首先应该认识一下太阳神三国杀为我们提供的一个信息结构体:`LogMessage`。
</br>从源码(可在群文件里搜索 秒沉水 查找到源码)的src\server\roomthread.h文件中可以找到`LogMessage`结构体的详细信息。
</br>从中我们可以看到,`LogMessage`是由以下一些参数构成的:
1. `type`提示信息的输出结构类型
2. `from`提示信息中涉及的行为发起者
3. `to`提示信息中涉及的所有的行为接受者的列表
4. `card_str`可能涉及的卡牌信息
5. `arg`可能涉及的一个参数
6. `arg2`可能涉及的另一个参数(最多只能带两个参数)
</br>首先,要显示提示信息,应先创建一条消息,也就是要产生一个LogMessage结构体的实际对象。对应的代码是这样的:
```
local msg = sgs.LogMessage()
```
![](https://img.kancloud.cn/93/77/93775081e31f516cdd1d20a774c11a61_317x59.png)
</br>通过这条代码,我们定义并创建了一个消息,名字叫msg。
</br>然后呢?想想我们要向玩游戏的人说什么话。比如说:
</br>"Hello!太阳神三国杀向你 孙悟空 问好!"
</br>在这句话里,我们表达的是一个问好的行为,而孙悟空则是这个行为的接受对象。因此对应到`LogMessage`的那些参数,可以想到:
to=孙悟空。
</br>而且我们也顺便就定义了这个提示信息的输出结构:
Hello!太阳神三国杀向你 %to 问好!
</br>这里的百分号"%"表示接下来的内容是要被对应的参数替换掉的,所以到时候太阳神三国杀一看到这个%,就会把那个to换成我们设定的值,孙悟空。
</br>现在我们同时还明白了那个type参数的含义。不多说了,赶紧在代码中定义这样的一个type吧。
</br>把目光转向那个已经有点无所不能的样子的翻译表吧,在这里写上我们的输出结构:
```
["#hello"] = "Hello!太阳神三国杀向你%to问好!",
```
![](https://img.kancloud.cn/cc/4d/cc4d9962f4fb3bc48a17947f56ad9790_555x76.png)
</br>在这里,我们定义的消息输出结构类型的名字叫做`"#hello"`。
</br>值得一提的是,在定义信息输出结构的时候,推荐使用引导符号"#"作为输出结构名字的一部分。
</br>现在可以填充`LogMessage`结构体了。
</br>由于这个输出结构中只涉及到了参数`to`,并没有涉及所有的参数,所以没有涉及的那些就可以不管了。
</br>代码如下:
```
msg.type = "#hello"
msg.to:append(player)
```
![](https://img.kancloud.cn/89/20/89205d35433087d606ed666470859c5f_668x270.png)
</br>还记得好早之前提过的一个问题吗?
</br>一个对象调用自己的成员函数的时候,中间用冒号`:`连接;
</br>这里我们又遇到类似的事情了,请注意msg和type之间的那个小点`.`
</br>要知道type可不是什么成员函数,只是`LogMessage`结构体中的一个参数而已。所以这次我们不用冒号了,用小点(也就是英文的句号)连接这个对象和它的参数。
</br>这种结构体中的参数,这种用来表现对象的各个属性和状态的参量,被称作对象(或结构体)的成员变量。
</br>又默默地记下了一句话:
一个对象调用自己的成员变量的时候,中间用点`.`连接。
</br>目光向下移动……`append`?为什么这个不是`=`了?
</br>其实在``LogMessage的介绍里面已经知道了,`to`的值是一个列表,是所有接受者的列表。一个列表和一个接受对象怎么能等同呢?级别明显不够嘛!
</br>`append`是一个用来向列表中添加项目的方法,所以这条代码的意思其实是说,把接受对象`player`放到`to`所代表的这个列表中去。
</br>*PS:`LogMessage`中的这些成员变量,只有在填充`to`的时候使用`append`,而填充其它成员变量的时候用`=`就可以了。*
</br>本来以为没问题了,结果又引出了一个`player`……这是?
</br>目光向上~
![](https://img.kancloud.cn/2e/18/2e18e3ddac77cfb4bafb696b069bbb82_484x49.png)
</br>在那个`function`的括号里面,有四个参数`self`,`event`,`player`和`data`。
</br>我们需要的`player`就是其中的第三个参数了。
</br>它是一个角色对象,也就是传说的`ServerPlayer`,是玩游戏的人在太阳神三国杀中的代表。这个`player`里面包含了许多玩游戏的人的信息,比如在哪个游戏房间啦,周围挨着的有哪些角色啦,有哪些手牌啦什么的。
</br>有关`ServerPlayer`的具体信息可以从源码(可在群文件里搜索 秒沉水 查找到源码)里面的src\server\serverplayer.h中找到,这里就先不管它了。
</br>OK,现在消息已经被我们填好了,接下来要做的,是把这条消息发送到游戏中去,让玩游戏的人能看到它。
</br>看法宝!哦……不是,应该说:看代码!
```
room:sendLog(msg)
```
![](https://img.kancloud.cn/5d/de/5ddeac6cff9c2425c7edbbd25c077c16_387x128.png)
我们的消息就是通过这么一句轻轻松松地发送到了游戏里面……
</br>等等,room是什么?是游戏房间啦,房间~
</br>玩游戏怎么也要有场地吧?别告诉我真是在太阳上面玩的……
</br>`room`就是这样一个表示游戏场所的房间对象,而它的真身是传说中的Room老兄。在Room这里保存了一场游戏里面的很多信息,比如游戏模式啦,还有哪些武将存活啦,该谁行动啦什么的。
</br>`room`这个对象很重要,许多扩展行为都跟它有密切关系的,因为它可以帮我们做许多事情,比如现在就是它在帮我们发送这条消息的。几乎每次扩展,都要想办法先把它鼓捣出来,可真要和它搞好关系哦~
</br>关于Room的具体信息可以在源码(可在群文件里搜索 秒沉水 查找到源码)中的src\server\room.h中找到。
</br>提示:ServerPlayer对象(如`player`)可以通过`getRoom`方法找到Room~
![](https://img.kancloud.cn/f0/be/f0befbd37005cc4f1d9069f73a929ce5_221x26.png)
</br>好了不管那么多了,快到游戏里面看看我们发送的消息吧。当孙悟空发动美王技能的时候……
![](https://img.kancloud.cn/f2/01/f2012e64bf6905b3c62e5030ce4e545c_262x68.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 立即胜利