開發基礎:房間結構

» 房間結構

在任何的多人應用程式中,房間物件( Room object)都是其中一個最重要的基礎建構方塊中。他負責分組與將使用者連現在一起並且讓使用者能夠與彼此互動。從開發者的角度來看,它提供了有用的事件,能夠幫助建立應用程式邏輯,而且每個房間都能夠被不同的伺服端擴展程式管理。

在這節中我們將剖析由房間物件提個的許多特徵,以及在SFS2X框架中新的強力功能。

» 一般架構

我們在這份文件的其他文章中有提到,在SFS2X 中,介紹了一個新的主要元素,房間群組

上面的圖可以闡明何謂房間群組。就像我們看見的,房間依然包含在區域中,而且看起來他們是在“同一等級”。實際上這是用來表示房間群組的一般結構的最好方法:事實上群組只是房間的一個額外的ID,代表能夠用來過濾與切割的分類。

這樣的功能能夠讓使用者將整個區域結構本地視野限制到只有一個或是多的群組中,而不是整個目錄。使用的案例不計其數:分開不同類型的遊戲房間,建立不同的應用程式區域(areas),為某些類型的使用者隱藏某些房間,等等。

群組房間的好處是可以最小化傳送到客戶端的資料,並且能降低更新事件的數量,讓應用程式更有效率。

» 房間類型

SFS2X 提供三種類型的房間:標準( Regular)遊戲(Game) 與 MMO, 每個都有比前一代SmartFoxServer 1.x 有更高等級的控制。有新的能力可以設定房間的每個微小細節,開發者能夠可以快速地建立許多不同的行為,複雜的互動與各種遊戲類型的架構。

在SFS2X 新的房間功能中,我們能夠在執行階段動態地更改名稱、大小與上鎖/解鎖每個房間。另外我們現在能夠選擇房間要傳送那些事件到客戶端,並且精確地控制房間的生命週期。

像以往一樣,房間變數用來儲存客製化的資料,而新的功能也已經介紹過(後面有更多) 。最後伺服器API提供進階的功能,能夠藉由客製化標準、匹配比對、挑戰與邀請等等來搜尋房間

» 遊戲房間

遊戲房間是個專門的房間類型,有著下面額外的功能:

  • 自動分配使用者ID給每個玩家(在回合遊戲中特別有用)
  • 支援玩家與觀眾,分開計數。觀眾並不會被分配ID。
  • 預設情況下遊戲房間的生命週期會在所有玩家離開房間時結束。

» MMO房間

MMO房間繼承了標準房間的功能,並且新增了一個興趣區域(Area of Interest)(簡稱AoI),以決定使用者接收事件的區域。AoI參數表示使用者能夠互相影響的區域,例如當送出公開訊息,更新使用者變數,等等。MMO 房間特別適合大型的虛擬世界,上千的遊戲玩家以最小的網路代價,在遼闊的地圖上暴露與互動。

» 房間設定介紹

為了要建立這篇文章(this article(譯文))中描述的房間,只需要一些強制性的參數,假如你對進階的選項沒興趣的話,其他的只要使用原本的預設值就好。

讓我們來看一下所有可用的設定,這些設定全部包含在RoomSettings  類別中。(請參考API文件)。所有的設定在客戶端與伺服端都是可用的,雖然在客戶端有些限制以避免惡毒的程式碼利用spam與令人討厭的攻擊方式攻擊伺服器。

» 基本設定

下面是基本設定的列表

  • 名稱(name):房間的名稱,必須是唯一的
  • 密碼(password):假如有指定密碼,那房間會變成私有的。(可選擇的項目)
  • 最大使用者(maxUsers): 房間中允許的最大使用者數量(可選擇的項目,預設為20)
  • 最大允許變數(maxVariablesAllowed): 最大允許的房間變數數量(可選擇的項目,預設為5)
  • 是否為遊戲房間(isGame): 假如房間是遊戲用途,這個旗標要設定為true,(可選擇的項目)
  • 最大觀眾(maxSpectators): 假如是遊戲房間的話,你應該要設定有多少觀眾可以在房間中(可選擇的項目,預設為0)。

» 進階設定

下面是更多進階設定的列表,提供進一步的詳細細節。

  • 自動移除模式(autoRemoveMode): 決定房間的生命週期, 換句話說代表房間何時會被摧毀(可選的)。
  • 房間變數(roomVariables):提供房間變數列表,在房間建立時就被附加到房間中(可選的)。
  • 擴展(extension):動態貼上伺服端擴展到房間中,為你的遊戲增加客製化的邏輯(可選的)。

» 調整設定

下面是依些額外設定的列表,提供進一步的詳細細節。

  • 房間設定(roomSettings):可以指定房間使用的權限與事件
  • 不好詞彙過濾器(badWordsFilter):設定不好詞彙的過濾選項(可選的)。
  • 可製化玩家ID產生類別(customPlayerIdGeneratorClass):可以為遊戲房間提供客製化類別來處理玩家Id的產生。(可選的)。

» 房間進階設定

» 自動移除模式

AutoRemoveMode 選項可以選擇4種不同的房間生命週期的處理方式。

  • 預設(DEFAULT):沒設定的話就會使用這個預設值。在這個模式下標準房間會在房間空掉而且建立者已不在區域中登入時移除。遊戲房間則是在房間空掉時就立刻移除。
  • WHEN_EMPTY:當房間空掉時會被移除。
  • WHEN_EMPTY_AND_CREATOR_IS_GONE:當房間空掉而且建立者登出時會被移除
  • NEVER: 房間不會被移除。

注意#1
要讓自動移除的功能啟用,房間的 isDynamic 要設定為true。
注意#2
AutoRemoveMode 設定只能在伺服端API中取得。客戶端永遠只能設定為DEFAULT。

» 房間變數

房間變數(Room Variables)是房間中一個有用的變數可以用來儲存客製化的資料以維護應用程式狀態。這些變數會自動與房間內使用者同步。這使得他成為一個強力的工具可以快速的改變遊戲狀態,分數與其他在玩家間傳播的值。

SFS2X API 也提供了許多設定來控制存取,生命週期與每個房間的可見性。讓我們詳細地來看一下房間變數的屬性。

  • 名稱(name):變數唯一的名稱
  • isPrivate: 假如設定此值,房間變數只能由建立者刪除或修改(可選的,預設值為false)
  • isPersistent: 預設情況下時使用者建立的房間變數會在使用者離開時移除,假如這個旗標被開啟,那房間變數會持續直到使用者登出或是離線(可選的,預設值為false)
  • isGlobal:預設情況下房間變數會更新並且傳送到房間中所有的使用者上。一個全域房間變數的更新會傳送到同一房間群組中的所有使用者(可選的,預設值為false)。
  • isHidden: 假如設定此值,房間變數只能在伺服端取得並且不會被傳送到客戶端。(可選的,預設為false)。
  • value: 房間變數的值。支援下面幾種類型:
    • Boolean
    • Integer
    • Double
    • String
    • SFSObject
    • SFSArray
    • Null (這然這不是一種類型,但它值得一提,因為它是用來刪除房間變數的,事實上當房間變數設定為null時,就會被從房間內移除。

在伺服端中,可以建立屬於SmartFoxServer 實例本身的房間變數。這像是一個虛擬使用者,而且從來不離開系統,因此可以建立完原不被移除的房間變數。要這樣做你需要傳遞一個null作為變數的擁有者

» 伺服端擴展Server-side Extension

伺服端的擴展可以在房間建立時動態的加入到房間中。這使得開發者能夠將客製化的邏輯附加到房間中並且控制它的使用。通常,這是用於運行遊戲,能夠進階的控制,與過濾訊息等等更多。

擴展的完整討論,請參考下面文章, Server-side Extensions 。

» 調整房間設定

» 權限與事件

當建立房間時,房間的事件與權限可以被調整。下面是可得的事件(Event)。

  • USER_ENTER_EVENT:使用者加入房間時通知的開關。
  • USER_EXIT_EVENT: 使用者離開房間時通知的開關(預設值為true)
  • USER_COUNT_CHANGE_EVENT: 所有訂閱房間群組內的房間內的使用者與觀眾數量改變通知的開關(預設值為true)
  • USER_VARIABLES_UPDATE_EVENT: 使用者變數通知開關(預設值為true)

注意#1
USER_COUNT_CHANGE_EVENT 事件可以在區域階段中,藉由指定更新通知的頻率來更進一步的調整。預設是即時的,一旦發生就會發出。為了要節省頻寬I,你可能想要降地更新到每秒一次或更低。請查看AdminTool中的 Zone Configurator 取得更多關於這點的資訊。
注意#2
USER_ENTER(使用者進入) and USER_EXIT (使用者離開)永遠都應該要配合使用。假如你關掉其中一個,另外一個也應該要關掉,因為他們是相同通知的兩個面。

下面是Permissions變數的列表。

  • ROOM_NAME_CHANGE: 開啟或關閉房間建立者在執行階段改變房間名稱的能力。
  • PASSWORD_STATE_CHANGE: 開啟或關閉房間建立者新增移除與修改房間密碼的能力。
  • PUBLIC_MESSAGES: 開啟或關閉傳送公開訊息的能力。
  • CAPACITY_CHANGE: 開啟或關閉房間建立者在執行階段改變房間大小的能力。有個可能是當縮小房間容量導致 maxUsers < users 數量時,多出來的使用者並不會發生任何事情。一旦客戶離開房間,使用者數量就會降低到新的maxUsers 設定的值。

» 不好詞彙過濾器

假如字詞過濾器在區域階段中被設置,開發者能夠將其套用到房間中交換的公開訊息。

» 玩家ID產生器

最後,為了進階的遊戲邏輯,開發者能夠提供一個二選一的玩家ID產生器(PlayerId Generator)類別,可以在房間中使用客製化的程式碼去處理分發玩家ID 。這個類別必須要實現由SFS2X 伺服端API提供的com.smartfoxserver.v2.util.IPlayerIdGenerator類別。

» 更多的資源

假如你想要學習關於這篇概念介紹的各種方面的更多細節,我們建議這些文章:

 
 

  按個讚!~支持本站!~

FB推薦載入中