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.
Das funktioniert perfekt. Vielen Dank! –