diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-17 01:26:50 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-17 01:26:50 +0200 |
commit | b65849bce3fe8ff8d6baebf29728868d4f164827 (patch) | |
tree | 4d0a9b235ba76f4f451a422e64fcfec045d18eea | |
parent | fe164b52e7dd3468e53c8d5d4883b432cce18fbf (diff) | |
download | hurrycurry-b65849bce3fe8ff8d6baebf29728868d4f164827.tar hurrycurry-b65849bce3fe8ff8d6baebf29728868d4f164827.tar.bz2 hurrycurry-b65849bce3fe8ff8d6baebf29728868d4f164827.tar.zst |
player moves with camera on grid
-rw-r--r-- | test-client/main.ts | 44 | ||||
-rw-r--r-- | test-client/util.ts | 6 |
2 files changed, 45 insertions, 5 deletions
diff --git a/test-client/main.ts b/test-client/main.ts index b9fb1557..1780b5d7 100644 --- a/test-client/main.ts +++ b/test-client/main.ts @@ -1,7 +1,7 @@ /// <reference lib="dom" /> import { PacketC, PacketS } from "./protocol.ts"; -import { normalize } from "./util.ts"; +import { V2, ceil_v2, floor_v2, lerp_v2_mut, normalize } from "./util.ts"; let ctx: CanvasRenderingContext2D; let canvas: HTMLCanvasElement; @@ -36,7 +36,10 @@ interface Item { x: number; y: number } const items = new Map<number, Item>() interface Tile { x: number; y: number } const tiles = new Map<string, Tile>() + let my_id: number = -1 +const camera: V2 = { x: 0, y: 0 } +let scale = 0 function send(p: PacketS) { ws.send(JSON.stringify(p)) } function packet(p: PacketC) { @@ -86,8 +89,11 @@ function frame_update(dt: number) { x: (+keys_down.has("KeyD") - +keys_down.has("KeyA")), y: (+keys_down.has("KeyS") - +keys_down.has("KeyW")) }) - p.x += input.x * dt * 10 - p.y += input.y * dt * 10 + + p.x += input.x * dt * 5 + p.y += input.y * dt * 5 + + lerp_v2_mut(camera, p, dt * 10.) } function resize() { @@ -123,24 +129,52 @@ function draw_wait(text: string) { ctx.fillText(text, canvas.width / 2, canvas.height / 2) } + +function map_screen_to_world(screen: V2): V2 { + return { + x: ((screen.x - canvas.width / 2) / scale) + camera.x, + y: ((screen.y - canvas.height / 2) / scale) + camera.y, + } +} + function draw_ingame() { ctx.fillStyle = "#111" ctx.fillRect(0, 0, canvas.width, canvas.height) - const scale = Math.min(canvas.width, canvas.height) / 10; + scale = Math.min(canvas.width, canvas.height) / 10; ctx.save() ctx.translate(canvas.width / 2, canvas.height / 2) ctx.scale(scale, scale) + ctx.translate(-camera.x, -camera.y) + + draw_grid() for (const [_, player] of players) { ctx.save() ctx.translate(player.x, player.y) ctx.rotate(player.rot) ctx.fillStyle = "rgb(226, 176, 26)" - ctx.fillRect(-0.5, -0.5, 1, 1) + const psize = 0.6; + ctx.fillRect(-psize / 2, -psize / 2, psize, psize) ctx.restore() } ctx.restore() } +function draw_grid() { + ctx.strokeStyle = "#333" + ctx.lineWidth = 0.01 + ctx.beginPath() + const min = floor_v2(map_screen_to_world({ x: 0, y: 0 })) + const max = ceil_v2(map_screen_to_world({ x: canvas.width, y: canvas.height })) + for (let x = min.x; x < max.x; x++) { + ctx.moveTo(x, min.y) + ctx.lineTo(x, max.y) + } + for (let y = min.y; y < max.y; y++) { + ctx.moveTo(min.x, y) + ctx.lineTo(max.x, y) + } + ctx.stroke() +}
\ No newline at end of file diff --git a/test-client/util.ts b/test-client/util.ts index 994e6acf..99f0c013 100644 --- a/test-client/util.ts +++ b/test-client/util.ts @@ -2,3 +2,9 @@ export interface V2 { x: number, y: number } export function length(p: V2): number { return Math.sqrt(p.x * p.x + p.y * p.y) } export function normalize_mut(p: V2) { const l = length(p); if (l == 0) return; p.x /= l; p.y /= l } export function normalize(p: V2): V2 { let l = length(p); if (l == 0) l = 1; return { x: p.x / l, y: p.y / l } } +export function lerp_v2_mut(current: V2, target: V2, dt: number) { + current.x = target.x + (current.x - target.x) * Math.exp(-dt) + current.y = target.y + (current.y - target.y) * Math.exp(-dt) +} +export function floor_v2(p: V2): V2 { return { x: Math.floor(p.x), y: Math.floor(p.y) } } +export function ceil_v2(p: V2): V2 { return { x: Math.ceil(p.x), y: Math.ceil(p.y) } } |