我正在使用Phaser&socket.io运行轰炸机多人游戏。
当玩家失去对画布的关注时,我遇到了麻烦:
该玩家无法被其他玩家杀死,因为他没有将注意力集中在选项卡上。当玩家进入onBlur
时,房间将主持人的位置分配给其他人。
我想要的是:
当客户没有集中注意力并且IsHost
时,会议室应在当前玩家列表中担任新的主持人。但是,如果最后一个主机不再是主机,它也应该将播放器的所有数据发送到服务器,以便其他人可以杀死他onBlur
或onResume
。
我只是在寻找一种方法来防止内存泄漏,并使套接字和客户端始终集中在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 );
问题在于,恢复游戏的玩家可以完美恢复,但不能在模糊/其他选项卡上被杀死。