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

问题描述:

我在使用SmartFoxServer 2X时遇到了一个问题,我想要与社区寻求任何帮助/建议。这可能是SFS的默认行为,但我想以另一种方式为我的项目做。这里是场景:如何防止用户离开当前房间并加入新创建的房间?

服务器版本:2.0.0-RC1,我使用AS3进行客户端编码。我没有在服务器端做任何事情,并且在AS3中使用SFS的基本/默认方法。

用户登录特定区域并获取可用房间列表。所有房间必须有最多2个用户。如果没有空间,则用户创建房间(使用settings.maxUsers = 2;)并加入该房间。如果有任何空间,则用户检查room.userCount<2的房间并加入该房间。

如果所有房间都已满,用户将创建一个新房间并加入该房间,以便其他用户可以登录并加入此房间。现在,当第一个用户登录时,会创建一个房间,并且用户等待下一个用户登录并加入该房间。

第二个用户登录并加入由第一个用户创建的房间。现在,当第三个用户登录时,第二个用户加入新创建的房间,同时留在由第一个用户创建的房间中。 (注意:只有第二个用户的行为是这样的;第一个用户停留在同一个房间内;同样当游戏中有4,5和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!!!"); 
} 

我相信楼主想通了这一点,但已经为其他人读这篇文章,问题是第二个用户仍然有其room_add事件监听器。当第三位用户加入时,会创建一个新房间,并且由于第二位和第三位用户仍然附加了其room_add事件侦听器,他们都会加入新房间。

要修复它,可以添加一行以将room_add事件侦听器移除到room_join事件处理程序,或者仅在room_add事件处理程序中添加一些检查才能发送房间加入请求,但前提是玩家不在房间中。

+0

这就是为我工作。无论如何,感谢您出席梅尔。 – 2013-04-24 08:55:07