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
|
|
|
|
}
|
2023-06-15 21:17:48 +00:00
|
|
|
|
|
|
|
if (data.players[id].moving) {
|
|
|
|
sprites[id].set_img("img/pac.gif")
|
|
|
|
} else {
|
|
|
|
sprites[id].set_img("img/pac.png")
|
|
|
|
}
|
2023-06-15 03:22:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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) {
|
2023-06-15 21:17:48 +00:00
|
|
|
let sprite = new Sprite("img/pac.png", data.map)
|
2023-06-15 03:22:26 +00:00
|
|
|
sprite.layer(3)
|
|
|
|
sprite.resize(1,1)
|
|
|
|
sprite.show()
|
|
|
|
new_sprites[id] = sprite
|
|
|
|
}
|
|
|
|
|
|
|
|
return new_sprites
|
|
|
|
}
|
|
|
|
|
|
|
|
const create_map_dot = (data, x, y) => {
|
2023-06-15 21:17:48 +00:00
|
|
|
let dot = new Sprite("img/dot.png", data.map)
|
2023-06-15 03:22:26 +00:00
|
|
|
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
|
|
|
}
|
|
|
|
}
|