開發基礎:擴展API

» 擴展API

在這篇文章中我們將看一下再擴展API中最有用的幾個元素,以及如何利用伺服端框架和隨附的 javadoc

» BaseSFSExtension vs SFSExtension

我們提供了兩個類別作為主要擴展類別的基礎類型: BaseSFSExtension與SFSExtension,兩個類別都可以在com.smartfoxserver.v2.extensions 套件中找到。前面的類別主要是為了SmartFoxServer PRO 1.x的相容性而提供。建議使用SFSExtension以獲得最好的SFS2X。

在這篇文章中我們假設你的主要擴展類別是繼承SFSExtension (要取得兩者差異的細節,請在深入的文章參考Server-side Extensions )。

» 區域階層/ 房間階層

伺服端擴展可以插入到區域中(我們稱它為Zone-level Extension)以管理整個應用程式,或是插入到一個單一的房間(稱之為Room-level Extension)以管理特定的房間。

兩個方法的差異僅僅只是範圍上的不同。一個區域階層的擴展( Zone-level Extension)可以監聽在區域中的任何事件,並且控制所有它所管理的房間與使用者。另一方面,一個房間階層的擴展(Room-level Extension) 只能監聽房間內的事件,並且管理在其內的使用者。

一個典型的房間階層擴展的使用是管理在房間中執行的遊戲邏輯。

» 使用伺服端API

SFS2X框架主要是由三個不同元素組成。

  • API classes: 這個類別提供了有組織的方法以存取許多伺服端的功能,像是建立房間,設定房間/使用者變數,處理遊戲挑戰,匹配玩家等等。
  • Services: 處理特定的伺服器元素。例如房間管理器(RoomManager)在區域中建立的房間的存取,可以用來完成搜尋,過濾等等。
  • Data classes: 這是在框架中數量最多的類別,他們提供SmartFoxServer 抽象化的資料(像是使用者, 房間, 好友, 邀請, 事件, 等等)。

我們並不會詳細的去介紹每一個類別,只是會簡短的討論他們。

» API Classes

最簡單取得API的方法是在你的擴展中使用getApi方法。該方法提供了伺服端核心API的參考。要學習核心API的所有方法可以查看SFSApi class javadoc
下面是一個的快速範例,示範如何建立房間。

void makeRoom() throws SFSCreateRoomException
{
    CreateRoomSettings settings = new CreateRoomSettings();
    settings.setName("The music Room");
    settings.setMaxUsers(20);
     
    getApi().createRoom(getParentZone(), settings, null);
}

SFS2X也為好友列表以及遊戲匹配功能提供了專門的API。接下來這一段內容我們將解釋如何能存取這些API。

» The SmartFoxServer class

下一個框架中的重要的元素是SmartFoxServer class,此類別提供了存取能力,可以存取許多在系統中執行的服務。雖然使用服務是一個相當進階的主題,我們依然可以使用這個物件來存取這些專門的API。

就像下面程式碼片段顯示的範例,你可以存取 Game API 與Buddy List API

void getMoreApi(User owner) throws SFSCreateRoomException
{
    ISFSGameApi gameApi = SmartFoxServer.getInstance().getAPIManager().getGameApi();
    ISFSBuddyApi buddyApi = SmartFoxServer.getInstance().getAPIManager().getBuddyApi();
     
    CreateSFSGameSettings settings = new CreateSFSGameSettings();
    settings.setName("PongRoom");
    settings.setMaxUsers(2);
    settings.setMaxSpectators(8);
     
    // ...more game settings here...
     
    gameApi.createGame(getParentZone(), settings, owner);
}

» Data classes

在框架中有幾十個不同的資料類別為API的不同元素提供了抽象化:Zone(s), Room(s), User(s), 等等。他們主要出現在com.smartfoxserver.v2.entities.* 套件中。

一個伺服端開發的重要觀點是,資料類別應該總是用來讀取屬性,但很少會寫入它們。譬如說,直接改變區域或是房間的值,只會造成區域性的改變,而不會有任何更新傳送到客戶端。

換句話說,這些類別揭露了許多getters(取得)與setters(設定)方法,但是,對於擴展而言,只有getters是真正有意義的。若是要改變其內容則需要透API來完成。API提供了一個機制,可以維護所有客戶端進行在伺服端所發生的改變的更新。

一個練習的範例是為客戶端設定使用者變數。假如你參考了javadoc,你會注意到使用者物件揭露了一個setVariable方法,或許你會想使用這個方法,這沒有什麼錯,但這樣的改變只在伺服端有效,並不會更新到客戶端中(而此客戶端需要維持正確的同步)。

正確的方法應該是使用API中的setUserVariables方法,這方法能自動的通知所有需要更新的客戶端,甚至是在需要時發出一個伺服端事件。

» 更多的資源

現在你已經學習了基本的擴展開發,是時候來一些有趣的東西了,寫出你自己的擴展並且在框架中試驗。

還有,我們強烈參考下面的資源來學習更多:

上一篇:開發基礎:第一個擴展

下一篇:開發基礎:註冊輔助

 
 

  按個讚!~支持本站!~

FB推薦載入中