From aa5afc08dbe30a737efe764d43caf958733daefa Mon Sep 17 00:00:00 2001 From: Veradictus Date: Sun, 3 Sep 2023 23:14:02 -0600 Subject: [PATCH] refactor(client): grid initialization --- packages/client/src/map/map.ts | 57 ++++++++++--------- packages/client/src/map/mapworker.ts | 33 ----------- packages/client/src/{renderer => map}/tile.ts | 0 packages/client/src/renderer/canvas.ts | 3 +- packages/client/src/renderer/webgl/layer.ts | 2 +- 5 files changed, 33 insertions(+), 62 deletions(-) delete mode 100644 packages/client/src/map/mapworker.ts rename packages/client/src/{renderer => map}/tile.ts (100%) diff --git a/packages/client/src/map/map.ts b/packages/client/src/map/map.ts index 4e55720ecb..b2dbef4fb0 100644 --- a/packages/client/src/map/map.ts +++ b/packages/client/src/map/map.ts @@ -55,7 +55,21 @@ export default class Map { private readyCallback?(): void; public constructor(private game: Game) { - this.load(); + log.debug('Parsing map with Web Workers...'); + + // Store tile size globally into the utils. + Utils.tileSize = this.tileSize; + Utils.sideLength = this.width / Modules.Constants.MAP_DIVISION_SIZE; + Utils.thirdTile = this.tileSize / 3; + Utils.tileAndAQuarter = this.tileSize * 1.25; + + // Load the empty grid data without webworkers if we're on iOS. + this.loadGrid(); + + this.loadTilesets(); + this.loadRegionData(); + + this.ready(); } /** @@ -69,38 +83,27 @@ export default class Map { } /** - * Uses webworkers to create an empty data and collision - * grid based on the map's dimensions. This can be quite - * time consuming so we relay it to an external worker - * to speed up the task. + * Initializes the collision and map data grid. The data grid is used + * for rendering tiles, and the collision grid for determining which + * tile is a collision. */ - private load(): void { - log.debug('Parsing map with Web Workers...'); - - // Store tile size globally into the utils. - Utils.tileSize = this.tileSize; - Utils.sideLength = this.width / Modules.Constants.MAP_DIVISION_SIZE; - Utils.thirdTile = this.tileSize / 3; - Utils.tileAndAQuarter = this.tileSize * 1.25; - - let worker = new Worker(new URL('mapworker.ts', import.meta.url), { type: 'classic' }); + private loadGrid(): void { + let time = Date.now(); - // Send the map's width and height to the webworker. - worker.postMessage([this.width, this.height]); + for (let y = 0; y < this.height; y++) { + this.grid[y] = []; - worker.addEventListener('message', (event) => { - if (event.data.data) this.data = event.data.data; - if (event.data.grid) this.grid = event.data.grid; - - this.loadRegionData(); - - this.mapLoaded = true; - }); + // Initialize collision grid. + for (let x = 0; x < this.width; x++) { + this.data.push(0); + this.grid[y][x] = 1; + } + } - this.loadTilesets(); + log.debug(`Loaded empty grid in ${Date.now() - time}ms.`); - this.ready(); + this.mapLoaded = true; } /** diff --git a/packages/client/src/map/mapworker.ts b/packages/client/src/map/mapworker.ts deleted file mode 100644 index d7331de35a..0000000000 --- a/packages/client/src/map/mapworker.ts +++ /dev/null @@ -1,33 +0,0 @@ -/// - -/** - * WebWorker just works in the background to create - * an empty data grid and collision grid. - */ - -let width = 0, - height = 0, - data: number[] = [], - grid: number[][] = []; - -onmessage = (event) => { - [width, height] = event.data; - - loadGrids(); - - postMessage({ - data, - grid - }); -}; - -function loadGrids() { - for (let y = 0; y < height; y++) { - grid[y] = []; - - for (let x = 0; x < width; x++) { - data.push(0); - grid[y][x] = 1; - } - } -} diff --git a/packages/client/src/renderer/tile.ts b/packages/client/src/map/tile.ts similarity index 100% rename from packages/client/src/renderer/tile.ts rename to packages/client/src/map/tile.ts diff --git a/packages/client/src/renderer/canvas.ts b/packages/client/src/renderer/canvas.ts index ebab11004e..8f492787da 100644 --- a/packages/client/src/renderer/canvas.ts +++ b/packages/client/src/renderer/canvas.ts @@ -1,5 +1,6 @@ import Renderer from './renderer'; -import Tile from './tile'; + +import Tile from '../map/tile'; import type Game from '../game'; import type { ContextCallback } from './renderer'; diff --git a/packages/client/src/renderer/webgl/layer.ts b/packages/client/src/renderer/webgl/layer.ts index 0823893bdc..1c108785e4 100644 --- a/packages/client/src/renderer/webgl/layer.ts +++ b/packages/client/src/renderer/webgl/layer.ts @@ -1,4 +1,4 @@ -import Tile from '../tile'; +import Tile from '../../map/tile'; import type WebGL from './webgl'; import type Map from '../../map/map';