diff options
Diffstat (limited to 'test-client')
-rw-r--r-- | test-client/main.ts | 11 | ||||
-rw-r--r-- | test-client/visual.ts | 79 |
2 files changed, 54 insertions, 36 deletions
diff --git a/test-client/main.ts b/test-client/main.ts index 1e6168ed..60a483d8 100644 --- a/test-client/main.ts +++ b/test-client/main.ts @@ -55,7 +55,7 @@ export interface PlayerData { character: number, anim_position: V2, vel: V2, - message?: Message, + message?: MessageData, } export interface TileData { x: number @@ -63,6 +63,11 @@ export interface TileData { kind: TileIndex item?: ItemData } +export interface MessageData { + inner: Message + anim_position: V2, + anim_size: number, +} export const players = new Map<PlayerID, PlayerData>() export const tiles = new Map<string, TileData>() @@ -151,7 +156,8 @@ function packet(p: PacketC) { break; case "communicate": { const player = players.get(p.player)! - player.message = p.message + if (p.message) player.message = { inner: p.message, anim_size: 0., anim_position: player.anim_position } + else player.message = undefined break; } default: @@ -213,6 +219,7 @@ function frame_update(dt: number) { if (pid == my_id) player.anim_position.x = player.x, player.anim_position.y = player.y else lerp_exp_v2_mut(player.anim_position, player, dt * 15) if (player.item !== undefined && player.item !== null) update_item(player.item) + if (player.message) player.message.anim_size = lerp_exp(player.message.anim_size, 1, dt * 3) } for (const [_, tile] of tiles) { if (tile.item !== undefined && tile.item !== null) update_item(tile.item) diff --git a/test-client/visual.ts b/test-client/visual.ts index cd32b77b..a70b6387 100644 --- a/test-client/visual.ts +++ b/test-client/visual.ts @@ -1,6 +1,5 @@ -import { ItemData, camera, canvas, ctx, data, get_interact_target, interact_possible_anim, interact_target_anim, items_removed, keys_down, players, tiles } from "./main.ts"; +import { ItemData, MessageData, PlayerData, TileData, camera, canvas, ctx, data, get_interact_target, interact_possible_anim, interact_target_anim, items_removed, keys_down, players, tiles } from "./main.ts"; import { PLAYER_SIZE } from "./movement.ts"; -import { Message } from "./protocol.ts"; import { FALLBACK_TILE, ITEMS, TILES, FALLBACK_ITEM } from "./tiles.ts"; import { V2, ceil_v2, floor_v2 } from "./util.ts"; @@ -29,6 +28,7 @@ export function draw_ingame() { ctx.fillRect(0, 0, canvas.width, canvas.height) scale = Math.min(canvas.width, canvas.height) * camera_zoom; + ctx.save() ctx.translate(canvas.width / 2, canvas.height / 2) ctx.scale(scale, scale) @@ -36,39 +36,28 @@ export function draw_ingame() { draw_grid() + // Draw tiles for (const [_, tile] of tiles) { - ctx.save() - ctx.translate(tile.x + 0.5, tile.y + 0.5) - const comps = TILES[data.tile_names[tile.kind]] ?? FALLBACK_TILE - for (const c of comps) { - c(ctx) - } - ctx.restore() + draw_tile(tile) } - for (const [_, player] of players) { - { - ctx.save() - ctx.translate(player.anim_position.x, player.anim_position.y) - { - ctx.save() - ctx.rotate(-player.rot) - draw_character(player.character) - ctx.restore() - } - if (player.message) draw_message(player.message) - ctx.restore() - } - if (player.item) draw_item(player.item) - } + // Draw players + for (const [_, player] of players) + draw_player(player) - for (const item of items_removed) { + // Draw removed items + for (const item of items_removed) draw_item(item) - } - for (const [_, tile] of tiles) { + + // Draw items on tiles + for (const [_, tile] of tiles) if (tile.item) draw_item(tile.item) - } + // Draw player messages + for (const [_, player] of players) + if (player.message) draw_message(player.message) + + // Draw interact target draw_interact_target() ctx.restore() @@ -83,6 +72,16 @@ export function draw_ingame() { } else { camera_zoom = 0.1 } } +function draw_tile(tile: TileData) { + ctx.save() + ctx.translate(tile.x + 0.5, tile.y + 0.5) + const comps = TILES[data.tile_names[tile.kind]] ?? FALLBACK_TILE + for (const c of comps) { + c(ctx) + } + ctx.restore() +} + function draw_item(item: ItemData) { ctx.save() ctx.translate(item.x, item.y) @@ -98,6 +97,15 @@ function draw_item(item: ItemData) { ctx.restore() } +function draw_player(player: PlayerData) { + ctx.save() + ctx.translate(player.anim_position.x, player.anim_position.y) + ctx.rotate(-player.rot) + draw_character(player.character) + ctx.restore() + if (player.item) draw_item(player.item) +} + function draw_interact_target() { ctx.save() ctx.translate(interact_target_anim.x, interact_target_anim.y) @@ -149,19 +157,22 @@ function draw_character(character: number) { ctx.fill() } -function draw_message(m: Message) { +function draw_message(m: MessageData) { ctx.save() - ctx.translate(0, -1) - if ("item" in m) { + ctx.translate(m.anim_position.x, m.anim_position.y) + ctx.scale(m.anim_size, m.anim_size) + if ("item" in m.inner) { ctx.fillStyle = "#fffa" ctx.beginPath() - ctx.moveTo(0, 0.7) - ctx.arc(0, 0, 0.5, Math.PI / 4, Math.PI - Math.PI / 4, true) + ctx.moveTo(0, -0.3) + ctx.arc(0, -1, 0.5, Math.PI / 4, Math.PI - Math.PI / 4, true) ctx.closePath() ctx.fill() - const comps = ITEMS[data.item_names[m.item]] ?? FALLBACK_ITEM + ctx.translate(0, -1) + const comps = ITEMS[data.item_names[m.inner.item]] ?? FALLBACK_ITEM for (const c of comps) c(ctx) + ctx.translate(0, 1) } ctx.restore() } |