iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
0
自我挑戰組

卡牌連線遊戲開發經驗分享系列 第 16

#16 事件迴圈小結論 & 補充實作說明

  • 分享至 

  • xImage
  •  

Player Host 示意圖

玩家端範例
事件迴圈:Dispatcher.eventLoop, PlayerCtrl.eventLoop
佇列:_inbox, _outbox
執行緒:Dispatcher.eventLoop, PlayerCtrl.eventLoop
信號:_ACTIVE
※ PlayerCtrl 其實就是跟遊戲引擎的事件迴圈,因為還沒正式嫁接,故採用模擬的方式呈現。

主控端範例
事件迴圈:playerLoop x2
佇列:_pipes_from x2, _pipes_to x2
執行緒:playerAtionTest, playerLoop x2,
forceEnd_countDown, gameOver_countDown
信號:_actived x2, _next, _gameOver

執行緒大致分成兩種:

  1. 單次執行:完成特定任務,執行結束後會自動釋放
    如:倒數計時器、玩家行動模擬函式
  2. 常駐待命:類似後台服務,使用信號控制啟動。
    特色是外面雙層 while True:

Host-demo.py (Repl.it線上執行版) 更新摘要:

  • 修正 ActionTest ,改成可外部控制的形式,避免無法中斷的窘境。
    於是 ActionTest 變成單次執行,取消無窮迴圈
  • 擴充輸出文字,提供更多資訊以便了解執行緒的運作
  • 找到設計不良的 Thread,將 playerLoop 改成常駐待命
    在 GameCtrl 初始化時建立,避免程式建立重複的執行緒
  • 把「事件訊息」封裝成 cmdPack 物件。
    不必再考慮是否有額外參數的問題,同時美化無參數的 cmdPack 的列印字串

TODO:

  1. 封裝主控端和玩家端溝通的介面,保護內部資料
  2. 實作 GameCtrl「註冊事件」功能,動態控制監聽的事件
  3. 實作可切換的事件迴圈(大廳操作、賽局操作),增加系統彈性
  4. 導入 logging 套件(列印文字的靈感來源)至專案

後面工作:

  1. 整合系統,處理鍵盤滑鼠輸出的事件迴圈、處理玩家端和系統端的連線通訊
  2. 實作玩家連線建立對戰的流程,可能會用 asyncio 協程處理,玩玩看剛學到的非同步操作
  3. 實作卡牌層、物件層、規則層
  4. 把爐石的卡牌機制實作出來
  5. 嚐試導入 TDD 測試導向開發,讓專案更完善
  6. 紀錄開發過程中的體驗和心得,結束鐵人賽

上一篇
#15 遊戲實作:遊戲流程、玩家行動、切換玩家
下一篇
#17 關於連線遊戲開發
系列文
卡牌連線遊戲開發經驗分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言