diff --git a/game/bot.png b/game/bot.png index d2e3a0cc..3f22a072 100644 Binary files a/game/bot.png and b/game/bot.png differ diff --git a/game/main.ts b/game/main.ts index 652f486f..ae47a1f6 100644 --- a/game/main.ts +++ b/game/main.ts @@ -4,6 +4,9 @@ import { since_start } from "./time"; import { btn, Button } from "./input"; import { new_v2, vadd, vmul, vnorm } from "./vector"; +/// A nice looping frame counter. +let clock = 0; + let bot_sprite: number | undefined = undefined; // Note zelda overworld is 16x8 screens @@ -25,6 +28,8 @@ let robo_vel = new_v2(0); let robo_pos = new_v2(10); export function update() { + clock = (clock + 1) % 20160; + // Acceleration from input let a = new_v2(0); if (btn(Button.Up)) { @@ -40,11 +45,20 @@ export function update() { a.x += 1; } vnorm(a); + a = vmul(a, 0.4); // Speed. // Friction let v = vmul(robo_vel, friction); v = vadd(v, a); + // Zero if we're smaller than some epsilon. + if (Math.abs(v.x) < 0.01) { + v.x = 0; + } + if (Math.abs(v.y) < 0.01) { + v.y = 0; + } + // Motion let np = vadd(robo_pos, v); @@ -54,13 +68,26 @@ export function update() { robo_vel = v; } +// GARBAGE OBVIOUSLY +const robo_info = { + width: 32, + height: 32, + animations: [ + { start: 0, length: 2, speed: 20 }, + { start: 2, length: 8, speed: 8 }, + ], +}; + export function draw() { cls(0.1, 0.2, 0.3); if (bot_sprite != undefined) { // ...it gets resolved here? use_texture(bot_sprite); - spr(robo_pos.x, robo_pos.y, 32, 32, 0, 0, 32, 32); + const moving = robo_vel.x != 0 || robo_vel.y != 0; + const anim = robo_info.animations[moving ? 1 : 0]; + const frame = (anim.start + ((clock / anim.speed) % anim.length)) >> 0; + spr(robo_pos.x, robo_pos.y, 32, 32, frame * robo_info.width, 0, 32, 32); } // print("FRAME TIME:", since_last_frame()); }