oden/game/main.ts

93 lines
2 KiB
TypeScript

import { cls, print, spr, use_texture } from "./graphics";
import { load_texture } from "./assets";
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
// zelda screen is 16x11 tiles
// from a feeling point of view this is sufficient, apparently :D
export function init() {
print("Hello world!");
// Start this load, but then...
load_texture("./bot.png").then((n) => {
print("Bot loaded at", since_start());
bot_sprite = n;
});
}
const friction = 0.6;
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)) {
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);
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);
// TODO: Collide.
robo_pos = np;
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);
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());
}