»加入并创建房间
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文章以获取更多信息。
翻译自http://docs2x.smartfoxserver.com/DevelopmentBasics/join-and-create-rooms