Initial commit
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
export abstract class Component {
|
||||
__component = true;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
import type { Component } from "./component.ts";
|
||||
|
||||
// deno-lint-ignore no-explicit-any
|
||||
type ComponentConstructor<T extends Component> = new (...args: any[]) => T;
|
||||
|
||||
export class Entity {
|
||||
id: string;
|
||||
// deno-lint-ignore no-explicit-any
|
||||
components = new Map<ComponentConstructor<any>, Component>();
|
||||
active = true;
|
||||
|
||||
constructor(id: string = crypto.randomUUID()) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
add<T extends Component>(component: T): T {
|
||||
this.components.set(component.constructor as ComponentConstructor<T>, component);
|
||||
return component;
|
||||
}
|
||||
|
||||
get<T extends Component>(type: ComponentConstructor<T>): T | undefined {
|
||||
return this.components.get(type) as T;
|
||||
}
|
||||
|
||||
get_all(): Iterable<Component> {
|
||||
return this.components.values();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export * from "./component.ts";
|
||||
export * from "./entity.ts";
|
||||
export * from "./system.ts";
|
||||
export * from "./world.ts";
|
||||
@@ -0,0 +1,5 @@
|
||||
import type { World } from "./world.ts";
|
||||
|
||||
export abstract class System {
|
||||
abstract update(world: World, delta: number): void;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import type { Entity } from "./entity.ts";
|
||||
import type { System } from "./system.ts";
|
||||
|
||||
export class World {
|
||||
entities = new Set<Entity>();
|
||||
systems = new Set<System>();
|
||||
tags = new Map<string, Entity[]>();
|
||||
|
||||
add_entity(entity: Entity) {
|
||||
this.entities.add(entity);
|
||||
}
|
||||
|
||||
add_system(system: System) {
|
||||
this.systems.add(system);
|
||||
}
|
||||
|
||||
add_tag(tag: string, entities: Entity[]) {
|
||||
this.tags.set(tag, entities);
|
||||
}
|
||||
|
||||
get_tag(tag: string) {
|
||||
return this.tags.get(tag);
|
||||
}
|
||||
|
||||
update(delta: number) {
|
||||
for (const system of this.systems) {
|
||||
system.update(this, delta);
|
||||
}
|
||||
}
|
||||
|
||||
get_entities() {
|
||||
return this.entities;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user