從 0 到 1,打造自己的遊戲後端服務
  • 簡介
  • 基礎服務
    • 架構介紹
    • Data 服務
    • API 服務
      • 在 Parse 服務架構簡易的 Cloud Code 部署機制
    • Notification 服務
      • Parse 推送服務設定與測試
    • Job 服務
      • 在 Parse 上透過 Cron 配置常用的 Scheduler
    • Email 服務
    • SMS 服務
    • Hosting 服務
    • Realtime 服務
      • Parse Live Query 設定
    • Information 服務
      • Parse Config 與 Firebase Remote Config 服務介紹
      • Connectivity 取得與監聽
      • Time 服務介紹與實作方法
      • IP 資料庫能獲得什麼資料
  • 遊戲服務
    • Achievement 成就系統
      • 設計簡易的成就系統 - 透過 Parse
    • Leaderboard 排行榜系統
      • 設計簡易的公開排行榜系統 - 透過 Parse
    • Pairing 配對系統
      • 設計簡易的 Dispatcherless 自動配對機制 - 透過 Firebase Realtime Database
    • Turn-based Multiplayer 回合制多人遊戲
      • 簡易的回合制多人遊戲系統 - 透過 Parse
    • Real-time Multiplayer 即時多人遊戲
      • 設計簡易的即時多人遊戲傳輸通道 - 透過 Firebase Realtime Database
  • 附錄 Self-Hosted Parse
    • Parse 服務架設
    • 建立 Parse 資料庫服務
    • 建立 Parse 服務
Powered by GitBook
On this page
  • 可靠性通道:嘗試設計多玩家遊戲動作序列
  • 不可靠性通道:嘗試設計公頻聊天系統
  1. 遊戲服務
  2. Real-time Multiplayer 即時多人遊戲

設計簡易的即時多人遊戲傳輸通道 - 透過 Firebase Realtime Database

可靠性通道:嘗試設計多玩家遊戲動作序列

  • 透過節點紀錄每一筆玩家邏輯動作,由玩家 push 每一筆動作資料,由伺服器端接收的順序為準,再返回各玩家的程式中作動

根目錄

自動

資料

Game ID / Action /

${Auto} /

UserID: 玩家 ID,可用於辨識 Action: 動作 Value: 數值 Time: 動作時間 ...

  • 玩家透過 push 傳送命令資料

FIRDatabaseReference* ref = [[[FIRDatabase database] reference] child:@"Game/UUID GAME ID/Action"];
NSString *key = [ref childByAutoId].key;
NSDictionary *action = @{
                       @"UserID": @"USER ID A",
                       @"Action": "Hit",
                       @"Value": 50,
                       @"Time": [FIRServerValue timestamp]};
NSDictionary *childUpdates = @{[@"/" stringByAppendingString:key]: action};
[_ref updateChildValues:childUpdates];
  • 起始玩家,透過監聽 onChildAdded,取得命令序列

FIRDatabaseReference* ref = [[[FIRDatabase database] reference] child:@"Game/UUID GAME ID/Action"];
FIRDatabaseHandle handle = [ref observeEventType:FIRDataEventTypeChildAdded
                                       withBlock:^(FIRDataSnapshot* _Nonnull snapshot) {
                                           if (snapshot.value != [NSNull null]) {
                                               // 監聽 ChildAdded
                                           }
                                       }];
  • 觀眾、重播系統,可取得節點 SnapShot 重建遊戲歷程

FIRDatabaseReference* ref = [[[FIRDatabase database] reference] child:@"Game/UUID GAME ID/Action"];
[ref observeSingleEventOfType:FIRDataEventTypeValue
                    withBlock:^(FIRDataSnapshot* _Nonnull snapshot) {
                        if (snapshot.value != [NSNull null]) {
                            // 取得 Action Sanpshot
                        }
                    }
              withCancelBlock:^(NSError* _Nonnull error){
                  // 失敗
              }];

不可靠性通道:嘗試設計公頻聊天系統

  • 透過節點單一筆資料紀錄最新發言內容,透過監聽 onUpdate 事件來取得新的對話,由使用者端形成對話歷史。這樣的優點是,不用特意儲存與刪除大量的聊天記錄

根目錄

資料

Game ID / Chat / Public /

UserID: 玩家 ID,用於辨識 Name: 玩家姓名 Image: 玩家圖片 Message: 玩家聊天內容 Time: 發言時間 ...

  • 透過 REST API 或是 SDK(不開啟 Offline Capabilities)來進行發言嘗試

FIRDatabaseReference* ref = [[[FIRDatabase database] reference] child:@"Game/UUID GAME ID/Chat/Public"];
NSDictionary* message = @{
    @"UserID" : @"USER ID A",
    @"Name" : @"USER NAME",
    @"Image" : @"IMAGE URL",
    @"Time" : [FIRServerValue timestamp]
};
[_ref updateChildValues:message];
  • 玩家顯示介面綁定監聽 onUpdate

FIRDatabaseReference* ref = [[[FIRDatabase database] reference] child:@"Game/UUID GAME ID/Chat/Public"];
FIRDatabaseHandle handle = [ref observeEventType:FIRDataEventTypeChildChanged
                                       withBlock:^(FIRDataSnapshot* _Nonnull snapshot) {
                                           if (snapshot.value != [NSNull null]) {
                                               // 監聽最新聊天訊息
                                           }
                                       }];
PreviousReal-time Multiplayer 即時多人遊戲NextParse 服務架設

Last updated 6 years ago