tuxman/client/js/gfx/graphics.js
2023-06-14 23:26:45 -04:00

112 lines
2.8 KiB
JavaScript

import { Sprite } from './sprite.js'
import { ItemType, Rotation } from '../logic.js'
const draw_players = (data, players, sprites) => {
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
}
}
}
const update_player_sprites = (data, players, sprites) => {
for (const sprite of sprites) {
if (sprite !== undefined) {
sprite.destroy()
}
}
let new_sprites = Array(players)
new_sprites.fill(undefined)
for (let id of players) {
let sprite = new Sprite("/img/pac.png", data.map)
sprite.layer(3)
sprite.resize(1,1)
sprite.show()
new_sprites[id] = sprite
}
return new_sprites
}
const create_map_dot = (data, x, y) => {
let dot = new Sprite("/img/dot.png", data.map)
dot.move(x, y)
dot.resize(.2,.2)
dot.show()
return dot
}
const update_item_sprites = (data, sprites) => {
for (const sprite of sprites) {
if (sprite !== undefined) {
sprite.destroy()
}
}
let item_sprites = {}
for (let item_key in data.map.items) {
let item = data.map.items[item_key]
switch (item.type) {
case ItemType.DOT:
item_sprites[item_key] = create_map_dot(data, item.pos[0], item.pos[1])
break;
}
}
return item_sprites
}
export const startGraphicsUpdater = () => {
let player_sprites = []
let item_sprites = {}
/**
* @type {(data: import("../logic.js").GameState) => void}
*/
return (data) => {
if (!data.map || !data.map.visible) return
let players = Object.keys(data.players).filter(k => data.players[k] !== undefined)
if (player_sprites.length !== players.length) {
player_sprites = update_player_sprites(data, players, player_sprites)
console.log("updating player sprites")
}
for (let item_key of data.items_eaten) {
if (!(item_sprites[item_key])) continue
item_sprites[item_key].destroy()
delete item_sprites[item_key]
delete data.items_eaten[item_key]
}
if (Object.keys(item_sprites).length !== Object.keys(data.map.items).length) {
item_sprites = update_item_sprites(data, item_sprites)
console.log("updating item sprites")
}
draw_players(data, players, player_sprites)
}
}