如何防止用户离开当前房间并加入新创建的房间?

时间:2013-02-22 08:02:10

标签: smartfoxserver smartfox

我在使用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!!!");
}

1 个答案:

答案 0 :(得分:0)

我确定原来的海报已经解决了这个问题但是对于其他人来说,问题是第二个用户仍然有它的room_add事件监听器。当第三个用户加入时,会创建一个新房间,因为第二个和第三个用户仍然连接了他们的room_add事件监听器,所以他们都加入了新房间。

要修复此问题,请添加一行以删除room_jod事件处理程序的room_add事件侦听器,或者向room_add事件处理程序添加一些检查,以便仅在播放器尚未进入房间时才发送房间加入请求。