game-multi-test / server /game /gameScene.js
Omnibus's picture
Upload 27 files
c679a93
raw
history blame
2.89 kB
import geckos from '@geckos.io/server'
import { iceServers } from '@geckos.io/server'
import pkg from 'phaser'
const { Scene } = pkg
import { Player } from './components/player.js'
export class GameScene extends Scene {
constructor() {
super({ key: 'GameScene' })
this.playerId = 0
}
init() {
this.io = geckos({
iceServers: process.env.NODE_ENV === 'production' ? iceServers : []
})
this.io.addServer(this.game.server)
}
getId() {
return this.playerId++
}
prepareToSync(player) {
return `${player.playerId},${Math.round(player.x).toString(36)},${Math.round(player.y).toString(36)},${
player.dead === true ? 1 : 0
},`
}
getState() {
let state = ''
this.playersGroup.children.iterate(player => {
state += this.prepareToSync(player)
})
return state
}
create() {
this.playersGroup = this.add.group()
const addDummy = () => {
let x = Phaser.Math.RND.integerInRange(50, 800)
let y = Phaser.Math.RND.integerInRange(100, 400)
let id = Math.random()
let dead = this.playersGroup.getFirstDead()
if (dead) {
dead.revive(id, true)
dead.setPosition(x, y)
} else {
this.playersGroup.add(new Player(this, id, x, y, true))
}
}
this.io.onConnection(channel => {
channel.onDisconnect(() => {
console.log('Disconnect user ' + channel.id)
this.playersGroup.children.each(player => {
if (player.playerId === channel.playerId) {
player.kill()
}
})
channel.room.emit('removePlayer', channel.playerId)
})
channel.on('addDummy', addDummy)
channel.on('getId', () => {
channel.playerId = this.getId()
channel.emit('getId', channel.playerId.toString(36))
})
channel.on('playerMove', data => {
this.playersGroup.children.iterate(player => {
if (player.playerId === channel.playerId) {
player.setMove(data)
}
})
})
channel.on('addPlayer', data => {
let dead = this.playersGroup.getFirstDead()
if (dead) {
dead.revive(channel.playerId, false)
} else {
this.playersGroup.add(new Player(this, channel.playerId, Phaser.Math.RND.integerInRange(100, 700)))
}
})
channel.emit('ready')
})
}
update() {
let updates = ''
this.playersGroup.children.iterate(player => {
let x = Math.abs(player.x - player.prevX) > 0.5
let y = Math.abs(player.y - player.prevY) > 0.5
let dead = player.dead != player.prevDead
if (x || y || dead) {
if (dead || !player.dead) {
updates += this.prepareToSync(player)
}
}
player.postUpdate()
})
if (updates.length > 0) {
this.io.room().emit('updateObjects', [updates])
}
}
}