Added broken interpolation
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { send } from '@/store/socketPlugin'
|
import { send } from '@/store/socketPlugin'
|
||||||
import { render } from '@/game/render.js'
|
import { render } from '@/game/render.js'
|
||||||
|
// import { update } from '@/game/update.js'
|
||||||
import { sound } from '@/game/sound.js'
|
import { sound } from '@/game/sound.js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -32,7 +33,7 @@ export default {
|
|||||||
},
|
},
|
||||||
stats: {
|
stats: {
|
||||||
totalWalls: 0,
|
totalWalls: 0,
|
||||||
lastUpdateTime: 0,
|
lastUpdateTime: {},
|
||||||
lastFrame: 0
|
lastFrame: 0
|
||||||
},
|
},
|
||||||
renderTimer: null
|
renderTimer: null
|
||||||
@@ -60,12 +61,6 @@ export default {
|
|||||||
if (nextUpdate === undefined) return pastUpdate.players
|
if (nextUpdate === undefined) return pastUpdate.players
|
||||||
|
|
||||||
return nextUpdate.players
|
return nextUpdate.players
|
||||||
|
|
||||||
/*
|
|
||||||
const currentTime = Date.now() / 1000
|
|
||||||
const dt = (currentTime - pastUpdate.time) / (nextUpdate.time - pastUpdate.time)
|
|
||||||
return pastUpdate.players.map(player => this.interpolatePlayer(player, nextUpdate.players.find(nextPlayer => player.color === nextPlayer.color), dt))
|
|
||||||
*/
|
|
||||||
},
|
},
|
||||||
isPaused () {
|
isPaused () {
|
||||||
return this.$store.state.game.paused
|
return this.$store.state.game.paused
|
||||||
@@ -91,6 +86,8 @@ export default {
|
|||||||
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height)
|
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height)
|
||||||
render.borders(this.context, this.canvas, this.camera, this.settings)
|
render.borders(this.context, this.canvas, this.camera, this.settings)
|
||||||
|
|
||||||
|
// const players = update.computePlayers(this.$store.state.game.updates, this.$store.state.game.firstUpdateTime, this.$store.state.game.gameStartTime)
|
||||||
|
|
||||||
if (!this.players) return
|
if (!this.players) return
|
||||||
this.stats.totalWalls = 0
|
this.stats.totalWalls = 0
|
||||||
|
|
||||||
@@ -102,7 +99,8 @@ export default {
|
|||||||
|
|
||||||
if (player.state === 'DEAD') this.context.globalAlpha = 0.1
|
if (player.state === 'DEAD') this.context.globalAlpha = 0.1
|
||||||
|
|
||||||
render.wallsBezier(this.context, this.canvas, this.camera, this.settings, player)
|
// render.wallsBezier(this.context, this.canvas, this.camera, this.settings, player)
|
||||||
|
render.walls(this.context, this.canvas, this.camera, this.settings, player)
|
||||||
|
|
||||||
if (player.name === 'e' || player.name === 'q' || player.name === 'r' || player.name === 't') render.playerFace(this.context, this.canvas, this.camera, this.settings, player, player.name)
|
if (player.name === 'e' || player.name === 'q' || player.name === 'r' || player.name === 't') render.playerFace(this.context, this.canvas, this.camera, this.settings, player, player.name)
|
||||||
else render.player(this.context, this.canvas, this.camera, this.settings, player)
|
else render.player(this.context, this.canvas, this.camera, this.settings, player)
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export const render = {
|
|||||||
|
|
||||||
context.moveTo(canvasX1, canvasY1)
|
context.moveTo(canvasX1, canvasY1)
|
||||||
|
|
||||||
for (var i = 1; i < player.walls.length - 1; i++) {
|
for (var i = 1; i < player.walls.length - 1; i += 2) {
|
||||||
canvasX1 = canvas.width / 2 + player.walls[i].x - camera.x
|
canvasX1 = canvas.width / 2 + player.walls[i].x - camera.x
|
||||||
canvasY1 = canvas.height / 2 + player.walls[i].y - camera.y
|
canvasY1 = canvas.height / 2 + player.walls[i].y - camera.y
|
||||||
|
|
||||||
@@ -129,16 +129,5 @@ export const render = {
|
|||||||
context.fillText(player.name + ' - ' + player.score + ' (' + player.bestScore + ')', canvas.width - 50, 15 + i * 10)
|
context.fillText(player.name + ' - ' + player.score + ' (' + player.bestScore + ')', canvas.width - 50, 15 + i * 10)
|
||||||
i++
|
i++
|
||||||
})
|
})
|
||||||
},
|
|
||||||
dead (context, canvas, player) {
|
|
||||||
const canvasX = canvas.width / 2
|
|
||||||
const canvasY = canvas.height / 2
|
|
||||||
|
|
||||||
context.fillStyle = 'white'
|
|
||||||
context.textAlign = 'center'
|
|
||||||
context.fillText('YO DED', canvasX, canvasY - 50)
|
|
||||||
context.fillText('Score: ' + player.score, canvasX, canvasY)
|
|
||||||
context.fillText('Best score so far ' + player.bestScore, canvasX, canvasY + 25)
|
|
||||||
context.fillText('Tap to respawn', canvasX, canvasY + 50)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
36
client/src/game/update.js
Normal file
36
client/src/game/update.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
export const update = {
|
||||||
|
getUpdate (updates, currentServerTime) {
|
||||||
|
for (var i = updates.length - 1; i >= 0; i--) {
|
||||||
|
if (updates[i].time <= currentServerTime) return i
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
},
|
||||||
|
interpolatePlayer (basePlayer, nextPlayer, dt) {
|
||||||
|
var player = basePlayer
|
||||||
|
player.x = basePlayer.x + (nextPlayer.x - basePlayer.x) * dt
|
||||||
|
player.y = basePlayer.y + (nextPlayer.y - basePlayer.y) * dt
|
||||||
|
// very bad
|
||||||
|
player.angle = basePlayer.angle + (nextPlayer.angle - basePlayer.angle) * dt
|
||||||
|
return player
|
||||||
|
},
|
||||||
|
computePlayers (updates, firstUpdateTime, gameStartTime) {
|
||||||
|
console.log(updates)
|
||||||
|
const currentServerTime = firstUpdateTime + (Date.now() - gameStartTime) - 100
|
||||||
|
if (!updates) return []
|
||||||
|
if (updates.length === 0) return []
|
||||||
|
|
||||||
|
const baseUpdateIndex = this.getUpdate(updates, currentServerTime)
|
||||||
|
if (baseUpdateIndex === -1) {
|
||||||
|
return updates[updates.length - 1].players
|
||||||
|
} else if (baseUpdateIndex === updates.length) {
|
||||||
|
console.log('POUET')
|
||||||
|
return updates[updates.length - 1].players
|
||||||
|
} else {
|
||||||
|
const baseUpdate = updates[baseUpdateIndex]
|
||||||
|
const nextUpdate = updates[baseUpdateIndex + 1]
|
||||||
|
const dt = (currentServerTime - baseUpdate.time) / (nextUpdate.time - baseUpdate.time)
|
||||||
|
console.log('INTERPOLATION ' + dt)
|
||||||
|
return baseUpdate.players.map(player => this.interpolatePlayer(player, nextUpdate.players.find(player2 => player.color === player2.color), dt))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,6 +9,8 @@ const state = {
|
|||||||
},
|
},
|
||||||
leaderboard: [],
|
leaderboard: [],
|
||||||
updates: [],
|
updates: [],
|
||||||
|
firstUpdateTime: null,
|
||||||
|
gameStartTime: null,
|
||||||
settings: {
|
settings: {
|
||||||
playerSize: 10,
|
playerSize: 10,
|
||||||
playerSpeed: 2,
|
playerSpeed: 2,
|
||||||
@@ -74,10 +76,14 @@ const mutations = {
|
|||||||
state.socketConnected = connected
|
state.socketConnected = connected
|
||||||
},
|
},
|
||||||
ADD_UPDATE (state, update) {
|
ADD_UPDATE (state, update) {
|
||||||
|
if (state.updates.length === 0) {
|
||||||
|
state.gameStartTime = Date.now()
|
||||||
|
state.firstUpdateTime = update.time
|
||||||
|
}
|
||||||
|
|
||||||
if (state.updates.length > 2) {
|
if (state.updates.length > 2) {
|
||||||
state.updates.shift()
|
state.updates.shift()
|
||||||
}
|
}
|
||||||
update.time = update.time.epochSecond
|
|
||||||
state.updates.push(update)
|
state.updates.push(update)
|
||||||
},
|
},
|
||||||
CLEAR_UPDATE (state) {
|
CLEAR_UPDATE (state) {
|
||||||
@@ -86,6 +92,8 @@ const mutations = {
|
|||||||
SET_LEADERBOARD (state, players) {
|
SET_LEADERBOARD (state, players) {
|
||||||
state.leaderboard = []
|
state.leaderboard = []
|
||||||
|
|
||||||
|
if (!players) return
|
||||||
|
|
||||||
players.forEach(player => {
|
players.forEach(player => {
|
||||||
state.leaderboard.push({
|
state.leaderboard.push({
|
||||||
name: player.name,
|
name: player.name,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ToastProgrammatic as Toast } from 'buefy'
|
import { ToastProgrammatic as Toast } from 'buefy'
|
||||||
|
|
||||||
// const connection = new WebSocket('ws://localhost:8181/socket')
|
const connection = new WebSocket('ws://localhost:8181/socket')
|
||||||
const connection = new WebSocket('wss://tronio.gltronic.ovh/socket')
|
// const connection = new WebSocket('wss://tronio.gltronic.ovh/socket')
|
||||||
|
|
||||||
export default function createSocketPlugin () {
|
export default function createSocketPlugin () {
|
||||||
return store => {
|
return store => {
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ public class GameManager implements IGameManager {
|
|||||||
// Broadcast une fois sur deux
|
// Broadcast une fois sur deux
|
||||||
if (game.isUpdateNeeded()) {
|
if (game.isUpdateNeeded()) {
|
||||||
GameUpdate update = new GameUpdate();
|
GameUpdate update = new GameUpdate();
|
||||||
update.setTime(game.getLastUpdate());
|
update.setTime(game.getLastUpdate().toEpochMilli());
|
||||||
update.setPlayers(game.getPlayers().values());
|
update.setPlayers(game.getPlayers().values());
|
||||||
SocketUtils.broadcast(game, "gameUpdate", new ObjectMapper().writeValueAsString(update));
|
SocketUtils.broadcast(game, "gameUpdate", new ObjectMapper().writeValueAsString(update));
|
||||||
game.setUpdateNeeded(false);
|
game.setUpdateNeeded(false);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package gltronic.tronio.model;
|
package gltronic.tronio.model;
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -13,5 +12,5 @@ import lombok.Setter;
|
|||||||
@Component
|
@Component
|
||||||
public class GameUpdate {
|
public class GameUpdate {
|
||||||
private Collection<Player> players;
|
private Collection<Player> players;
|
||||||
private Instant time;
|
private Long time;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user