Compare commits

..

1 commit

Author SHA1 Message Date
71e7e067f2 Add base sprite impl. 2025-05-28 20:30:52 +02:00

View file

@ -1,6 +1,8 @@
#!/usr/bin/env -S deno run -A #!/usr/bin/env -S deno run -A
import { writeAll } from "https://deno.land/std@0.224.0/io/mod.ts" 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" import { mkSimplexNoise, SimplexNoise } from "npm:@spissvinkel/simplex-noise@1.0.1"
async function main() { async function main() {
@ -8,7 +10,7 @@ async function main() {
const fishes = await Fishes.load("./assets/fishes") const fishes = await Fishes.load("./assets/fishes")
for await (const moved of fishes.movements()) { for await (const moved of fishes.movements()) {
console.log(moved.name, "at", moved.position) 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) 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[0] > bounds[1][0]) this.position[0] = bounds[1][0]
if (this.position[1] > bounds[1][1]) this.position[1] = bounds[1][1] if (this.position[1] > bounds[1][1]) this.position[1] = bounds[1][1]
} }
/**
* ```
* _ <name>
* /
* #####
* #####
* #####
* ```
*/
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"
}
} }
/** class Vec2 {
* ``` public constructor(
* _ <name> public x: number,
* / public y: number,
* ##### ) {}
* #####
* ##### static of(ord: number) {
* ``` return new Vec2(ord, ord)
* }
* @param fish Fish to display.
*/ add(rhs: Vec2) {
function display(fish: Fish) { return new Vec2(
const tick_pad = " ".repeat(fish.size[0]) this.x + rhs.x,
// TODO : add position and color this.y + rhs.y,
return [ )
tick_pad + " _ " + fish.name, }
tick_pad + "/",
...fish.shape, sub(rhs: Vec2) {
] return new Vec2(
.map((l, i) => esc_goto([fish.position[0], fish.position[1] + i]) + l) this.x - rhs.x,
.join("") + "\n" 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<T>(arr: T[], random = Math.random) { function pick<T>(arr: T[], random = Math.random) {