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

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

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

  • 玩家透過 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 事件來取得新的對話,由使用者端形成對話歷史。這樣的優點是,不用特意儲存與刪除大量的聊天記錄

  • 透過 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]) {
                                               // 監聽最新聊天訊息
                                           }
                                       }];

Last updated