From c934914ac561e409c1cf1e95260d271fc3d29493 Mon Sep 17 00:00:00 2001 From: John Doty Date: Fri, 7 Jul 2023 06:21:01 -0700 Subject: [PATCH] [game] Walk controls (unbound) --- game/main.ts | 41 +++++++++++++++++++++++++++++++++++++---- game/vector.ts | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/input.ts | 11 +++++++++++ 3 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 game/vector.ts create mode 100644 src/input.ts diff --git a/game/main.ts b/game/main.ts index 767b8f38..ee7162b4 100644 --- a/game/main.ts +++ b/game/main.ts @@ -1,6 +1,8 @@ import { cls, print, spr, use_texture } from "./graphics"; import { load_texture } from "./assets"; -import { since_start, since_last_frame } from "./time"; +import { since_start } from "./time"; +import { btn, Button } from "./input"; +import { new_v2, vadd, vmul, vnorm } from "./vector"; let bot_sprite: number | undefined = undefined; @@ -14,7 +16,39 @@ export function init() { }); } -export function update() {} +const friction = 0.6; +let robo_vel = new_v2(0); +let robo_pos = new_v2(10); + +export function update() { + // Acceleration from input + let a = new_v2(0); + if (btn(Button.Up)) { + a.y -= 1; + } + if (btn(Button.Down)) { + a.y += 1; + } + if (btn(Button.Left)) { + a.x -= 1; + } + if (btn(Button.Right)) { + a.x += 1; + } + vnorm(a); + + // Friction + let v = vmul(robo_vel, friction); + v = vadd(v, a); + + // Motion + let np = vadd(robo_pos, v); + + // TODO: Collide. + + robo_pos = np; + robo_vel = v; +} export function draw() { cls(0.1, 0.2, 0.3); @@ -22,8 +56,7 @@ export function draw() { // ...it gets resolved here? use_texture(bot_sprite); - let y = (since_start() * 10) % 240; - spr(10, y, 32, 32, 0, 0); + spr(robo_pos.x, robo_pos.y, 32, 32, 0, 0); } // print("FRAME TIME:", since_last_frame()); } diff --git a/game/vector.ts b/game/vector.ts new file mode 100644 index 00000000..1e2842b1 --- /dev/null +++ b/game/vector.ts @@ -0,0 +1,49 @@ +export interface Vec2 { + x: number; + y: number; +} + +export function new_v2(x: number, y: number | undefined = undefined): Vec2 { + y = y || x; + return { x, y }; +} + +function vecargs(v: Vec2 | number): Vec2 { + if (typeof v == "number") { + return new_v2(v, v); + } else { + return v; + } +} + +export function vadd(a: Vec2, b: Vec2 | number): Vec2 { + b = vecargs(b); + return { x: a.x + b.x, y: a.y + b.y }; +} + +export function vsub(a: Vec2, b: Vec2 | number): Vec2 { + b = vecargs(b); + return { x: a.x - b.x, y: a.y - b.y }; +} + +export function vmul(a: Vec2, b: Vec2 | number): Vec2 { + b = vecargs(b); + return { x: a.x * b.x, y: a.y * b.y }; +} + +export function vdiv(a: Vec2, b: Vec2 | number): Vec2 { + b = vecargs(b); + return { x: a.x / b.x, y: a.y / b.y }; +} + +export function vlen(a: Vec2): number { + return Math.sqrt(a.x * a.x + a.y * a.y); +} + +export function vnorm(a: Vec2) { + const length = vlen(a); + if (length > 0) { + a.x /= length; + a.y /= length; + } +} diff --git a/src/input.ts b/src/input.ts new file mode 100644 index 00000000..097c4f59 --- /dev/null +++ b/src/input.ts @@ -0,0 +1,11 @@ +export const Button = { + Up: 0, + Down: 1, + Left: 2, + Right: 3, +} as const; +type Button = (typeof Button)[keyof typeof Button]; + +export function btn(_which: Button): boolean { + return false; +}