iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
1
自我挑戰組

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

#7 事件驅動開發:從時間寶石中看見的未來

今天大致會談三個部份:

  1. 如何解決等待輸入時被卡死的程式?
  2. 如何讓程式同一時間處理不同的運算?
  3. 事件驅動程式開發

如何解決等待輸入時被卡死的程式?
早期 win 平台的開發者會用 kbhit() 來處理這類問題,不過這不在 C 的標準庫裡面,所以在別的平台要透過模擬的方法。原理是修改 stdin 的內部屬性,把 blocking 模式設定成 non-blocking 。

這問題要透過非阻塞式I/O (non-blocking I/O) 處理,然後查網路資料應該會同時看到非同步I/O (asynchronous I/O)。兩者是不同的概念,但本篇不會花時間解釋它的差異,有興趣的同學可以看頁面下的參考連結。

最直白的說明,你希望程式輸入的時候不要卡住,就用非阻塞式IO。後面講到event 的 keydown, keypress, keyup 時,那部份也不會有卡住的問題,這樣就可以了。

non-blocking I/O 的程式行為有點像郵差先生,他會定期去郵筒檢查有沒有新的信?沒有的話就會離開,所以程式會需要不斷地進行檢查,有人覺得會浪費 CPU 資源,所以後面又有一個解決方案: 回呼函式 (callback function),催生了事件驅動程式開發,後段會解釋。

如何讓程式同一時間處理不同的運算?
系統利用執行緒 (Thread) 來解決。執行緒就是小程式,然後每次執行一小段時間就會切換給其他的執行緒,因為切換的時間很快,所以使用者以為程式是同時運算的,但其實一次還是只有執行一個程式,那是人的錯覺。切換的部份是系統自動處理的,所以遊戲開發者只要會操作執行緒就可以了。

事件驅動程式開發
前面提到回呼函數,回呼函數最重要的意義是讓原本主動執行的函數呼叫變成其他函數使用的「參數」。在事件驅動的架構,回呼函數變成事件函數的「參數」,大幅增加了程式的彈性。

回呼函式最常見的應用場景是按鈕的 onClick ,當按鈕被按下的時候,它會去呼叫 onClick 所指定的回呼函式。這個回呼函數可能是「跳出對話方塊」、「音量變大」、「打開選單」、「關閉視窗」… 這傳統循序執行的程式架構下是沒辦法達成的,這樣的架構最符合一般程式應用的場景,成為圖形化程式的主流開發架構。

實務上,事件驅動需要啟動一個事件迴圈,事件函數需要註冊到監聽器,才有機會被觸發。

明天,我們將介紹,另一個遊戲開發的強大利器:狀態機
希望大家能在時間寶石中預見你想要的未來:)


上一篇
#6 遊戲的基本流程:輸出、輸入、更新狀態
下一篇
#8 狀態機:流程圖的好朋友
系列文
卡牌連線遊戲開發經驗分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言