使用ivx连接组件实现实时对战答题的经验总结

在上一篇帖子中简单介绍了连接组件,并使用连接实现了一个简单的私聊模型,今天我们来制作一个实时对战答题模型。大体的设计思路是,用户A登记进入连接并将自己的CID添加到URL中转发给好友B,B打开带有URL参数的案例创建一个房间并对A发出邀请,A进入房间后答题开始,答对加分,答错对方加分,最后统计总分数分出胜负。
一.数据库
存储题目的questionTable数据库添加了三个字段,title存放题目;options存放选项,并写成JSON格式;correctIndex存放正确答案的序号。存放玩家数据的userTable数据库中nickname字段存放玩家暱称,matchPoint存放玩家总共的胜局数。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
二.服务
GetQuestions服务负责将questionTable中的题目输出并发送给前台,postUser服务则负责从是数据库中找到获胜玩家(如果找不到就添加一条玩家数据),并更新其matchpoint字段。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
三.变量
下图是案例中使用到的变量
使用ivx连接组件实现实时对战答题的经验总结
finalResult表示对局的最终结果,案例中会给它赋值“victory”、“failed”和“tie”表示胜、负和平局,choseResult是当前题目的答题结果,案例中会给它赋值“Our Score”和“Opponent score”表示己方得分和对方得分。
AnswerIndex和opponentAnswerIndex分别表示自己和对方的答题结果,即所选选项的序号,初始值都为-1。
QuestionIndex表示当前题目的序号,currentQuestion用于存储当前题目,全部题目则存放在questionList中。
使用ivx连接组件实现实时对战答题的经验总结
WaitTime是开始答题前的准备倒计时,初始值为5;limitTime是答题时间倒计时,初始值为20。
roomID存放连接创建的房间的ID号;opponentInfo和userInfo分别存放对手和自己的信息,包括得分、暱称和CID码;cid存放的是分享链接中的URL参数,也就是游戏发起人的CID码。
使用ivx连接组件实现实时对战答题的经验总结
四.实时对战答题流程
1.第一步,对战的发起玩家A打开案例,输入暱称后点击Start按钮,这时会先对当前玩家进行登记,然后将A的信息存入userInfo,注意此时变量“cid”还是空值,所以执行的是其余的条件分支,系统会将当前用户A的CID码添加到URL中,然后显示一个横幅,上面就是添加好参数的分享链接,用户把这个链接分享给好友B即可。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
2.第二步,B打开A分享的链接进入案例,前台会在初始化时读取URL中的参数并输出到“cid”中,即此时“cid”中存放了A的CID码值为非空。这样B进行登记并把自己的信息存入userInfo后会执行cid非空的条件分支,首先调用getQuestions从数据库中获取题目,然后生成一个随机数字作为roomID并创建房间,创建成功后B会给A发送一条个人消息,消息的method内容为“starGame”表示邀请进入游戏,同时消息内容还包括roomID、玩家暱称和全部题目,发送完成前台就会跳转到play页面等待下一步操作。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
3.第三步是A接收到B发来的个人消息,如果连接监听到个人消息且消息内容的method为“startGame”,就会去判断opponentInfo是否为空,为空就说明当前还没有对手,就会保存对方发来的roomID,题目数据,还有对手的暱称、得分和CID,然后加入对方的房间。
使用ivx连接组件实现实时对战答题的经验总结
加入房间后A会在房间内发送一条房间消息,告知房间里的用户(也就是B啦)玩家A的暱称和CID,最后跳转到play页面开始播放waitInterval触发器。
使用ivx连接组件实现实时对战答题的经验总结
当然还有一种可能,比如另外一个玩家C也拿到了A分享的链接,进入案例,但此时A已经进入了B的房间,所以A玩家的opponentInfo参数就已经非空了,这时A就会回给C一条拒绝消息,连接监听并判断出是拒绝消息就会对C进行一个提示。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
4.C玩家只是一个插曲,我们再回来看B玩家收到A玩家发送的房间消息的处理,连接如果收到method为“enterGame”的房间消息,且发送者不是自己,就会将对方的信息存入到opponentInfo中,开始播放waitIntercal触发器。
使用ivx连接组件实现实时对战答题的经验总结
5.waitInterval触发器和limitInterval触发器
上面几个步骤之后A,B两个玩家都执行到播放waitInterval触发器了,它实现的是每道题目开始答题前的准备倒计时,并且在结束时会把题目列表中的第一题赋值给“currentQuestion”,然后将自己重置并播放limitInterval触发器。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
而limitInterval触发器则是控制答题时间倒计时的,这里就有两种情况了,一是有玩家进行了答题,这部分逻辑会写在选项的点击事件里,还有就是直到倒计时结束两位玩家都没有答题,那么我们会执行setVariate动作组。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
6.setVariate动作组
setVariate动作组会先判断questionIndex的值,如果不等于questionList的行数减1则说明当前题目还不是最后一道题,就会将questionList中的下一道题的内容赋值给currentQuestion,重置waitInterval触发器和limitInterval触发器。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
如果相等则说明已经答完全部题目了,就比较自己和对手的得分,显示对局结果。如果自己是胜方就调用postUser服务去数据库中更新自己的matchpoint。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
7.玩家选择选项
现在来说一下玩家在答题倒计时结束前进行答题的情况,当玩家点击了选项行或者该选项行中的选择钮,就会把该选项的序号赋值给answerIndex,并且如果对手并未答题对局也没有结束(即opponentAnswer仍为初始值-1,finalResult仍未初始值0),则玩家会给对手发送一条method为chose的个人消息,消息内容就是自己的答题结果。然后执行checkAnswer和setVariate两个动作组。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
对应的,当玩家收到method为chose的个人消息,会将消息中的对方答题结果赋值给opponentAnser,同样执行checkAnswer和setVariate两个动作组。
使用ivx连接组件实现实时对战答题的经验总结
8.checkAnswer动作组
checkAnswer动作组是用来判断当前题目的答题结果,如果opponent大于等于0(即不为初始值-1),则说明当前题目是对手答题,则再判断对手答案是否正确,如果对手答案正确给对手分数加1,choseResult赋值“Opponent score”表示对方的分,如果错误则给自己分数加1,choseResult赋值“Our score”表示己方得分,如果opponent小于0(即仍为初始值-1),则说明当前题目是己方答题,同理进行判断和对应操作。
使用ivx连接组件实现实时对战答题的经验总结
使用ivx连接组件实现实时对战答题的经验总结
最后将整个流程总结如下
使用ivx连接组件实现实时对战答题的经验总结
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章