寫在前面:
手遊的雙人對戰實現方式有很多,比如:
- 連網對戰(需要一個伺服器負責轉發用戶端請求,各種大型手遊的做法)
- 分屏對戰(手機上下分屏,典型的例子就是切水果的雙人對戰)
- 藍牙連線對戰(透過藍牙連線,典型的例子是三國 Kill 連線版)
首先,連網對戰不考慮(成本高,伺服器貴..),而分屏對戰侷限性太大(兩個人用一個手機玩,太不方便了)
所以藍牙連線對戰是不錯的選擇,低成本,可實現(三國 Kill 就是最好的例子,至少證明了這是可行的)
一. 資源蒐集
搜尋「安卓開發藍牙連線」,找到很多有用的資訊,經過篩選發現大多資訊都是與 BluetoothChat 有關的,了解後發現 BluetoothChat 是一個官方 Demo,這就好辦了
先把原始碼 down 過來,又順便找到了前輩的原始碼解析,省了好多事兒,簡單整理了一下,資源如下:(前兩個來自網路,後兩個是新鮮出爐的)
二. Demo 測試
拿到 Demo 先確定可以用:
- 匯入 Eclipse,出現紅叉叉,修改 AndroidManifest.xml 中的 SDK 版本,紅叉叉沒了
- 連接手機,安裝執行,程式異常終止,檢查 Log,錯誤訊息為 you can not combine custom titles with other title
- 最後更改資源檔案解決了這個問題,問題詳細及解決方案如下:
- 測試成功,真機連線聊天沒問題
使用 Demo 中可能遇到的問題:
- you can not combine custom titles with other title 錯誤原因以及怎麼解決?
原因:xml 裡面定義的 activity 的 theme 和程式碼定義的 theme 不一致,即 title 樣式衝突
解決方案:把 xml 裡對應的 activity 裡的 theme 改成 @android:style/Theme
注意:如果 xml 裡 activity 沒有 theme 標籤,應該添加 theme 標籤並設置為上面的值
解決方案:把 xml 裡對應的 activity 裡的 theme 改成 @android:style/Theme
注意:如果 xml 裡 activity 沒有 theme 標籤,應該添加 theme 標籤並設置為上面的值
真機執行效果如下:
三. 藍牙連線過程
- 宣告藍牙相關權限(關於權限的詳細見前輩的原始碼解析,不在此贅述)
- 獲取本機藍牙配接器(BluetoothAdapter 是系統提供的藍牙介面,透過配接器操作本機藍牙)
- 掃描可連接的外部藍牙設備(透過接收藍牙模組回傳的廣播訊息得到外部設備的相關資訊)
- 獲取外部設備的 MAC 位址
- 透過 MAC 位址建立 Socket 連接(有了 Socket 連接就好辦了,下面的工作和一般的 Socket 聊天程式沒什麼區別了)
- 透過 Socket 連接收發訊息
簡單的說,連線過程就是上面幾個步驟,筆者對原始碼進行理解分析後(參照了前輩的原始碼解析),補充了更易讀的注釋,如:
四. 總結
原始碼分析是一件耗時耗力的事情,但如果有時間的話,這樣的付出絕對是值得的,比單純的 copy-modify 要好很多,在分析別人的程式碼過程中,我們可以得到這些東西:
- 實現原理(比如用來實現功能的各個組件的分工、互動,而不只是簡單的了解程式碼區塊的功能)
- 編碼規範(比如一開始會很好奇為什麼要分方法,分類,分層...)
- 編碼風格(變數、方法、類別、套件的命名規則,縮排風格...)
- 小技巧/常識(比如為了避免發佈前刪除偵錯資訊的工作,可以定義一個標識變數表示處於偵錯階段,把所有輸出偵錯資訊的程式碼包裹在 if 區塊中,發佈前只需要把標識變數改為 false 即可)

暫無評論,快來發表你的看法吧