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()
|
|
|
|
return dot
|
|
|
|
}
|
|
|
|
|
2023-06-15 03:26:45 +00:00
|
|
|
const update_item_sprites = (data, sprites) => {
|
|
|
|
|
|
|
|
for (const sprite of sprites) {
|
|
|
|
if (sprite !== undefined) {
|
|
|
|
sprite.destroy()
|
|
|
|
}
|
|
|
|
}
|
2023-06-15 03:22:26 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
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:22:26 +00:00
|
|
|
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]
|
2023-06-14 01:18:01 +00:00
|
|
|
}
|
|
|
|
|
2023-06-15 03:22:26 +00:00
|
|
|
if (Object.keys(item_sprites).length !== Object.keys(data.map.items).length) {
|
2023-06-15 03:26:45 +00:00
|
|
|
item_sprites = update_item_sprites(data, item_sprites)
|
2023-06-15 03:22:26 +00:00
|
|
|
console.log("updating item sprites")
|
2023-06-14 01:18:01 +00:00
|
|
|
}
|
2023-06-15 03:22:26 +00:00
|
|
|
|
|
|
|
draw_players(data, players, player_sprites)
|
|
|
|
|
2023-06-14 01:18:01 +00:00
|
|
|
}
|
|
|
|
}
|