Commit 0edb1244 authored by Yannick Armand's avatar Yannick Armand

Amélioration du typage de la communication client-serveur

parent 9cf31183
......@@ -98,3 +98,36 @@ valeurs aléatoires identiques entre le client et le serveur.
- **Caisses :** sont comme des murs. Si possible : faire en sorte que les
joueurs puissent pousser les caisses.
## Communication client-serveur
### Envoi de données depuis le client vers le serveur
Le client envoie les évènements suivants :
- Son entrée en jeu ;
- Ses déplacements ;
- Son tir ;
- Son angle (regard) ;
- Sa déconnexion.
On pourrait en imaginer d'autres, comme le changement d'arme par exemple, mais
ce n'est pas prévu pour l'instant. Par la suite, dans l'entrée en jeu, viendra
le choix du pseudonyme et le choix de l'apparence du personnage.
### Envoi de donnés depuis le serveur vers le client
Le serveur est lui un peu plus bavard :
- Données initiales (terrain, blocs, projectiles, joueurs...) ;
- Connexion d'un nouveau joueur ;
- Déconnexion d'un joueur ;
- Diverses collisions (projectiles-joueurs, projectiles-blocs,
projectiles-murs, etc.) ;
- Déplacement d'un joueur ;
- Changement d'angle d'un joueur ;
- Tir d'un joueur ;
- Synchronisation (à détailler, mais le but est de s'assurer que le joueur est
toujours bien synchronisé avec le serveur) ;
- Ping/pong (?) ;
-
......@@ -3,7 +3,7 @@ import Camera from '../common/Camera'
import { PlayerEvent } from '../common/Event'
import BaseGame from '../common/Game'
import Hit from '../common/Hit'
import { firePacketToWeapon, PlayerChangeAnglePacket } from '../common/Packet'
import { firePacketToWeapon, PlayerAnglePacket, PlayerPositionPacket } from '../common/Packet'
import Point from '../common/Point'
import Rect from '../common/Rect'
import Inventory from '../common/ui/Inventory'
......@@ -149,11 +149,11 @@ export default class Game extends BaseGame {
this.removePlayer(player)
})
socket.on('change-pos', (data: any) => {
socket.on(PlayerEvent.ChangePosition, (data: PlayerPositionPacket) => {
const player = this.getPlayer(data.uuid)
player.getTargetPosition().setX(data.targetX)
player.getTargetPosition().setY(data.targetY)
player.getTargetPosition().setX(data.x)
player.getTargetPosition().setY(data.y)
})
socket.on(PlayerEvent.Fire, (data: any) => {
......@@ -164,7 +164,7 @@ export default class Game extends BaseGame {
firePacketToWeapon(data, this)
})
socket.on(PlayerEvent.ChangeAngle, (data: PlayerChangeAnglePacket) => {
socket.on(PlayerEvent.ChangeAngle, (data: PlayerAnglePacket) => {
const player = this.getPlayer(data.uuid)
player.setAngle(data.angle)
......
import { PlayerEvent } from '../common/Event'
import { PlayerPositionPacket } from '../common/Packet'
import BasePlayer from '../common/Player'
import Game from './Game'
......@@ -19,10 +20,10 @@ export default class Player extends BasePlayer {
this.getTargetPosition().getX() !== this.getPosition().getX()
|| this.getTargetPosition().getY() !== this.getPosition().getY()
) {
this.socket.emit('change-pos', {
targetX: this.getTargetPosition().getX(),
targetY: this.getTargetPosition().getY(),
})
this.socket.emit(PlayerEvent.ChangePosition, {
x: this.getTargetPosition().getX(),
y: this.getTargetPosition().getY(),
} as PlayerPositionPacket)
}
}
}
......
......@@ -4,4 +4,5 @@ export const PlayerEvent = {
// Coordinates: 'player:coordinates',
Fire: 'player:fire',
ChangeAngle: 'player:angle',
ChangePosition: 'player:position',
}
import Game from '../common/Game'
import { BlockName } from './block/BlockName'
import Point from './Point'
import Dynamite from './weapon/Dynamite'
import Flamethrower from './weapon/Flamethrower'
import Grenade from './weapon/Grenade'
import Gun from './weapon/Gun'
import Mine from './weapon/Mine'
import { ProjectileName } from './weapon/projectile/ProjectileName'
import RocketLauncher from './weapon/RocketLauncher'
import Shotgun from './weapon/Shotgun'
import SmokeGrenade from './weapon/SmokeGrenade'
......@@ -30,28 +32,52 @@ type NewPlayerPacket = {
// dynamite)
export interface FirePacket {
// Type d'arme utilisé
weapon: WeaponName,
weapon: WeaponName
// Position
x: number,
y: number,
x: number
y: number
// Timestamp au moment de l'envoi du paquet (en ms)
ts: number,
ts: number
// Angle et vitesse (facultatifs), utilisés pour calculer la vélocité s'il
// s'agit d'un projectile en mouvement
angle: number,
speed: number,
angle: number
speed: number
// Graine (facultative), utilisée pour générer des particules identiques chez
// tous les joueurs
seed: number
}
export interface PlayerChangeAnglePacket {
uuid: string,
angle: number,
export interface PlayerAnglePacket {
uuid: string
angle: number
}
export interface PlayerPositionPacket {
uuid: string
x: number
y: number
}
export interface BlockPacket {
block: BlockName
x: number
y: number
ts: number
}
export interface ProjectilePacket {
projectile: ProjectileName
x: number
y: number
ts: number
}
export function firePacketToWeapon(firePacket: FirePacket, game: Game): Weapon {
......
export type BlockName = 'barrel' | 'crate' | 'dynamite' | 'mine'
export type ProjectileName = 'bullet' | 'grenade' | 'rocket' | 'rocket-grenade'
import { v4 as uuidv4 } from 'uuid'
import Mine from '../common/block/Mine'
import { PlayerEvent } from '../common/Event'
import BaseGame from '../common/Game'
import { FirePacket, firePacketToWeapon, PlayerChangeAnglePacket } from '../common/Packet'
import { FirePacket, firePacketToWeapon, PlayerAnglePacket, PlayerPositionPacket } from '../common/Packet'
import Player from '../common/Player'
import Point from '../common/Point'
import WebSocket from './WebSocketServer'
export default class Game extends BaseGame {
......@@ -86,17 +84,17 @@ export default class Game extends BaseGame {
this.addPlayer(clientPlayer)
})
client.on('change-pos', (data: any) => {
client.on(PlayerEvent.ChangePosition, (data: PlayerPositionPacket) => {
const player = this.getPlayer(client.uuid)
player.getTargetPosition().setX(data.targetX)
player.getTargetPosition().setY(data.targetY)
player.getTargetPosition().setX(data.x)
player.getTargetPosition().setY(data.y)
client.broadcast('change-pos', {
client.broadcast(PlayerEvent.ChangePosition, {
uuid: client.uuid,
targetX: player.getTargetPosition().getX(),
targetY: player.getTargetPosition().getY(),
})
x: player.getTargetPosition().getX(),
y: player.getTargetPosition().getY(),
} as PlayerPositionPacket)
})
client.on(PlayerEvent.Fire, (data: FirePacket) => {
......@@ -139,7 +137,7 @@ export default class Game extends BaseGame {
client.broadcast(PlayerEvent.Fire, data)
})
client.on(PlayerEvent.ChangeAngle, (data: PlayerChangeAnglePacket) => {
client.on(PlayerEvent.ChangeAngle, (data: PlayerAnglePacket) => {
client.broadcast(PlayerEvent.ChangeAngle, {
uuid: client.uuid,
angle: data.angle,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment