💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
如果说代码注释是写游戏的人们之间的交流,那么提示信息就让我们玩游戏的人也加入了这个温馨的圈子。 </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>成功!