2017-12-12 10 views
0

Hintergrundsocket.io - überprüfen, wie lange eine Person in einem Zimmer war

So versuche ich ein Warteschlangen-System für mein Spiel zu erstellen. Ich möchte jemanden, der eine Minute gewartet hat, nur gegen eine KI zugewiesen werden. Ich möchte auch, dass Leute, die länger gewartet haben, Vorrang haben, wenn sie Gegner mit ähnlichem Können zusammenbringen. Ich habe mich gefragt, wie ich am besten vorgehen soll. Sollte ich eine setTimeout für die AI-Zuweisung und eine UTC-Zeit einstellen, um zu überprüfen, wie lange sie gewartet haben? Ich frage mich nur, wie ich das Timeout später abbrechen würde, wenn sie übereinstimmen.

Timeout:

socket.on('waiting room', function (id) { 
    console.log("socket has joined the waiting room", id); 
    socket.join("waiting room") 
    setTimeout(function() { 
     socket.leave("waiting room") 
     socket.join("some ai game") 
    }, 60000) 
}) 
+0

Sie können clearTimeout(); die Zeitüberschreitung zu stornieren – Mehari

+0

@Mehari gut, woher weiß ich, welche? Wenn ich es einer Variablen zuweise, wird es für den Sockel sein? –

Antwort

2

Ich nehme an Gameserver-Ressource in Spiel begrenzt ist, dann müssen die Spieler warten. Wenn ein Gameserver verfügbar ist, legen wir den Spieler, der am längsten gewartet hat, um zu spielen. Dann würde die Logik wie etwas darunter aussehen.

const waitinglist = [] 
 

 
//user leave waiting 
 
const leaveWaiting = (socketid) => { 
 
    waitinglist = waitinglist.filter((x) => x.socket.id != socketid) 
 
} 
 

 
io.on('connection', (socket) => { 
 
    socket.on('waiting room', function(id) { 
 
    console.log("socket has joined the waiting room", id); 
 
    socket.join("waiting room") 
 
    waitinglist.push({ 
 
     socket, 
 
     time: new Date(), 
 
    }) 
 
    }) 
 

 

 
    //leave by themselves 
 
    socket.on('disconnect',() => { 
 
    leaveWaiting(socket.id) 
 
    }) 
 
    socket.on('cancle waiting',() => { 
 
    leaveWaiting(socket.id) 
 
    socket.leave("waiting room") 
 
    }) 
 
}) 
 

 
//leave by other logic, like match/ai server available 
 
matchResource.on('available', (resource) => { 
 
    const { 
 
    socket, 
 
    time 
 
    } = waitinglist.shift() 
 
    socket.leave("waiting room") 
 
    start_your_game(socket, resource) 
 
})

ein globales Waitinglist, können Sie es mit einem Modul so etwas wie waiting-manager

ersetzen, wenn der Spieler waiting room eingeben, enqueue ihn

wenn Gameserver verfügbar ist, erhalten einen Spieler aus der Warteschlange oben, und lassen Sie ihn spielen

ob der Spieler das Spiel beendet oder beginnt, ihn aus der Warteschlange zu entfernen

Verwandte Themen