From 529d308b8b99ddf626799b00312dfa612c16b6cb Mon Sep 17 00:00:00 2001 From: cha0s Date: Mon, 30 Sep 2019 22:28:33 -0500 Subject: [PATCH] fix: tile updates --- packages/topdown/layer.js | 12 ++ .../topdown/packets/tile-update.packet.js | 16 --- .../topdown/packets/tiles-update.packet.js | 28 +++++ packages/topdown/tiles.js | 105 ++++-------------- 4 files changed, 59 insertions(+), 102 deletions(-) delete mode 100644 packages/topdown/packets/tile-update.packet.js create mode 100644 packages/topdown/packets/tiles-update.packet.js diff --git a/packages/topdown/layer.js b/packages/topdown/layer.js index 8885731..5453316 100644 --- a/packages/topdown/layer.js +++ b/packages/topdown/layer.js @@ -14,6 +14,10 @@ import {ShapeList} from '@avocado/physics'; import { LayerUpdateTilesetUriPacket, } from './packets/layer-update-tileset-uri.packet'; +import { + TilesUpdatePacket, +} from './packets/tiles-update.packet'; + import {Tiles} from './tiles'; import {Tileset} from './tileset'; @@ -68,6 +72,9 @@ export class Layer extends decorate(class {}) { if (packet instanceof SynchronizedDestroyPacket) { this.entityList.acceptPacket(packet); } + if (packet instanceof TilesUpdatePacket) { + this.tiles.acceptPacket(packet); + } } addEntity(entity) { @@ -119,6 +126,7 @@ export class Layer extends decorate(class {}) { cleanPackets() { this._tilesetUriChanged = false; this.entityList.cleanPackets(); + this.tiles.cleanPackets(); } destroy() { @@ -225,6 +233,10 @@ export class Layer extends decorate(class {}) { for (let i = 0; i < entityListPackets.length; i++) { packets.push(entityListPackets[i]); } + const tilesPackets = this.tiles.packets(informed); + for (let i = 0; i < tilesPackets.length; i++) { + packets.push(tilesPackets[i]); + } return packets; } diff --git a/packages/topdown/packets/tile-update.packet.js b/packages/topdown/packets/tile-update.packet.js deleted file mode 100644 index 34ba304..0000000 --- a/packages/topdown/packets/tile-update.packet.js +++ /dev/null @@ -1,16 +0,0 @@ -import {Packet} from '@avocado/net'; - -export class TileUpdatePacket extends Packet { - - static get schema() { - return { - ...super.schema, - data: { - ...super.schema.data, - position: 'uint32', - tile: 'uint16', - }, - }; - } - -} diff --git a/packages/topdown/packets/tiles-update.packet.js b/packages/topdown/packets/tiles-update.packet.js new file mode 100644 index 0000000..6e3be05 --- /dev/null +++ b/packages/topdown/packets/tiles-update.packet.js @@ -0,0 +1,28 @@ +import {Vector} from '@avocado/math'; +import {Packet} from '@avocado/net'; + +export class TilesUpdatePacket extends Packet { + + static pack(packet) { + const data = packet.data[1]; + data.position = Vector.packToUint32(data.position); + return super.pack(packet); + } + + static get schema() { + return { + ...super.schema, + data: { + position: 'uint32', + tile: 'uint16', + }, + }; + } + + static unpack(packet) { + const data = super.unpack(packet); + data.position = Vector.unpackFromUint32(data.position); + return data; + } + +} diff --git a/packages/topdown/tiles.js b/packages/topdown/tiles.js index d89948e..7981386 100644 --- a/packages/topdown/tiles.js +++ b/packages/topdown/tiles.js @@ -3,7 +3,7 @@ import * as I from 'immutable'; import {compose, EventEmitter} from '@avocado/core'; import {Rectangle, Vector} from '@avocado/math'; -import {TileUpdatePacket} from './packets/tile-update.packet'; +import {TilesUpdatePacket} from './packets/tiles-update.packet'; const CHUNK_AXIS = 10; @@ -18,51 +18,22 @@ export class Tiles extends decorate(class {}) { constructor(json) { super(); - // this.chunks = []; this.data = []; + this._packets = []; if ('undefined' !== typeof json) { this.fromJSON(json); } } acceptPacket(packet) { - // if (packet instanceof TileUpdatePacket) { - // const unpackedPosition = [ - // packet.data.position & 0xFFFF, - // packet.data.position >> 16, - // ]; - // this.setTileAt(unpackedPosition, packet.data.tile); - // } + if (packet instanceof TilesUpdatePacket) { + this.setTileAt(packet.data.position, packet.data.tile); + } } - // chunkIndexAtPosition(position) { - // const chunkCount = Vector.ceil(Vector.scale(this.size, 1 / CHUNK_AXIS)); - // const chunkPosition = Vector.floor(Vector.scale(position, 1 / CHUNK_AXIS)); - // const chunkIndex = chunkPosition[1] * chunkCount[0] + chunkPosition[0]; - // return chunkIndex; - // } - - // static createChunkFromData(position, size, data) { - // const chunk = Array(CHUNK_AXIS * CHUNK_AXIS).fill(0); - // let chunkIndex = 0; - // const chunkPosition = Vector.scale(position, CHUNK_AXIS); - // let dataIndex = size[0] * chunkPosition[1] + chunkPosition[0]; - // for (let y = 0; y < CHUNK_AXIS; ++y) { - // for (let x = 0; x < CHUNK_AXIS; ++x) { - // if (chunkPosition[0] < size[0] && chunkPosition[1] < size[1]) { - // chunk[chunkIndex] = data[dataIndex]; - // } - // chunkIndex += 1; - // chunkPosition[0] += 1; - // dataIndex += 1; - // } - // chunkPosition[0] -= CHUNK_AXIS; - // chunkPosition[1] += 1; - // dataIndex -= CHUNK_AXIS; - // dataIndex += size[0]; - // } - // return chunk; - // } + cleanPackets() { + this._packets = []; + } // forEachTile(fn) { // let [x, y] = [0, 0]; @@ -83,22 +54,6 @@ export class Tiles extends decorate(class {}) { if (json.size) { super.size = json.size; } - // this.chunks = []; - // const chunkCount = Vector.ceil(Vector.scale(this.size, 1 / CHUNK_AXIS)); - // if (json.data && json.data.length > 0) { - // for (let y = 0; y < chunkCount[1]; ++y) { - // for (let x = 0; x < chunkCount[0]; ++x) { - // this.chunks.push(Tiles.createChunkFromData( - // [x, y], - // this.size, - // json.data - // )); - // } - // } - // } - // if (json.chunks && json.chunks.length > 0) { - - // } if (json.data && json.data.length > 0) { this.data = json.data.slice(0); } @@ -109,15 +64,13 @@ export class Tiles extends decorate(class {}) { return this; } - // indexAt(position) { - // return this.width * position[1] + position[0]; - // } + indexAt(position) { + return this.width * position[1] + position[0]; + } - // packetsForUpdate() { - // const packetsForUpdate = this.updatePackets; - // this.updatePackets = []; - // return packetsForUpdate; - // } + packets(informed) { + return this._packets; + } get rectangle() { return Rectangle.compose([0, 0], this.size); @@ -128,38 +81,18 @@ export class Tiles extends decorate(class {}) { if (oldTile === tile) { return; } - const index = position[1] * this.width + position[0]; + const index = this.indexAt(position); if (index < 0 || index >= this.data.length) { return; } this.data[index] = tile; - const packedPosition = position[1] << 16 | position[0]; - // this.updatePackets.push(new TileUpdatePacket({ - // position: packedPosition, - // tile, - // })); + this._packets.push(new TilesUpdatePacket({ + position, + tile, + })); this.emit('dataChanged'); } - get size() { - return super.size; - } - - set size(size) { - super.size = size; - // const newChunks = []; - // const chunkCount = Vector.ceil(Vector.div(size, [CHUNK_AXIS, CHUNK_AXIS])); - // const chunkLinearCount = Vector.area(chunkCount); - // for (let i = 0; i < chunkLinearCount; ++i) { - // newChunks. - // } - // for (let y = 0; y < chunkCount[1]; y++) { - // for (let x = 0; x < chunkCount[0]; x++) { - // newChunks[y][x] - // } - // } - } - slice(rectangle) { const tilesRectangle = this.rectangle; // Get intersection.