diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-17 04:13:19 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-17 04:13:19 +0200 |
commit | 3f23989c2829a4a99349d4670511d71c0f4af8e1 (patch) | |
tree | 23c2a6e34a570f219be6164999875fb1fbecd716 /test-client | |
parent | eabe0cff44921ea43f31340e12f20159ba5c381e (diff) | |
download | hurrycurry-3f23989c2829a4a99349d4670511d71c0f4af8e1.tar hurrycurry-3f23989c2829a4a99349d4670511d71c0f4af8e1.tar.bz2 hurrycurry-3f23989c2829a4a99349d4670511d71c0f4af8e1.tar.zst |
test client player rotates well
Diffstat (limited to 'test-client')
-rw-r--r-- | test-client/main.ts | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/test-client/main.ts b/test-client/main.ts index 009b1705..f31176cd 100644 --- a/test-client/main.ts +++ b/test-client/main.ts @@ -1,8 +1,8 @@ /// <reference lib="dom" /> -import { ID, Item, PacketC, PacketS, Tile, Vec2 } from "./protocol.ts"; +import { ID, Item, PacketC, PacketS, Tile } from "./protocol.ts"; import { FALLBACK_TILE, TILES } from "./tiles.ts"; -import { V2, add_v2, ceil_v2, floor_v2, lerp_exp_v2_mut, normalize } from "./util.ts"; +import { V2, add_v2, ceil_v2, floor_v2, length, lerp_exp_v2_mut, normalize } from "./util.ts"; let ctx: CanvasRenderingContext2D; let canvas: HTMLCanvasElement; @@ -32,7 +32,7 @@ document.addEventListener("DOMContentLoaded", () => { setInterval(tick_update, 1000 / 25); }) -interface PlayerData { x: number; y: number, name: string, rot: number, hand?: ID } +interface PlayerData { x: number; y: number, name: string, rot: number, hand?: ID, facing: V2 } const players = new Map<number, PlayerData>() interface ItemData { kind: Item, tile?: V2, player?: ID, tracking_player: boolean, x: number, y: number } const items = new Map<number, ItemData>() @@ -41,6 +41,7 @@ const tiles = new Map<string, TileData>() let my_id: number = -1 const camera: V2 = { x: 0, y: 0 } +const interact_target_anim: V2 = { x: 0, y: 0 } let scale = 0 function send(p: PacketS) { ws.send(JSON.stringify(p)) } @@ -50,7 +51,7 @@ function packet(p: PacketC) { my_id = p.joined.id } else if ("add_player" in p) { if (p.add_player.hand) items.set(p.add_player.hand[0], { kind: p.add_player.hand[1], player: p.add_player.id, tracking_player: true, x: 0, y: 0 }) - players.set(p.add_player.id, { x: 0, y: 0, name: p.add_player.name, rot: 0, hand: p.add_player.hand?.[0] }) + players.set(p.add_player.id, { x: 0, y: 0, name: p.add_player.name, rot: 0, hand: p.add_player.hand?.[0], facing: { x: 0, y: 1 } }) } else if ("remove_player" in p) { players.delete(p.remove_player.id) } else if ("position" in p) { @@ -88,17 +89,18 @@ function keyboard(ev: KeyboardEvent, down: boolean) { else keys_down.delete(ev.code) } -function get_interact_target(): Vec2 | undefined { +function get_interact_target(): V2 | undefined { const me = players.get(my_id) if (!me) return - return [ - Math.floor(me.x + Math.sin(me.rot)), - Math.floor(me.y + Math.cos(me.rot)) - ] + return { + x: Math.floor(me.x + Math.sin(me.rot)), + y: Math.floor(me.y + Math.cos(me.rot)) + } } function interact() { - send({ interact: { pos: get_interact_target()! } }) + const { x, y } = get_interact_target()!; + send({ interact: { pos: [x, y] } }) } function tick_update() { @@ -116,6 +118,8 @@ function frame_update(dt: number) { y: (+keys_down.has("KeyS") - +keys_down.has("KeyW")) }) + if (length(input) > 0.1) lerp_exp_v2_mut(p.facing, input, dt * 10.) + p.rot = Math.atan2(p.facing.x, p.facing.y) p.x += input.x * dt * 5 p.y += input.y * dt * 5 @@ -123,9 +127,11 @@ function frame_update(dt: number) { lerp_exp_v2_mut(i, i.tracking_player ? players.get(i.player!)! : add_v2(i.tile!, 0.5), dt * 10.) } + lerp_exp_v2_mut(interact_target_anim, get_interact_target() ?? { x: 0, y: 0 }, dt * 15.) lerp_exp_v2_mut(camera, p, dt * 10.) } + function resize() { canvas.width = globalThis.innerWidth canvas.height = globalThis.innerHeight @@ -192,7 +198,7 @@ function draw_ingame() { for (const [_, player] of players) { ctx.save() ctx.translate(player.x, player.y) - ctx.rotate(player.rot) + ctx.rotate(-player.rot) ctx.fillStyle = "rgb(226, 176, 26)" const psize = 0.6; ctx.fillRect(-psize / 2, -psize / 2, psize, psize) @@ -214,9 +220,8 @@ function draw_ingame() { } function draw_interact_target() { - const [x, y] = get_interact_target() ?? [0, 0] ctx.save() - ctx.translate(x, y) + ctx.translate(interact_target_anim.x, interact_target_anim.y) ctx.lineCap = "round" ctx.lineJoin = "round" |