89 lines
2.8 KiB
TypeScript
89 lines
2.8 KiB
TypeScript
import { Doodler } from "@bearmetal/doodler";
|
|
import { getContext, getContextItem } from "../../lib/context.ts";
|
|
import { InputManager } from "../../lib/input.ts";
|
|
import { TrackSystem } from "../../track/system.ts";
|
|
import { Tender } from "../../train/cars.ts";
|
|
import { RedEngine } from "../../train/engines.ts";
|
|
import { DotFollower } from "../../train/newTrain.ts";
|
|
import { Train } from "../../train/train.ts";
|
|
import { State } from "../machine.ts";
|
|
import { States } from "./index.ts";
|
|
|
|
export class RunningState extends State<States> {
|
|
override name: States = States.RUNNING;
|
|
override validTransitions: Set<States> = new Set([
|
|
States.PAUSED,
|
|
States.EDIT_TRACK,
|
|
]);
|
|
|
|
layers: number[] = [];
|
|
|
|
override update(dt: number): void {
|
|
const ctx = getContext() as { trains: Train[]; track: TrackSystem };
|
|
// const ctx = getContext() as { trains: DotFollower[]; track: TrackSystem };
|
|
// TODO
|
|
// Update trains
|
|
// Update world
|
|
// Handle input
|
|
// Draw (maybe via a layer system that syncs with doodler)
|
|
// Monitor world events
|
|
for (const train of ctx.trains) {
|
|
train.move(dt);
|
|
}
|
|
}
|
|
override start(): void {
|
|
const doodler = getContextItem<Doodler>("doodler");
|
|
this.layers.push(
|
|
doodler.createLayer(() => {
|
|
const track = getContextItem<TrackSystem>("track");
|
|
track.draw();
|
|
}),
|
|
doodler.createLayer(() => {
|
|
const trains = getContextItem<Train[]>("trains");
|
|
for (const train of trains) {
|
|
// if (input.getKeyState("ArrowUp")) {
|
|
// train.acceleration.x += 10;
|
|
// }
|
|
train.draw();
|
|
}
|
|
}),
|
|
);
|
|
|
|
// noop
|
|
const inputManager = getContextItem<InputManager>("inputManager");
|
|
const track = getContextItem<TrackSystem>("track");
|
|
const ctx = getContext() as { trains: Train[] };
|
|
// const ctx = getContext() as { trains: DotFollower[] };
|
|
inputManager.onKey(" ", () => {
|
|
// const path = track.path;
|
|
// const follower = new DotFollower(path, path.points[0].copy());
|
|
// ctx.trains.push(follower);
|
|
const train = new Train(track.path, [new RedEngine(), new Tender()]);
|
|
ctx.trains.push(train);
|
|
});
|
|
// const trainCount = 2000;
|
|
// for (let i = 0; i < trainCount; i++) {
|
|
// const train = new Train(track.path, [new RedEngine(), new Tender()]);
|
|
// ctx.trains.push(train);
|
|
// }
|
|
|
|
inputManager.onKey("ArrowUp", () => {
|
|
const trains = getContextItem<Train[]>("trains");
|
|
for (const train of trains) {
|
|
train.speed += 1;
|
|
}
|
|
});
|
|
inputManager.onKey("ArrowDown", () => {
|
|
const trains = getContextItem<Train[]>("trains");
|
|
for (const train of trains) {
|
|
train.speed -= 1;
|
|
}
|
|
});
|
|
}
|
|
override stop(): void {
|
|
for (const layer of this.layers) {
|
|
getContextItem<Doodler>("doodler").deleteLayer(layer);
|
|
}
|
|
}
|
|
}
|