身為meowbit的愛用者來說,若可以用meowbit設計出一款無線對戰遊戲肯定是帥的讓班上的孩子們目瞪口呆,但源生自micro:bit廣播功能的擴展卡SD-wireless要達成雙人遊戲又在傳輸上不出現錯誤,真是一門學問呢! 首先,讓我們先釐清訊號傳輸的過程中為什麼會出現錯誤訊息呢? 其次,我們會將傳輸過程出現錯誤到解決的方法分成四個步驟說明
▲觀察上圖,我們可以發現 microbit及 SD-wireless 所使用的訊號發送方式都是 Radio (廣播)方式 早期有玩過車隊的人都知道,Radio(無線電)傳輸方式多麼的酷炫,找到自己的頻段,有一群人跟車要在10公里以內,雖然有話語權的限制,卻在有限距離的狀態下大夥們能夠暢所欲言。 當然,回想Radio的溝通過程後,我們也不難發現 ☹ 0 ‘:.’: 這樣的錯誤訊息是怎麼回事。 因此,要先從第一段,本機發訊出現錯誤訊號的問題開始解決。 首先我們先寫出一段SD-wireless要不斷的將”控制資訊”與”角色位置”傳遞出去的程式 ▲由於對戰的遊戲包含物理機制,因此控制傳輸內容有6項,加上遊戲更新過程中傳遞角色位置資訊 ▲控制過程中發生sd-wireless錯誤訊息 廣播(Radio)訊息傳遞的過程中,訊號會以串列的方式傳輸,因此當同一個時間中想要將兩段訊息透過 sd-wireless 傳輸出去,就會發生以上的錯誤訊息。 單機的解決方式上,我們可以透過傳輸佔用頻道的狀態來解決傳輸衝突的問題 ▲設計一個開關變數 sd_timer_click 當座標訊息傳輸的過程中 sd_timer_click 變數會開啟,此時間所有的操控都會因為判斷,而無法傳遞訊號,由此一來就可以避免單機上訊息發送的衝突。 ▲透過佔用傳輸的變數開關,避免了錯誤訊息 再來我們會將兩台主機安裝以上相同的程式,來進行遊戲 ▲同程式雙機運行狀態 很快的我們便會發現,訊號的"傳送"與"輸入"同時發生,因此其中一台主機便會產生錯誤訊息。 解決以上問題邏輯上會有三個步驟: 第一:減少訊號的傳遞量就可以減少錯誤發生 第二:將訊息透過排隊的方式傳送出去 第三:兩台機器更新訊號的頻率相同,可達成訊號平行不相交 因此第一步,我們要將按鍵”鬆開”的訊號項目交給接收端處理訊息,如此一來便可以減少兩項訊號傳輸 第二步,設計一個暫存變數 (temp) 將按鍵按下後改變變數,變數會於固定時間送出訊息 ▲控制時發出訊號,傳輸的訊號時間會非常難以掌控,因此透過暫存(temp)變數存取資訊 當然,小編採用的寫法是比較簡單的方式,覆蓋前一筆訊息,若想要每個步驟都可以存取發送,則可以採取(FIFO)先進先出的暫存方式處裡欲將發送的訊號串 ▲SD-wireless 發送訊息透過遊戲更新時送出。 以上遊戲更新的間隔,注意使用(質數),因為任兩質數的公倍數為兩質數相乘的倍數,因此可以更容易的判斷本機發送訊號可能會錯誤的時機點。 ▲兩質數時脈交會的過程中,其中控制訊息不發送,僅發送較為重要的位置同步訊息 完成以上的訊息傳送迴避後,將遊戲燒錄於兩台主機,則可以避免錯誤訊號出現大約兩分鐘左右。 ▲最終的雙人遊戲控制版本
以上是,研究三天來的錯誤解決方法,若您有更好的方式,或任何問題歡迎留言給我們喔。 2020/05/05 – by哈編
0 評論
發表回覆。 |
作者將一些常見問題提出解決方案。 發布紀錄
八月 2022
類別
全部
|