前端外刊评论 2018-02-22
NPC系统是游戏中非常重要的系统,设计的好坏很大程度上影响游戏的体验。NPC在游戏中有如下作用:
NPC跟角色怪物等相似是一个实体,所谓实体指的是必须有唯一ID,可通过ID索引到且可以在地图动态添加,本文实现的NPC的ID由配置文件指定,其他基本属性如名字、地图坐标、外形、朝向等都可配置。
当与NPC对话时一般都是显示文字和一些引导操作的按钮。这些都是需要可配置。另外NPC的文字除了静态描述文字,还需要一些动态数据,比如显示玩家活动分数,排名次序等。如何定义服务器和客户端的协议才能满足上述要求呢?首先必须是文字协议并且可扩展,这样才对配置友好,Json是一种,但是json够紧凑但是对配置不是很友好尤其是对文字描述这种。xml相比更好一点,扩展性强,可读性也好,在文字长度不大的情况下效率也可以接受。本人推荐用xml的格式NPC的显示协议。NPC至少有两个元素文字和按钮,怎么用xml来表示呢?我首先想到了html。常规文字显示就参考html的格式,特殊的ui组件,扩展一下xml就可以了,这种情况甚至不需要重启服务器。为了客户端解析方便,我们只需要使用html的子集即可,比如:
过年好!<br/> <font color="red">狗年大吉!</font> <a href="showPage">旺旺旺</a> <br/> <button type="button" onclick="showPage">OK</button>
使用html格式的配置有如下好处:
上图显示了一个有超链和按钮的npc面板,那么点击了超链和按钮后程序如何处理呢?这时正时脚本排上用场的地方了。一个超链或按钮对应一个脚本的函数,而整个脚本正好是对应了脚本的全部功能。另外超链是可以传参数的,那么参数会被带到脚本函数中,如下例所示:
查看成绩
def showScore(player, npcid, param): sortCondition = param['sort'] #do something return
第一次点击npc因为没有指定超链,那么默认调用脚本的main函数。时序图如下:
def main(player, npcid): msg = ''' 过年好!<br/> <font color="red">狗年大吉!</font> <a href="showPage">旺旺旺</a> <br/> <button type="button" onclick="showPage">OK</button> ''' return msg
思考下如果有外挂没有点击main直接发消息点击showScore会怎么样?正常情况下角色必须点击当前看到的页面包含的超链,否则会出现安全性问题,必须加以限制。npc系统每次发送npc面板内容给客户端时,都会记录下当前的npc面板内容,当玩家点击超链,首先验证一下是否是本次面板内的超链,否则拒绝,安全性大大提高。时序图如下: