diff options
Diffstat (limited to 'test-client/main.ts')
| -rw-r--r-- | test-client/main.ts | 51 | 
1 files changed, 49 insertions, 2 deletions
| diff --git a/test-client/main.ts b/test-client/main.ts index d093c62e..b9fb1557 100644 --- a/test-client/main.ts +++ b/test-client/main.ts @@ -1,10 +1,11 @@  /// <reference lib="dom" />  import { PacketC, PacketS } from "./protocol.ts"; +import { normalize } from "./util.ts";  let ctx: CanvasRenderingContext2D;  let canvas: HTMLCanvasElement; -let ws: WebSocket +let ws: WebSocket;  document.addEventListener("DOMContentLoaded", () => {      ws = new WebSocket(`${window.location.protocol.endsWith("s:") ? "wss" : "ws"}://${window.location.hostname}:27032/`)      ws.onerror = console.error @@ -23,6 +24,10 @@ document.addEventListener("DOMContentLoaded", () => {      resize()      globalThis.addEventListener("resize", resize)      draw() + +    document.addEventListener("keydown", ev => keyboard(ev, true)) +    document.addEventListener("keyup", ev => keyboard(ev, false)) +    setInterval(tick_update, 1000 / 25);  })  interface Player { x: number; y: number, name: string, rot: number } @@ -31,10 +36,11 @@ 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 = undefined +let my_id: number = -1  function send(p: PacketS) { ws.send(JSON.stringify(p)) }  function packet(p: PacketC) { +    console.log(p);      if ("joined" in p) {          my_id = p.joined.id      } else if ("add_player" in p) { @@ -55,13 +61,45 @@ function packet(p: PacketC) {      } else console.warn("unknown packet", p);  } +const keys_down = new Set(); +const HANDLED_KEYS = ["KeyW", "KeyA", "KeyS", "KeyD", "Space"] +function keyboard(ev: KeyboardEvent, down: boolean) { +    if (HANDLED_KEYS.includes(ev.code)) ev.preventDefault() +    if (ev.code == "Space") interact() +    if (down) keys_down.add(ev.code) +    else keys_down.delete(ev.code) +} + +function interact() { + +} + +function tick_update() { +    const p = players.get(my_id) +    if (!p) return +} +function frame_update(dt: number) { +    const p = players.get(my_id) +    if (!p) return + +    const input = normalize({ +        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 +}  function resize() {      canvas.width = globalThis.innerWidth      canvas.height = globalThis.innerHeight  } +let last_frame = Date.now()  function draw() { +    const now = Date.now() +    frame_update((now - last_frame) / 1000) +    last_frame = now;      if (ws.readyState == ws.CONNECTING) draw_wait("Connecting...")      else if (ws.readyState == ws.CLOSING) draw_wait("Closing...")      else if (ws.readyState == ws.CLOSED) draw_wait("Disconnected") @@ -79,6 +117,8 @@ function draw_wait(text: string) {      ctx.lineWidth = 10      ctx.textAlign = "center"      ctx.textBaseline = "middle" +    ctx.lineJoin = "round" +    ctx.lineCap = "round"      ctx.strokeText(text, canvas.width / 2, canvas.height / 2)      ctx.fillText(text, canvas.width / 2, canvas.height / 2)  } @@ -87,6 +127,11 @@ function draw_ingame() {      ctx.fillStyle = "#111"      ctx.fillRect(0, 0, canvas.width, canvas.height) +    const scale = Math.min(canvas.width, canvas.height) / 10; +    ctx.save() +    ctx.translate(canvas.width / 2, canvas.height / 2) +    ctx.scale(scale, scale) +      for (const [_, player] of players) {          ctx.save()          ctx.translate(player.x, player.y) @@ -95,5 +140,7 @@ function draw_ingame() {          ctx.fillRect(-0.5, -0.5, 1, 1)          ctx.restore()      } + +    ctx.restore()  } | 
