2017-06-10 25 views
0

シンプルなsocket.ioゲームに「ゲームを残す」機能を実装しようとしていますが、io.emitがゲームを離れるクライアントのソケットだけを通知する理由を理解できません。ここに私のsocket.jsコードです:クライアントでio.emitがすべてのクライアントに送信されない

io.on("connection", sock => { 

    sock.on('joinGame', name => { 
     inc++ 
     if(name === 'guest') name = name + inc.toString() 
     addToGame(inc, name) // adds player to a new Map() 
     io.emit('joinedGame', name) 
    }) 

    sock.on('findPlayersInGame',() => { 
     getAllPlayersInGame(io, threeOrMore) 
    // check to see if the client is notified when a new user joins 
     io.emit('newPlayerJoined', 'new player joined') 
    }) 

    sock.on('leaveGame', name => { 
     io.emit('leftGame', uniquePlayers)  
    }) 

が、私はMobXストアでの私の状態管理と一緒にソケット通信を処理しています。ここに私のGameStore.jsのコードは次のとおりです。私はquitGameアクションをディスパッチすると

export class GameStore { 
constructor(aGame) { 
    extendObservable(this, { 
     players: [], 
     game: aGame, 
     menuVisibility: true, 
     play: action((id, username) => { 
      this.menuVisibility = false 
      username === undefined ? this.game.setName("guest") : this.game.setName(username) 

      // join game with given username 
      sock.emit('joinGame', this.game.playerName) 

      // after joining, if the username is 'guest' change name to unique guest name provided by server 
      sock.on('joinedGame', name => { 
       if(this.game.playerName === 'guest') this.game.setName(name) 
       console.log(this.game.playerName + " joined the game") 
      }) 
      // populate player list with all players in game room 
      this.loadPlayers() 
     }), 
     quitGame: action(() => { 
      //this.menuVisibility = true 
      sock.emit('leaveGame', this.game.playerName) 
      sock.on('leftGame', players => { // this should be logged to all clients 
       console.log('updated player list', players) 
       this.players = players 
      }) 
     }), 
     loadPlayers: action(() => { 
      sock.emit('findPlayersInGame', this.game.playerName) 
      sock.on('loadPlayers', players => { 
       console.log('loading players...') 
       this.players = players 
      }) 
      sock.on('newPlayerJoined', player => { 
       console.log(player) 
      }) 
     }) 
    }) 
    } 
} 

、ソケットは唯一のゲームを残しているクライアントに照射します。誰かがゲームを離れた後、私の店でプレイヤーリストを更新する必要がありますが、他のクライアントが誰かがゲームを離れたというメッセージを受け取っていない理由を理解できません。プレイヤーがゲームに参加したときにio.emitが正常に動作しているようです。

答えて

1

このクライアントがゲームを離れるまでは、leftGameメッセージハンドラを登録しないようです。したがって、ゲームにまだいる他のクライアントのうち、そのメッセージのハンドラを持っていないクライアントはありません。彼らはおそらくメッセージを受信して​​いますが、まだそれのためのハンドラを持っていないので、あなたはそれを見ません。

移動し、このコード:

 sock.on('leftGame', players => { // this should be logged to all clients 
      console.log('updated player list', players) 
      this.players = players 
     }) 

をクライアントが(起動時に可能性が高い)、これらのメッセージの受信を開始したい場合には、イベントハンドラを登録するようにします。

+0

これは完全に機能します。ありがとうございました! –

関連する問題