0

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

1 回答 1

0

我敢肯定原始海报已经弄清楚了这一点,但对于阅读本文的其他人来说,问题是第二个用户仍然有它的 room_add 事件侦听器。当第 3 个用户加入时,会创建一个新房间,并且因为第 2 个和第 3 个用户仍然附加了他们的 room_add 事件侦听器,所以他们都加入了新房间。

要修复它,要么添加一行以将 room_add 事件侦听器删除到 room_join 事件处理程序,或者添加一些检查到 room_add 事件处理程序以仅在玩家尚未在房间中时发送房间加入请求。

于 2013-04-07T01:36:15.923 回答