Я запускаю многопользовательскую игру Bomberman с phaser & socket.io.
У меня возникают проблемы, когда игрок теряет фокус на холсте:
Игрок не может быть убит другимиигроки, потому что он не сосредоточен на вкладке.Когда игрок идет onBlur
, комната передает позицию хозяина кому-то другому.
То, что я хочу:
Когда клиент не сфокусирован и IsHost
комната должна принять нового хоста в списке текущих игроков.Но если последний хост больше не хост, он также должен отправить все данные игрока на сервер, чтобы другие люди могли его убить onBlur
или onResume
.
I 'Я просто ищу способ предотвратить утечки памяти и сфокусировать сокет + клиент onBlur
.Таким образом, игроки хоста + не хоста могут умереть, если не сфокусироваться на вкладке.
Game.js
this.game.onPause.add(function(){
SOCKET.emit('player unavailable');
if(IS_HOST) this.stopBeingHost();
IS_FOCUSED = false;
}, this);
this.game.onResume.add(function(){
SOCKET.emit('player available');
IS_FOCUSED = true;
}, this);
// Game pause
window.onblur = (function (_this) {
return function () {
SOCKET.emit('player unavailable');
if(IS_HOST) _this.stopBeingHost();
IS_FOCUSED = false;
if(_this.key_timer) {
_this.game.time.events.remove(_this.key_timer);
_this.key_timer = false;
}
update: function() {
if(!this.is_game_started) return;
SocketEventHandler.js
// when current client lost game focus
this.onPlayerUnavailable = function(){
console.log("Player "+this.id+" unavailable");
this.player.is_active = true;
if( this.room.isHost( this.player ) ){
this.room.rc_timestamp = Date.now();
this.room.selectNewHost( io );
}
};
// when current client gained game focus
this.onPlayerAvailable = function(){
console.log("Player "+this.id+" available");
this.player.is_active = true;
if( !this.room.hasHost() )
this.room.selectNewHost( io );
Проблема в том, что игроки, которые возобновляют игру, могут отлично возобновить игру, но их нельзя убить на других / других вкладках.