使用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連接組件實現實時對戰答題的經驗總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章