diff options
Diffstat (limited to 'client/src/JumpStorm.ts')
-rw-r--r-- | client/src/JumpStorm.ts | 97 |
1 files changed, 74 insertions, 23 deletions
diff --git a/client/src/JumpStorm.ts b/client/src/JumpStorm.ts index ae99b8e..01cc8d8 100644 --- a/client/src/JumpStorm.ts +++ b/client/src/JumpStorm.ts @@ -1,4 +1,5 @@ import { Game } from "@engine/Game"; +import { Entity } from "@engine/entities"; import { Grid } from "@engine/structures"; import { WallBounds, @@ -7,67 +8,116 @@ import { Physics, Input, Collision, - MessageQueueProvider, - MessagePublisher, NetworkUpdate, } from "@engine/systems"; +import { + type MessageQueueProvider, + type MessagePublisher, + type MessageProcessor, + type Message, + type EntityAddBody, + MessageType, +} from "@engine/network"; +import { stringify, parse } from "@engine/utils"; + +class ClientMessageProcessor implements MessageProcessor { + private game: Game; + + constructor(game: Game) { + this.game = game; + } + + public process(message: Message) { + switch (message.type) { + case MessageType.NEW_ENTITY: + const entityAddBody = message.body as unknown as EntityAddBody; + this.game.addEntity( + Entity.from(entityAddBody.entityName, entityAddBody.args), + ); + break; + } + + console.log(message); + } +} class ClientSocketMessageQueueProvider implements MessageQueueProvider { private socket: WebSocket; - private messages: any[]; + private messages: Message[]; constructor(socket: WebSocket) { this.socket = socket; this.messages = []; this.socket.addEventListener("message", (e) => { - console.log(e); + const message = parse<Message>(e.data); + this.messages.push(message); }); } - getNewMessages() { + public getNewMessages() { return this.messages; } - clearMessages() { + public clearMessages() { this.messages = []; } } class ClientSocketMessagePublisher implements MessagePublisher { private socket: WebSocket; - private messages: any[]; + private messages: Message[]; constructor(socket: WebSocket) { this.socket = socket; this.messages = []; - - this.socket.addEventListener("message", (e) => { - console.log(e); - }); } - addMessage(_message: any) {} + public addMessage(message: Message) { + this.messages.push(message); + } - publish() {} + public publish() { + this.messages.forEach((message: Message) => + this.socket.send(stringify(message)), + ); + } } export class JumpStorm { private game: Game; + private clientId: string; + + constructor(game: Game) { + this.game = game; + } - constructor(ctx: CanvasRenderingContext2D) { - this.game = new Game(); + public async init( + ctx: CanvasRenderingContext2D, + httpMethod: string, + wsMethod: string, + host: string, + ) { + await fetch(`${httpMethod}://${host}/assign`) + .then((resp) => { + if (resp.ok) { + return resp.text(); + } + throw resp; + }) + .then((cookie) => { + this.clientId = cookie; + }); - const socket = new WebSocket("ws://localhost:8080"); - setInterval(() => socket.send(JSON.stringify({ x: 1 })), 1_000); + const grid = new Grid(); + + const socket = new WebSocket(`${wsMethod}://${host}/game`); const clientSocketMessageQueueProvider = new ClientSocketMessageQueueProvider(socket); const clientSocketMessagePublisher = new ClientSocketMessagePublisher( - socket + socket, ); - - const grid = new Grid(); - + const clientMessageProcessor = new ClientMessageProcessor(this.game); [ this.createInputSystem(), new FacingDirection(), @@ -76,7 +126,8 @@ export class JumpStorm { new WallBounds(ctx.canvas.width), new NetworkUpdate( clientSocketMessageQueueProvider, - clientSocketMessagePublisher + clientSocketMessagePublisher, + clientMessageProcessor, ), new Render(ctx), ].forEach((system) => this.game.addSystem(system)); @@ -93,7 +144,7 @@ export class JumpStorm { } private createInputSystem(): Input { - const inputSystem = new Input(); + const inputSystem = new Input(this.clientId); window.addEventListener("keydown", (e) => { if (!e.repeat) { |