我在使用SmartFoxServer 2X时遇到了一个问题,我想与他人分享,寻求社区的帮助/建议。它可能是SFS的默认行为,但我想以另一种方式为我的项目做。这是场景:
服务器版本:2.0.0-RC1,我正在使用AS3进行客户端编码。我在服务器端没有做任何事情,在AS3中使用SFS的基本/默认方法。
用户登录特定区域并获取可用房间列表。所有房间最多必须有2个用户。如果没有空间,则用户创建房间(settings.maxUsers = 2;
)并加入该房间。如果有空间,用户会检查room.userCount<2
的房间并加入该房间。
如果所有房间都已满,则用户会创建一个新房间并加入该房间,以便其他用户可以登录并加入此房间。现在,当第一个用户登录时,会创建一个房间,并且用户等待下一个用户登录并加入该房间。
第二个用户登录并加入第一个用户创建的会议室。现在,当第三个用户登录时,第二个用户也加入新创建的房间,同时也留在第一个用户创建的房间中。 (注意:只有第二个用户的行为如下;第一个用户停留在同一个房间。同样,当游戏中有4个,5个和6个用户时,第5个用户以同样的方式与第4个和第6个用户共享作为第二个用户)。
现在有两个房间。第一个房间由第一和第二用户共享,第二个房间由第二和第三用户共享。这可能是SFS处理房间和加入它们的用户的默认方式。但我想让第一个和第二个玩家保持在第一个房间,即使在区域中创建一个新房间,然后为第三个用户创建一个新房间,以便第四个用户可以与第三个用户一起加入房间等等。
感谢您仔细研究。请帮忙。
private function onLogin(event:SFSEvent):void {
SFSVar.removeEventListener(SFSEvent.LOGIN, onLogin);
var count:int = 0;
var roomList:Array = event.currentTarget.roomList;
if(roomList.length==0) {
var my_date:Date = new Date();
var settings:RoomSettings = new RoomSettings("PoolGame"+my_date.fullYear+my_date.month+my_date.date+my_date.hours+my_date.minutes+my_date.seconds);
settings.maxUsers = 2;
settings.groupId = "default";
settings.isGame = true;
SFSVar.send(new CreateRoomRequest(settings, false));
} else if(roomList.length>0) {
for each(var room:Room in roomList) {
count++;
if(room.userCount==2) {
if(count==roomList.length) {
var my_date:Date = new Date();
var settings:RoomSettings = new RoomSettings("PoolGame"+my_date.fullYear+my_date.month+my_date.date+my_date.hours+my_date.minutes+my_date.seconds);
settings.maxUsers = 2;
settings.groupId = "default";
settings.isGame = true;
SFSVar.send(new CreateRoomRequest(settings,false));
break;
}
} else if(room.userCount==1) {
var roomRequest:JoinRoomRequest = new JoinRoomRequest(room.id,null,-1);
SFSVar.send(roomRequest);
break;
}
}
}
}
private function onRoomCreation(event:SFSEvent):void {
SFSVar.removeEventListener(SFSEvent.ROOM_ADD, onRoomCreation);
var room:Room = event.params.room;
var roomRequest:JoinRoomRequest = new JoinRoomRequest(room.id,null,-1);
SFSVar.send(roomRequest);
}
private function onRoomJoin(event:SFSEvent):void {
SFSVar.removeEventListener(SFSEvent.ROOM_JOIN, onRoomJoin);
trace("room joined!!!");
}
答案 0 :(得分:0)
我确定原来的海报已经解决了这个问题但是对于其他人来说,问题是第二个用户仍然有它的room_add事件监听器。当第三个用户加入时,会创建一个新房间,因为第二个和第三个用户仍然连接了他们的room_add事件监听器,所以他们都加入了新房间。
要修复此问题,请添加一行以删除room_jod事件处理程序的room_add事件侦听器,或者向room_add事件处理程序添加一些检查,以便仅在播放器尚未进入房间时才发送房间加入请求。