加入並建立房間SmartFoxServer 2X
»加入並建立房間
SFS2X框架中的一個基本構件是Room物件。客房允許安排玩家,以便他們可以“看到”彼此並在一起互動。房間的典型用途是在聊天應用程式中建立不同的類別,在虛擬世界中的不同會議地點或在各種遊戲中挑戰其他朋友的不同地方。
客房以兩種不同的方式建立。
靜態地:通過AdminTool中的Zone Configurator模組。這是在您的區域(例如,大廳)中建立永久性房間的一種有用的方法,它們在啟動SmartFoxServer例項後初始化。 動態地:可以在客戶端或伺服器的執行時建立和銷燬房間。從一個或另一個方面建立的房間沒有區別,但是在伺服器端可以對客戶端出於安全原因無法訪問的某些方面進行微調。
例如,在我們的BasicExamples區域(預設情況下我們提供的),有一個名為“大廳”的靜態房間,可以在任何客戶端成功登入到該區域後加入。
從客戶端API加入房間需要一行程式碼(sfs是SmartFox類例項):
sfs.send( new JoinRoomRequest("The Lobby") );
伺服器將依次響應以下事件之一:
SFSEvent.ROOM_JOIN,如果操作成功
SFSEvent.ROOM_JOIN_ERROR,如果發生錯誤
像往常一樣,我們需要在我們的主要SmartFox類例項中註冊事件,以通知連線操作的結果。 這是處理這兩種情況所需的完整ActionScript 3程式碼(與其他語言非常相似)。
該程式碼通常在應用程式初始化期間執行:
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);
}
什麼可能出錯?
有一些可能的事情可能會使加入房間的嘗試失效。
房間已滿:每間客房都有一定的容量。如果達到最大使用者數量,則不會有更多客戶端可以加入,直到有幾個插槽可用。
房間不存在:加入請求中提供的房間號無效。沒有房間被找到與該名稱或房間ID(唯一的房間號,可以用於替代名稱)。
密碼錯誤:客房可以通過使用密碼進行私人化。如果您不知道此密碼或您忘記了密碼,您將無法訪問房間。
同時加入一個或多個房間
在大多數情況下,客戶端可能會從新房間移動到另一個房間,離開前一個房間。這是SFS2X及其API預設執行的預設模式。
然而,在某些情況下,我們需要客戶在進入另一個房間(可能是遊戲或聊天室)時繼續加入房間(通常是大廳)。我們從客戶端API中檢查JoinRoomRequest建構函式。以下引數可用。
id:房間ID可以是其名稱(String)或數字ID(int)。
通過:(可選)密碼,如果房間是私人的。
roomToLeave:(可選)指示當新的連線成功時應該留下哪個房間。預設情況下,使用最後加入的房間。但是如果使用者已經加入了其他幾個房間,我們可以在這裡指定應該留下的房間。值-1將表示不應該留下任何房間。
asSpect:(可選)此選項僅適用於遊戲室,並允許使用者作為遊戲中的“觀眾”加入(稍後再說)。
為了跟蹤客戶端上加入的客戶端,API提供了一些有用的工具:
SmartFox類例項的lastJoinedRoom屬性提供對已連線的最後一個房間的引用;當此值設定為null時,沒有客房已加入;
同一類的joinedRooms屬性將提供客戶端當前加入的所有房間的列表。
最後,SmartFox類中的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事件中通知錯誤訊息。房間無法建立可能有幾個原因。
缺少使用者許可權:根據特權管理員的配置,可能不允許具有特定許可權配置檔案的使用者在系統中建立新客房。
重複的房間名稱:兩個房間在同一個區域不能具有相同的名稱。檢查應用於區分大小寫模式。
房間名稱中的錯誤字:如果在區域中配置了Word過濾器並應用於房間名稱(請參閱AdminTool中的區域配置器),則可能會拒絕建立,因為在房間名稱中檢測到發音字。
達到最大數量的使用者建立的房間:出於安全考慮,該區域配置了可配置的最大數量的房間,每個使用者可以一次建立。如果客戶已經建立了三個房間(全部是活動的),而限制設定為三個,則建立房間的新嘗試將會失敗,直到其中一個房間被刪除。
到達區域的最大客房數量:一個區域可配置最大數量的房間。達到此值後,只有在刪除某些舊房間後,才能建立更多房間。
您可以在API文件(客戶端和伺服器)中瞭解有關RoomSettings引數的所有詳細資訊。
基本客房概念
在SFS2X框架中,房間是一個非常複雜的工具,可以在每個細節上進行配置。本文不是為了分析所有這些方面。如果您想了解所有的細節,我們建議您參考房間架構指南。
在本節中,我們將提及兩種不同型別的客房:遊戲室和非遊戲室(或“常規”房間)。
常規房間:預設情況下,建立一個新房間,將isGame標誌設定為false。您可以使用這些房間用於所有目的,如建立大廳,聊天室,會議室等。
遊戲室:當isGame標誌設定為true時,房間提供了幾個額外的功能,這對大多數遊戲至關重要。
播放器ID的自動分配:每個使用者自動分配從1到N的唯一播放器ID值,為開發人員提供一種識別每個播放器的簡單方法。播放器ID由伺服器透明地管理和分配。
支援非玩家使用者(觀眾):該房間可以建立一定數量的玩家插槽和觀眾插槽(例如2個玩家和8個觀眾)。這將使其他使用者可以作為非玩家加入房間並觀看遊戲。如果一個或多個玩家離開遊戲,開發者可以允許觀眾加入遊戲(參見SpectatorToPlayerRequest和PlayerToSpectatorRequest請求)。
建立遊戲室時,始終記住設定isGame標誌,並配置該房間允許的最大玩家人數和觀眾人數。
高階遊戲室和遊戲API
對於SmartFoxServer 1,SFS2X平臺提供了一套專為遊戲建立和管理而設計的客戶端和伺服器API,包括公共和私人遊戲,遊戲邀請,使用者和房間匹配等等。
通過在客戶端和伺服器端發現的SFSGame類引入了一種新型的遊戲室。新類擴充套件了Room物件,提供了數十種新功能,使開發人員能夠快速建立高階玩家匹配,挑戰和遊戲邀請。
我們強烈建議您檢視Game API文章以獲取更多資訊。