2013-02-22 32 views
0

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

回答

0

我相信樓主想通了這一點,但已經爲其他人讀這篇文章,問題是第二個用戶仍然有其room_add事件監聽器。當第三位用戶加入時,會創建一個新房間,並且由於第二位和第三位用戶仍然附加了其room_add事件偵聽器,他們都會加入新房間。

要修復它,可以添加一行以將room_add事件偵聽器移除到room_join事件處理程序,或者僅在room_add事件處理程序中添加一些檢查才能發送房間加入請求,但前提是玩家不在房間中。

+0

這就是爲我工作。無論如何,感謝您出席梅爾。 – 2013-04-24 08:55:07

相關問題