tuxman/client/js/gfx/graphics.js

123 lines
2.9 KiB
JavaScript
Raw Normal View History

2023-06-14 01:18:01 +00:00
import { Sprite } from './sprite.js'
2023-06-15 03:22:26 +00:00
import { ItemType, Rotation } from '../logic.js'
2023-06-14 01:18:01 +00:00
2023-06-15 03:22:26 +00:00
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()
2023-06-15 03:56:28 +00:00
dot.type = ItemType.DOT
2023-06-15 03:22:26 +00:00
return dot
}
2023-06-15 03:56:28 +00:00
const draw_sprites = (data, item_sprites) => {
let items = data.map.items
2023-06-15 03:26:45 +00:00
2023-06-15 03:56:28 +00:00
let to_remove = []
// remove rendered but non existing items
for (const item_key in item_sprites) {
let sprite = item_sprites[item_key]
if (!items[item_key]) {
2023-06-15 03:26:45 +00:00
sprite.destroy()
2023-06-15 03:56:28 +00:00
to_remove.push(item_key)
2023-06-15 03:26:45 +00:00
}
2023-06-15 03:56:28 +00:00
2023-06-15 03:26:45 +00:00
}
2023-06-15 03:22:26 +00:00
2023-06-15 03:56:28 +00:00
for (const id of to_remove) {
delete item_sprites[id]
}
// add not rendered sprites
for (const item_key in items) {
/** @type {import('../logic.js').Item} */
let item = items[item_key]
let sprite = item_sprites[item_key]
if (sprite) {
if (item.type === sprite.type)
continue
sprite.destroy()
}
2023-06-15 03:22:26 +00:00
switch (item.type) {
case ItemType.DOT:
2023-06-15 03:56:28 +00:00
sprite = create_map_dot(data, ...item.pos)
2023-06-15 03:22:26 +00:00
break;
}
2023-06-15 03:56:28 +00:00
item_sprites[item_key] = sprite
2023-06-15 03:22:26 +00:00
}
}
2023-06-14 01:18:01 +00:00
export const startGraphicsUpdater = () => {
2023-06-15 03:22:26 +00:00
let player_sprites = []
let item_sprites = {}
2023-06-14 01:18:01 +00:00
/**
* @type {(data: import("../logic.js").GameState) => void}
*/
return (data) => {
2023-06-15 03:22:26 +00:00
if (!data.map || !data.map.visible) return
2023-06-14 01:18:01 +00:00
let players = Object.keys(data.players).filter(k => data.players[k] !== undefined)
2023-06-15 03:22:26 +00:00
if (player_sprites.length !== players.length) {
player_sprites = update_player_sprites(data, players, player_sprites)
console.log("updating player sprites")
}
2023-06-14 01:18:01 +00:00
2023-06-15 03:56:28 +00:00
draw_sprites(data, item_sprites)
2023-06-15 03:22:26 +00:00
draw_players(data, players, player_sprites)
2023-06-14 01:18:01 +00:00
}
}