0

SmartFoxServer 2X を使用しているときに問題に直面したので、コミュニティからの助けやアドバイスを求めて共有したいと思います。これは SFS のデフォルトの動作かもしれませんが、私のプロジェクトでは別の方法で実行したいと考えています。シナリオは次のとおりです。

サーバーのバージョン: 2.0.0-RC1 で、クライアント側のコーディングに AS3 を使用しています。私はサーバー側で何もしておらず、AS3 で SFS の基本/デフォルトの方法を使用しています。

ユーザーは特定のゾーンにログインし、利用可能な部屋のリストを取得します。すべての部屋には最大 2 人のユーザーが必要です。ルームがない場合、ユーザーはルームを作成し ( を使用settings.maxUsers = 2;)、そのルームに参加します。ルームがある場合、ユーザーはルームをチェックし、room.userCount<2そのルームに参加します。

すべての部屋が満室の場合、ユーザーは新しい部屋を作成してその部屋に参加し、別のユーザーがログインしてこの部屋に参加できるようにします。これで、最初のユーザーがログインするとルームが作成され、ユーザーは次のユーザーがログインしてそのルームに参加するのを待ちます。

2 番目のユーザーがログインし、最初のユーザーが作成したルームに参加します。これで、3 番目のユーザーがログインすると、2 番目のユーザーは、最初のユーザーが作成したルームに滞在しながら、新しく作成されたルームに参加します。(注: 2 番目のユーザーのみがこのように動作します。最初のユーザーは同じ部屋にとどまります。同様に、ゲームに 4、5、および 6 人のユーザーがいる場合、5 番目のユーザーは同じ方法で 4 番目および 6 番目のユーザーと部屋を共有します。 2 番目のユーザーが行うように)。

現在2部屋あります。1 番目の部屋は 1 番目と 2 番目のユーザーによって共有され、2 番目の部屋は 2 番目と 3 番目のユーザーによって共有されます。これは、ルームとそこに参加するユーザーを処理する SFS のデフォルトの方法かもしれません。しかし、ゾーンに新しい部屋を作成しても、最初と2番目のプレーヤーを最初の部屋に保持し、3番目のユーザー用に新しい部屋を作成して、4番目のユーザーが3番目のユーザーと一緒に部屋に参加できるようにしたいすぐ。

ご覧いただきありがとうございます。助けてください。


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

元の投稿者はすでにこれを理解していたと思いますが、これを読んでいる他の人にとって問題は、2 番目のユーザーがまだ room_add イベント リスナーを持っていることです。3 番目のユーザーが参加すると、新しいルームが作成されます。2 番目と 3 番目のユーザーはまだ room_add イベント リスナーがアタッチされているため、両方とも新しいルームに参加します。

これを修正するには、room_add イベント リスナーを削除する行を room_join イベント ハンドラーに追加するか、room_add イベント ハンドラーにチェックを追加して、プレイヤーがまだルームにいない場合にのみルーム参加リクエストを送信します。

于 2013-04-07T01:36:15.923 に答える