base2020/src/Ecs/test.ts

175 lines
5.3 KiB
TypeScript

import { Bind, Game } from "../Applet/Init";
import { KeyControl } from "../Applet/Keyboard";
import { Loop } from "../Applet/Loop";
import { Layer, DrawSet } from "../Applet/Render";
import { Data, Location, Polygon, RenderBounds, CollisionClass } from "./Components";
import { FindCollisions } from "./Collision";
import { Component, Join, Liveness, Remove, Create, Lookup } from "./Data";
import { DumbMotion } from "./Location";
import { RunRenderBounds } from "./Renderers";
interface Apple extends Component {}
interface Banana extends Component {
peeled: boolean
}
interface Carrot extends Component {
cronch: number
}
class TestData extends Data {
entity = [
{generation: 5, alive: Liveness.ALIVE},
{generation: 5, alive: Liveness.DEAD},
{generation: 5, alive: Liveness.ALIVE},
{generation: 5, alive: Liveness.ALIVE},
{generation: 5, alive: Liveness.INACTIVE},
{generation: 5, alive: Liveness.ALIVE},
];
apple: Apple[] = [
{generation: 5},
{generation: 5},
{generation: -1},
{generation: -1},
{generation: 5},
{generation: 5},
];
banana: Record<number, Banana> = {
3: {generation: 5, peeled: false},
4: {generation: 5, peeled: true},
};
carrot: Record<number, Carrot> = {
0: {generation: 5, cronch: 1},
1: {generation: 5, cronch: 1},
2: {generation: 4, cronch: 10},
3: {generation: 5, cronch: 1},
};
}
@Bind("#EcsJoinTest")
export class EcsJoinTest {
constructor(pre: HTMLElement) {
const data = new TestData();
pre.innerText = JSON.stringify({
"apples": Join(data, "apple"),
"bananas": Join(data, "banana"),
"carrots": Join(data, "carrot"),
"apples+carrots": Join(data, "apple", "carrot"),
}, null, 2);
}
}
@Bind("#EcsLookupTest")
export class EcsLookupTest {
constructor(pre: HTMLElement) {
const data = new TestData();
const applesMaybeCarrots = Join(data, "apple").map(([id, apple]) => ({
apple,
maybeCarrot: Lookup(data, id, "carrot")[0]
}));
pre.innerText = JSON.stringify(applesMaybeCarrots, null, 2);
}
}
@Bind("#EcsRemoveTest")
export class EcsRemoveTest {
constructor(pre: HTMLElement) {
const data = new TestData();
const beforeDelete = Join(data, "apple", "carrot");
Remove(data, [0, 5]);
const afterDelete = Join(data, "apple", "carrot");
pre.innerText = JSON.stringify({
beforeDelete,
afterDelete
}, null, 2);
}
}
@Bind("#EcsCreateTest")
export class EcsCreateTest {
constructor(pre: HTMLElement) {
const data = new TestData();
const beforeCreate = Join(data, "apple", "banana", "carrot");
const createdId = Create(data, {
apple: {},
banana: {peeled: false},
carrot: {cronch: 11}
});
const afterCreate = Join(data, "apple", "banana", "carrot");
pre.innerText = JSON.stringify({
beforeCreate,
afterCreate,
createdId
}, null, 2);
}
}
@Game("#RenderTest")
export class LoopTest {
data = new Data();
constructor(public canvas: HTMLCanvasElement, cx: CanvasRenderingContext2D, keys: KeyControl) {
const layer = new Layer(0);
const drawSet = new DrawSet();
const spinnerId = Create(this.data, {
location: new Location({
X: 200,
Y: 200,
VAngle: Math.PI
}),
bounds: new Polygon([-50, 50, -60, 250, 60, 250, 50, 50]),
collisionTargetClass: new CollisionClass("block"),
renderBounds: new RenderBounds(
"#0a0",
layer
)
});
const triangleId = Create(this.data, {
location: new Location({
X: 200,
Y: 200,
VAngle: -Math.PI/10
}),
bounds: new Polygon([70, 0, 55, 40, 85, 40]),
collisionSourceClass: new CollisionClass("tri"),
renderBounds: new RenderBounds(
"#d40",
layer
)
});
const loop = new Loop(30,
interval => {
DumbMotion(this.data, interval);
const [triangleDebug] = Lookup(this.data, triangleId, "renderBounds");
(triangleDebug as RenderBounds).color = "#d40";
FindCollisions(this.data, 500, (className, sourceId, targetId) => {
switch(className) {
case "tri>block":
const [debug] = Lookup(this.data, sourceId, "renderBounds");
if(debug) debug.color = "#0ff";
break;
}
});
},
dt => {
cx.fillStyle = "#848";
cx.fillRect(0, 0, canvas.width, canvas.height);
RunRenderBounds(this.data, drawSet);
drawSet.draw(cx, dt);
}
);
loop.start();
keys.setHandler({
press: key => {
if(key == "a") loop.start();
else if(key == "b") loop.stop();
}
});
}
}