2017-06-10 5 views
0

Ich versuche, ein "leave game" -Feature in einem einfachen socket.io-Spiel zu implementieren, und ich kann nicht herausfinden, warum io.emit nur den Socket des Clients benachrichtigt das Spiel verlassen. Hier ist mein socket.js Code:io.emit sendet nicht an alle Clients

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)  
    }) 

auf dem Client Ich Umgang mit der Socket-Kommunikation zusammen mit meinem Zustand Management in einem MobX speichern. Hier ist mein GameStore.js Code:

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) 
      }) 
     }) 
    }) 
    } 
} 

Als ich schicken das quitGame Aktion, die Buchse sendet nur an den Client, die das Spiel verlässt. Ich muss die Spielerliste in meinem Laden aktualisieren, nachdem jemand das Spiel verlässt, aber ich kann nicht herausfinden, warum die anderen Klienten die Nachricht nicht erhalten, dass jemand das Spiel verließ. io.emit scheint gut zu funktionieren, wenn ein Spieler einem Spiel beitritt.

Antwort

1

Es sieht so aus, als ob Sie den Nachrichtenhandler leftGame erst registrieren, wenn dieser Client das Spiel verlässt. Somit hat keiner der anderen Clients, die noch im Spiel sind, noch einen Handler für diese Nachricht. Sie erhalten wahrscheinlich die Nachricht, haben aber noch keinen Handler dafür, so dass Sie sie nicht sehen.

Verschieben Sie diesen Code:

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

, so dass er registriert den Event-Handler, wenn der Client diese Nachrichten empfangen (wahrscheinlich beim Start) starten will.

+0

Das funktioniert perfekt. Vielen Dank! –

Verwandte Themen