開發基礎:加入與建立房間

» 加入與建立房間

房間物件( Room object)是SFS2X的基礎建構方塊中的一部分。房間可以安排玩家,因此玩家可以”看”到彼此,並且與其他玩家互動。典型的房間使用例子像是在聊天程式中不同主題的房間,虛擬世界中的不同開會地點,或是在各種分類中的不同地點挑戰其他朋友。

房間建立的兩種方法:

  • 靜態的(Statically): 透過 AdminTool中的Zone Configurator 模組建立。這是在區域中建立持續存在的房間(譬如說一個大廳(Lobby))的有效方法。這類型房間會在SmartFoxServer 開啟時就被初始化。
  • 動態的(Dynamically):房間可以在執行期間由客戶端或是伺服端建立或摧毀。客戶端或是伺服端建立的房間並無差別。但是伺服端可以調整一些基於安全理由而不讓客戶端存取的部分。

譬如說,在我們BasicExamples 區域中(預設提供的),有一個靜態的房間稱之為” The Lobby “,可以被所有成功登入區域中的使用者加入。

由客戶端API加入房間只需要一行程式碼(sfs 是 SmartFox 類別的實例):。

sfs.send( new JoinRoomRequest("The Lobby"));

伺服端會傳回下面事件:

  • SFSEvent.ROOM_JOIN,當登入成功時傳回
  • SFSEvent.ROOM_JOIN_ERROR,當錯誤方生時傳回。

跟以往一樣我們需要在主要的SmartFox  類別實例中註冊事件,才能夠接受加入操作結果的通知。下面是處理兩件事件的完整ActionScript3程式碼。(其他語言也十分類似)。

下面程式碼通常在應用程式初始化前執行:

var sfs:SmartFox = new SmartFox();
sfs.addEventListener(SFSEvent.ROOM_JOIN, onJoin);
sfs.addEventListener(SFSEvent.ROOM_JOIN_ERROR, onJoinError);
...

下面程式碼在登入成功後執行:

sfs.send( new JoinRoomRequest("The Lobby") );

下面這個是事件監聽器:

public function onJoin(evt:SFSEvent):void
{
    trace("Joined Room: " + evt.params.room.name);
}
 
public function onJoinError(evt:SFSEvent):void
{
    trace("Join failed: " + evt.params.errorMessage);
}

會出錯的地方?

有一些可能會發生的事情導致登入失敗:

  • 房間滿了(Room is full):每個房間都有一定的容量。假如已經達到最大使用者,使用者就無法再加入房間,直到有空位為止。
  • 房間不存在(Room doesn't exist): 在加入請求中提供的房間id是無效的,找不到該名稱或是房間id(唯一的房間號碼,可與房間名稱擇一使用)的房間。
  • 密碼錯誤(Wrong password):房間可透過使用密碼來變成私有的。假如你不知道房間密碼或是你忘了,你就無法存取該房間。

同時加入一個或多個房間

在大多數的情況下,客戶端可能會從一個房間移動到另一個房間,在加入一個新房間後會離開原來的房間。這是在SFS2X中的預設模式,而API的操作也是在預設模式下。

但是有些狀況是,我們需要客戶端在進入另一個房間時(可能是一個遊戲或是聊天房間),依然能夠存在在舊房間中(通常是一個大廳(Lobby))。讓我們來看看來自客戶端API的JoinRoomRequest構造函數。有下面幾個參數:

  • id: 房間id可以是房間名稱(字串),或是數字型態的id (int)。
  • pass: (可選的)私有房間的密碼
  • roomToLeave: (可選的) 當成功加入新房間時要離開的房間。預設情況下是最後一個加入的房間(維克:新加入前的最後一個==”)。但是如果使用者已經加入了許多其他的房間,這裡我們可以指定要離開的房間。如果指定此參數為-1代表沒有離開任何房間。
  • asSpect: (可選的) 這個選項只有遊戲房間可以使用(維克:遊戲房間是房間中的一種類型。),允許使用者以觀眾的身分進入遊戲。

為了要能夠在客戶端追蹤已加入的房間,API提供了一對有用的工具:

  •  SmartFox 類別實例中的lastJoinedRoom 屬性,提供了最後加入房間的參考,當這個值被設為null時,代表沒有加入任何房間。
  • 同樣類別中的 joinedRooms 屬性提供客戶端當前加入的所有房間的列表。

最後,在SmartFox class中的roomManager 物件允許查詢本地房間列表的資料。

動態建立房間

房間可以在(登入後的)任何時間由程式碼建立,不論是在客戶端或是伺服端。下面是一個在ActionScript 3中的快速範例。(為了要簡化程式碼,監聽器在建立房間前新增。但其實監聽器應該放在應用程式初始化的地方):

smartFox.addEventListener(SFSEvent.ROOM_ADD, onRoomAdded)
smartFox.addEventListener(SFSEvent.ROOM_CREATION_ERROR, onRoomCreationError)
 
// Create a new Chat Room
var settings:RoomSettings = new RoomSettings("Piggy's Chat Room")
settings.maxUsers = 40
settings.groupId = "ChatGroup"
 
smartFox.send(new CreateRoomRequest(settings))

下面是事件監聽器:

function onRoomAdded(evt:SFSEvent):void
{
    trace("A new Room was added: " + evt.params.room )
}
 
function onRoomCreationError(evt:SFSEvent):void
{
    trace("An error occurred while attempting to create the Room: " + evt.params.errorMessage)
}

RoomSetting 類別可以指定大量的參數以調整主要與次要的房間部分。假如房間建立成功,SFSEvent.ROOM_ADD事件會被傳回到客戶端中,不然的話就會傳回 包含錯誤訊息的SFSEvent.ROOM_CREATION_ERROR 事件。無法建立房間有幾種理由:

  • 缺少使用者權限(Lack of User Permission):依據你的Privilege Manager設定,某些使用者的權限可能不被允許建立房間。
  • 重複的房間名稱(Duplicate Room name): 房間不能有相同的名稱,名稱是大小寫敏感的。
  • 房間名稱有不好的字眼(Bad Words in Room name):假如在區域設定中有設定字詞過濾器,並且允許作用在房間名稱中(請參考AdminTool中的Zone Configurator ) 。那麼包含謾罵字眼的的房間名稱是無法被建立的。
  • 最大使用者建立房間以滿(Maximum number of user-created Rooms is reached): 為了安全的理由,區域中會設定每個使用者能建立的最大房間數。假如使用者已經建立了三個房間(並且都是在啟用狀態(active)),而且最大的數量設定為三。那麼一直到舊房間被移除為前,企圖建立一個新房間是會失敗的。
  • 區域最大房間以滿(Maximum number of Rooms in the Zone is reached): 區域中可以設定最大的房間數量。當房間數量達到該值時,無法在建立新的房間直到舊房間被移除為止。

你可以在API 文件中(客戶端與伺服端)學到關於 RoomSettings 參數的更多細節。

基本的房間觀念

在SFS2X 中,房間是一個相當複雜的工具,可以配置每個微小的細節。這篇文章不適用來分析這些方面的。假如你想要學習細節部分,我們建議你參考一下這份文件: this guide to Room architecture

在這個章節中,我們將提到兩個不同的房間類型:遊戲房間與非遊戲房間(或者稱之為標準房間(regular rooms))

  • 標準房間(Regular Rooms):預設情況下房間建立時isGame 旗標會設定為false。你可以使用這房間來做為所有目的的房間,像是建立一個大廳,聊天房間,會議房間等等。
  • 遊戲房間(Game Rooms) 當isGame 旗標設定為true 時,房間提供兩個對大部分遊戲都需要的額外功能。
    • 自動指定玩家IDs( Automatic assignment of player IDs):每個使用者都會自動被分配一個唯一個值,該值從1到N,提供開發者一個簡單的方法來分辨玩家。玩家IDs都是由伺服端透明地建立與管理。
    • 支援非玩家使用者(觀眾)(Support for non-player users (spectators)):房間可以擁有某個數量的玩家空位與觀眾空位(例如2個玩家,8個觀眾).這可以讓其他使用者以觀眾身分加入遊戲並且觀賞遊戲。假如有一個或是多個玩家離開遊戲,咖發者可以允許觀眾加入遊戲(請參考SpectatorToPlayerRequest 與PlayerToSpectatorRequest請求)。

當建立遊戲房間時要記得設定isGame 旗標,並且配置房間中玩家與觀眾的最大數量。

進階遊戲房間與遊戲API

相較於SmartFoxServer 1,SFS2X平台提供了一組新的客戶端與伺服端APIs,特別為了遊戲的建立與維護而設計,包含了公開與私有遊戲,遊戲邀請,使用者與房間配對等等。

一個新類型的遊戲房間會經由SFSGame  類別來介紹。這個類別可以在客戶端與伺服端API中找到。這個類別繼承了房間物件,提供了大量的新功能,能夠讓使用者在簡短的程式碼中,建立進階的玩家配對,挑戰與遊戲邀請。

我們強烈建議看一下 Game API article 以取得更多的訊息。

上一篇:開發基礎:登入階段

 
 

  按個讚!~支持本站!~

FB推薦載入中