From 71e7e067f257c452de8a6fb74de0b6752fbafc47 Mon Sep 17 00:00:00 2001 From: JOLIMAITRE Matthieu Date: Wed, 28 May 2025 20:30:52 +0200 Subject: [PATCH] Add base sprite impl. --- src/main.ts | 103 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 81 insertions(+), 22 deletions(-) diff --git a/src/main.ts b/src/main.ts index 739d854..be216d3 100755 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,8 @@ #!/usr/bin/env -S deno run -A import { writeAll } from "https://deno.land/std@0.224.0/io/mod.ts" + +import { Crayon, crayon } from "https://deno.land/x/crayon@3.3.3/mod.ts" import { mkSimplexNoise, SimplexNoise } from "npm:@spissvinkel/simplex-noise@1.0.1" async function main() { @@ -8,7 +10,7 @@ async function main() { const fishes = await Fishes.load("./assets/fishes") for await (const moved of fishes.movements()) { console.log(moved.name, "at", moved.position) - const displayed = esc_clear() + fishes.fishes.map(display).join("") + "\n" + const displayed = esc_clear() + fishes.fishes.map((f) => f.display()).join("") + "\n" connections.send(displayed) } } @@ -91,29 +93,86 @@ class Fish { if (this.position[0] > bounds[1][0]) this.position[0] = bounds[1][0] if (this.position[1] > bounds[1][1]) this.position[1] = bounds[1][1] } + + /** + * ``` + * _ + * / + * ##### + * ##### + * ##### + * ``` + */ + public display() { + const tick_pad = " ".repeat(this.size[0]) + // TODO : add position and color + return [ + tick_pad + " _ " + this.name, + tick_pad + "/", + ...this.shape, + ] + .map((l, i) => esc_goto([this.position[0], this.position[1] + i]) + l) + .join("") + "\n" + } } -/** - * ``` - * _ - * / - * ##### - * ##### - * ##### - * ``` - * - * @param fish Fish to display. - */ -function display(fish: Fish) { - const tick_pad = " ".repeat(fish.size[0]) - // TODO : add position and color - return [ - tick_pad + " _ " + fish.name, - tick_pad + "/", - ...fish.shape, - ] - .map((l, i) => esc_goto([fish.position[0], fish.position[1] + i]) + l) - .join("") + "\n" +class Vec2 { + public constructor( + public x: number, + public y: number, + ) {} + + static of(ord: number) { + return new Vec2(ord, ord) + } + + add(rhs: Vec2) { + return new Vec2( + this.x + rhs.x, + this.y + rhs.y, + ) + } + + sub(rhs: Vec2) { + return new Vec2( + this.x - rhs.x, + this.y - rhs.y, + ) + } + + mul(rhs: Vec2) { + return new Vec2( + this.x * rhs.x, + this.y * rhs.y, + ) + } + + div(rhs: Vec2) { + return new Vec2( + this.x / rhs.x, + this.y / rhs.y, + ) + } + + fac(rhs: number) { + return new Vec2( + this.x * rhs, + this.y * rhs, + ) + } +} + +class Sprite { + public constructor( + public size: Vec2, + public parts: [Vec2, Crayon, string][], + ) {} + + public static from(lines: string[]) { + const size = new Vec2(lines.map((l) => l.length).reduce((a, b) => Math.max(a, b)), lines.length) + const result = new Sprite(size, []) + return result + } } function pick(arr: T[], random = Math.random) {