summaryrefslogtreecommitdiff
path: root/client/js/gfx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--client/js/gfx/graphics.js56
-rw-r--r--client/js/gfx/map.js (renamed from client/js/map.js)60
-rw-r--r--client/js/gfx/sprite.js60
3 files changed, 155 insertions, 21 deletions
diff --git a/client/js/gfx/graphics.js b/client/js/gfx/graphics.js
new file mode 100644
index 0000000..e73927e
--- /dev/null
+++ b/client/js/gfx/graphics.js
@@ -0,0 +1,56 @@
+import { Sprite } from './sprite.js'
+import { Rotation } from '../logic.js'
+
+
+export const startGraphicsUpdater = () => {
+
+ let sprites = []
+
+ /**
+ * @type {(data: import("../logic.js").GameState) => void}
+ */
+ return (data) => {
+
+ if (!data.started) return
+
+ let players = Object.keys(data.players).filter(k => data.players[k] !== undefined)
+
+ if (sprites.length !== players.length) {
+
+ for (const sprite of sprites) {
+ if (sprite !== undefined) {
+ sprite.destroy()
+ }
+ }
+
+ sprites = Array(players)
+ sprites.fill(undefined)
+
+ for (let id of players) {
+ let sprite = new Sprite("/static/tux.png", data.map)
+ sprite.show()
+ sprite.resize(1.5,1.5)
+ sprites[id] = sprite
+ }
+ }
+
+ for (let id of players) {
+ let pos = data.players[id].pos
+ sprites[id].move(pos[0], pos[1])
+ switch (data.players[id].move_rot) {
+ case Rotation.NORTH:
+ sprites[id].rotate(270)
+ break
+ case Rotation.EAST:
+ sprites[id].rotate(0)
+ break
+ case Rotation.SOUTH:
+ sprites[id].rotate(90)
+ break
+ case Rotation.WEST:
+ sprites[id].rotate(180)
+ break
+ }
+ }
+ }
+}
diff --git a/client/js/map.js b/client/js/gfx/map.js
index e293ad2..0ba7f9c 100644
--- a/client/js/map.js
+++ b/client/js/gfx/map.js
@@ -1,18 +1,11 @@
-const create_style = (map) => {
+const gen_style = (map, style) => {
const css = `
* {
--scale: 100;
--aspect: ${map.width/map.height};
--scaleX: calc(var(--scale) * 1vw);
--scaleY: calc(var(--scale) * 1vh);
- }
-
- body {
- background-color: #191919;
- width: 100vw;
- height: 100vh;
- display: flex;
- }
+ }
#container {
width: calc(var(--scaleY) * var(--aspect));
@@ -20,12 +13,15 @@ const create_style = (map) => {
margin-top: calc((100vh - var(--scaleY))/2);
margin-left: calc(50vw - var(--scaleY)*var(--aspect)/2);
position: relative;
+ vertical-align: top;
+ line-height: 0;
}
#container img {
display: inline-block;
width: ${100/map.width}%;
height: ${100/map.height}%;
+ image-rendering: pixelated;
}
@media (max-aspect-ratio: ${map.width}/${map.height}) {
@@ -37,7 +33,7 @@ const create_style = (map) => {
}
}`;
- map.style.innerHTML = css
+ style.innerHTML = css
}
const Direction = {
@@ -211,11 +207,10 @@ const gen_walls = (width, height, data) => {
return walls
}
-const gen_map = (map) => {
- let walls = gen_walls(map.width, map.height, map.data)
+const gen_map = (map, container) => {
for (let y = 0; y < map.height; y++) {
for (let x = 0; x < map.width; x++) {
- place_tile(map.container, walls[y * map.width + x])
+ place_tile(container, map.walls[y * map.width + x])
}
}
@@ -224,20 +219,43 @@ const gen_map = (map) => {
export class Map {
constructor(width, height, data) {
+
+ let last = document.getElementById("container")
+ if (last) last.remove()
+
this.width = width
this.height = height
this.data = data
- this.container = document.body.appendChild(document.createElement("div"))
- this.container.id = "container"
- this.style = document.body.appendChild(document.createElement("style"))
+ this.walls = gen_walls(width, height, data)
- create_style(this)
- gen_map(this)
}
- destroy() {
- this.container.remove()
- this.style.remove()
+ show() {
+ this.hide()
+
+ let container = document.getElementById("container")
+ if (!container) {
+ container = document.createElement("div")
+ container.id = "container"
+ document.body.appendChild(container)
+ }
+
+ gen_map(this, container)
+
+ let style = document.getElementById("style")
+ if (!style) {
+ style = document.createElement("style")
+ style.id = "style"
+ document.body.appendChild(style)
+ }
+
+ gen_style(this, style)
}
+ hide() {
+ let container = document.getElementById("container")
+ if (container) container.remove()
+ let style = document.getElementById("style")
+ if (style) style.remove()
+ }
}
diff --git a/client/js/gfx/sprite.js b/client/js/gfx/sprite.js
new file mode 100644
index 0000000..1ed8136
--- /dev/null
+++ b/client/js/gfx/sprite.js
@@ -0,0 +1,60 @@
+export class Sprite {
+
+ constructor(image_src, map) {
+ this.element = document.createElement("img")
+ this.element.src = image_src
+ this.element.className = "sprite"
+ document.getElementById("container").appendChild(this.element)
+
+ this.map = map
+ this.x = 0
+ this.y = 0
+ this.w = 1
+ this.h = 1
+ this.d = 0
+ this.hide()
+ }
+
+ #update_pos() {
+ let width = 100 / this.map.width * this.w
+ let height = 100 / this.map.height * this.h
+ let left = 100 / this.map.width * (this.x + (1 - this.w) / 2)
+ let top = 100 / this.map.height * (this.y + (1 - this.h) / 2)
+
+ this.element.style.width = `${width}%`
+ this.element.style.height = `${height}%`
+ this.element.style.left = `${left}%`
+ this.element.style.top = `${top}%`
+ this.element.style.transform = `rotate(${this.d}deg)`
+ }
+
+ move(x, y) {
+ this.x = x
+ this.y = y
+ this.#update_pos()
+ }
+
+ resize(w, h) {
+ this.w = w
+ this.h = h
+ this.#update_pos()
+ }
+
+ rotate(d) {
+ this.d = d
+ this.#update_pos()
+ }
+
+ hide() {
+ this.element.style.display = "none"
+ }
+
+ show() {
+ this.element.style.display = "initial"
+ }
+
+ destroy() {
+ this.element.remove()
+ }
+
+}