summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore169
-rw-r--r--client/lib/systems/WallBounds.ts35
-rw-r--r--client/package-lock.json8
-rw-r--r--client/package.json3
-rw-r--r--client/src/JumpStorm.ts (renamed from client/lib/JumpStorm.ts)6
-rw-r--r--client/src/components/GameCanvas.svelte9
-rw-r--r--client/src/components/LeaderBoard.svelte2
-rw-r--r--client/src/components/LeaderBoardCard.svelte2
-rw-r--r--client/tsconfig.json3
-rw-r--r--client/vite.config.ts12
-rw-r--r--engine/Game.ts (renamed from client/lib/Game.ts)20
-rw-r--r--engine/components/BoundingBox.ts (renamed from client/lib/components/BoundingBox.ts)0
-rw-r--r--engine/components/Collide.ts (renamed from client/lib/components/Collide.ts)0
-rw-r--r--engine/components/Component.ts (renamed from client/lib/components/Component.ts)0
-rw-r--r--engine/components/Control.ts (renamed from client/lib/components/Control.ts)0
-rw-r--r--engine/components/FacingDirection.ts (renamed from client/lib/components/FacingDirection.ts)0
-rw-r--r--engine/components/Forces.ts (renamed from client/lib/components/Forces.ts)0
-rw-r--r--engine/components/Gravity.ts (renamed from client/lib/components/Gravity.ts)0
-rw-r--r--engine/components/Jump.ts (renamed from client/lib/components/Jump.ts)0
-rw-r--r--engine/components/Mass.ts (renamed from client/lib/components/Mass.ts)0
-rw-r--r--engine/components/Moment.ts (renamed from client/lib/components/Moment.ts)0
-rw-r--r--engine/components/Sprite.ts (renamed from client/lib/components/Sprite.ts)0
-rw-r--r--engine/components/TopCollidable.ts (renamed from client/lib/components/TopCollidable.ts)0
-rw-r--r--engine/components/Velocity.ts (renamed from client/lib/components/Velocity.ts)0
-rw-r--r--engine/components/WallBounded.ts (renamed from client/lib/components/WallBounded.ts)0
-rw-r--r--engine/components/index.ts (renamed from client/lib/components/index.ts)0
-rw-r--r--engine/components/names.ts (renamed from client/lib/components/names.ts)0
-rw-r--r--engine/config/assets.ts (renamed from client/lib/config/assets.ts)0
-rw-r--r--engine/config/constants.ts (renamed from client/lib/config/constants.ts)0
-rw-r--r--engine/config/index.ts (renamed from client/lib/config/index.ts)0
-rw-r--r--engine/config/sprites.ts (renamed from client/lib/config/sprites.ts)0
-rw-r--r--engine/entities/Entity.ts (renamed from client/lib/entities/Entity.ts)0
-rw-r--r--engine/entities/Floor.ts (renamed from client/lib/entities/Floor.ts)0
-rw-r--r--engine/entities/Player.ts (renamed from client/lib/entities/Player.ts)0
-rw-r--r--engine/entities/index.ts (renamed from client/lib/entities/index.ts)0
-rw-r--r--engine/interfaces/Action.ts (renamed from client/lib/interfaces/Action.ts)0
-rw-r--r--engine/interfaces/Direction.ts (renamed from client/lib/interfaces/Direction.ts)0
-rw-r--r--engine/interfaces/Draw.ts (renamed from client/lib/interfaces/Draw.ts)0
-rw-r--r--engine/interfaces/LeaderBoardEntry.ts (renamed from client/lib/interfaces/LeaderBoardEntry.ts)0
-rw-r--r--engine/interfaces/Vec2.ts (renamed from client/lib/interfaces/Vec2.ts)0
-rw-r--r--engine/interfaces/index.ts (renamed from client/lib/interfaces/index.ts)0
-rw-r--r--engine/structures/QuadTree.ts (renamed from client/lib/structures/QuadTree.ts)0
-rw-r--r--engine/structures/index.ts (renamed from client/lib/structures/index.ts)0
-rw-r--r--engine/systems/Collision.ts (renamed from client/lib/systems/Collision.ts)27
-rw-r--r--engine/systems/FacingDirection.ts (renamed from client/lib/systems/FacingDirection.ts)11
-rw-r--r--engine/systems/Input.ts (renamed from client/lib/systems/Input.ts)15
-rw-r--r--engine/systems/Physics.ts (renamed from client/lib/systems/Physics.ts)15
-rw-r--r--engine/systems/Render.ts (renamed from client/lib/systems/Render.ts)28
-rw-r--r--engine/systems/System.ts (renamed from client/lib/systems/System.ts)7
-rw-r--r--engine/systems/WallBounds.ts36
-rw-r--r--engine/systems/index.ts (renamed from client/lib/systems/index.ts)0
-rw-r--r--engine/systems/names.ts (renamed from client/lib/systems/names.ts)0
-rw-r--r--engine/utils/clamp.ts2
-rw-r--r--engine/utils/dotProduct.ts (renamed from client/lib/utils/dotProduct.ts)0
-rw-r--r--engine/utils/index.ts (renamed from client/lib/utils/index.ts)1
-rw-r--r--engine/utils/normalizeVector.ts (renamed from client/lib/utils/normalizeVector.ts)0
-rw-r--r--engine/utils/rotateVector.ts (renamed from client/lib/utils/rotateVector.ts)0
-rw-r--r--server/README.md15
-rwxr-xr-xserver/bun.lockbbin0 -> 1650 bytes
-rw-r--r--server/index.ts0
-rw-r--r--server/package.json13
-rw-r--r--server/src/index.ts3
-rw-r--r--server/tsconfig.json21
63 files changed, 357 insertions, 106 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f81d56e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,169 @@
+# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore
+
+# Logs
+
+logs
+_.log
+npm-debug.log_
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+.pnpm-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+
+report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
+
+# Runtime data
+
+pids
+_.pid
+_.seed
+\*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+
+lib-cov
+
+# Coverage directory used by tools like istanbul
+
+coverage
+\*.lcov
+
+# nyc test coverage
+
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+
+bower_components
+
+# node-waf configuration
+
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+
+build/Release
+
+# Dependency directories
+
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+
+web_modules/
+
+# TypeScript cache
+
+\*.tsbuildinfo
+
+# Optional npm cache directory
+
+.npm
+
+# Optional eslint cache
+
+.eslintcache
+
+# Optional stylelint cache
+
+.stylelintcache
+
+# Microbundle cache
+
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+
+.node_repl_history
+
+# Output of 'npm pack'
+
+\*.tgz
+
+# Yarn Integrity file
+
+.yarn-integrity
+
+# dotenv environment variable files
+
+.env
+.env.development.local
+.env.test.local
+.env.production.local
+.env.local
+
+# parcel-bundler cache (https://parceljs.org/)
+
+.cache
+.parcel-cache
+
+# Next.js build output
+
+.next
+out
+
+# Nuxt.js build / generate output
+
+.nuxt
+dist
+
+# Gatsby files
+
+.cache/
+
+# Comment in the public line in if your project uses Gatsby and not Next.js
+
+# https://nextjs.org/blog/next-9-1#public-directory-support
+
+# public
+
+# vuepress build output
+
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+
+.temp
+.cache
+
+# Docusaurus cache and generated files
+
+.docusaurus
+
+# Serverless directories
+
+.serverless/
+
+# FuseBox cache
+
+.fusebox/
+
+# DynamoDB Local files
+
+.dynamodb/
+
+# TernJS port file
+
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+
+.vscode-test
+
+# yarn v2
+
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.\*
diff --git a/client/lib/systems/WallBounds.ts b/client/lib/systems/WallBounds.ts
deleted file mode 100644
index 3fd5dc4..0000000
--- a/client/lib/systems/WallBounds.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { System, SystemNames } from ".";
-import { BoundingBox, ComponentNames } from "../components";
-import type { Entity } from "../entities";
-
-export class WallBounds extends System {
- private screenWidth: number;
-
- constructor(screenWidth: number) {
- super(SystemNames.WallBounds);
-
- this.screenWidth = screenWidth;
- }
-
- public update(
- _dt: number,
- entityMap: Map<number, Entity>,
- componentEntities: Map<string, Set<number>>
- ) {
- componentEntities.get(ComponentNames.WallBounded)?.forEach((entityId) => {
- const entity = entityMap.get(entityId);
- if (!entity.hasComponent(ComponentNames.BoundingBox)) {
- return;
- }
-
- const boundingBox = entity.getComponent<BoundingBox>(
- ComponentNames.BoundingBox
- );
-
- boundingBox.center.x = Math.min(
- this.screenWidth - boundingBox.dimension.width / 2,
- Math.max(boundingBox.dimension.width / 2, boundingBox.center.x)
- );
- });
- }
-}
diff --git a/client/package-lock.json b/client/package-lock.json
index 641f566..bf627d9 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -7,6 +7,9 @@
"": {
"name": "client",
"version": "0.0.0",
+ "dependencies": {
+ "module-alias": "^2.2.3"
+ },
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^2.0.4",
"@tsconfig/svelte": "^4.0.1",
@@ -1585,6 +1588,11 @@
"mkdirp": "bin/cmd.js"
}
},
+ "node_modules/module-alias": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz",
+ "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q=="
+ },
"node_modules/mri": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
diff --git a/client/package.json b/client/package.json
index 1ddd2b8..43c1b66 100644
--- a/client/package.json
+++ b/client/package.json
@@ -20,5 +20,8 @@
"tslib": "^2.5.0",
"typescript": "^5.0.2",
"vite": "^4.3.9"
+ },
+ "dependencies": {
+ "module-alias": "^2.2.3"
}
}
diff --git a/client/lib/JumpStorm.ts b/client/src/JumpStorm.ts
index c76d9bc..45ea163 100644
--- a/client/lib/JumpStorm.ts
+++ b/client/src/JumpStorm.ts
@@ -1,5 +1,5 @@
-import { Floor, Player } from "./entities";
-import { Game } from "./Game";
+import { Floor, Player } from "@engine/entities";
+import { Game } from "@engine/Game";
import {
WallBounds,
FacingDirection,
@@ -7,7 +7,7 @@ import {
Physics,
Input,
Collision,
-} from "./systems";
+} from "@engine/systems";
export class JumpStorm {
private game: Game;
diff --git a/client/src/components/GameCanvas.svelte b/client/src/components/GameCanvas.svelte
index 766a08a..d7abecf 100644
--- a/client/src/components/GameCanvas.svelte
+++ b/client/src/components/GameCanvas.svelte
@@ -1,11 +1,8 @@
<script lang="ts">
import { onMount } from "svelte";
- import { Game } from "../../lib/Game";
- import { Render } from "../../lib/systems";
- import { Floor } from "../../lib/entities";
- import { loadAssets } from "../../lib/config";
- import { JumpStorm } from "../../lib/JumpStorm";
-
+ import { loadAssets } from "@engine/config";
+ import { JumpStorm} from "../Jumpstorm";
+
let canvas: HTMLCanvasElement;
let ctx: CanvasRenderingContext2D;
diff --git a/client/src/components/LeaderBoard.svelte b/client/src/components/LeaderBoard.svelte
index d6e4ce3..880e64a 100644
--- a/client/src/components/LeaderBoard.svelte
+++ b/client/src/components/LeaderBoard.svelte
@@ -1,5 +1,5 @@
<script lang="ts">
- import { type LeaderBoardEntry } from "../../lib/interfaces";
+ import { type LeaderBoardEntry } from "@engine/interfaces";
import LeaderBoardCard from "./LeaderBoardCard.svelte";
const MAX_ENTRIES = 8;
diff --git a/client/src/components/LeaderBoardCard.svelte b/client/src/components/LeaderBoardCard.svelte
index 446d734..f46c000 100644
--- a/client/src/components/LeaderBoardCard.svelte
+++ b/client/src/components/LeaderBoardCard.svelte
@@ -1,5 +1,5 @@
<script lang="ts">
- import { type LeaderBoardEntry } from "../../lib/interfaces";
+ import { type LeaderBoardEntry } from "@engine/interfaces";
export let entry: LeaderBoardEntry = {
name: "simponic",
diff --git a/client/tsconfig.json b/client/tsconfig.json
index eabe862..781d1b3 100644
--- a/client/tsconfig.json
+++ b/client/tsconfig.json
@@ -24,5 +24,8 @@
"src/**/*.js",
"src/**/*.svelte"
],
+ "paths": {
+ "@engine/*": ["../engine/*"]
+ },
"references": [{ "path": "./tsconfig.node.json" }]
}
diff --git a/client/vite.config.ts b/client/vite.config.ts
index d701969..0307338 100644
--- a/client/vite.config.ts
+++ b/client/vite.config.ts
@@ -1,7 +1,13 @@
-import { defineConfig } from 'vite'
-import { svelte } from '@sveltejs/vite-plugin-svelte'
+import { defineConfig } from "vite";
+import { svelte } from "@sveltejs/vite-plugin-svelte";
+import { fileURLToPath, URL } from "node:url";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [svelte()],
-})
+ resolve: {
+ alias: {
+ "@engine": fileURLToPath(new URL("../engine", import.meta.url)),
+ },
+ },
+});
diff --git a/client/lib/Game.ts b/engine/Game.ts
index d6ffb47..c2a2c4f 100644
--- a/client/lib/Game.ts
+++ b/engine/Game.ts
@@ -2,18 +2,21 @@ import { Entity } from "./entities";
import { System } from "./systems";
export class Game {
- private entities: Map<number, Entity>;
- private systems: Map<string, System>;
private systemOrder: string[];
private running: boolean;
private lastTimeStamp: number;
+ public entities: Map<number, Entity>;
+ public systems: Map<string, System>;
+ public componentEntities: Map<string, Set<number>>;
+
constructor() {
this.running = false;
this.systemOrder = [];
this.systems = new Map();
this.entities = new Map();
+ this.componentEntities = new Map();
}
public start() {
@@ -52,19 +55,22 @@ export class Game {
const dt = timeStamp - this.lastTimeStamp;
this.lastTimeStamp = timeStamp;
- const componentEntities = new Map<string, Set<number>>();
+ this.componentEntities.clear();
this.entities.forEach((entity) =>
entity.getComponents().forEach((component) => {
- if (!componentEntities.has(component.name)) {
- componentEntities.set(component.name, new Set<number>([entity.id]));
+ if (!this.componentEntities.has(component.name)) {
+ this.componentEntities.set(
+ component.name,
+ new Set<number>([entity.id])
+ );
return;
}
- componentEntities.get(component.name).add(entity.id);
+ this.componentEntities.get(component.name).add(entity.id);
})
);
this.systemOrder.forEach((systemName) => {
- this.systems.get(systemName).update(dt, this.entities, componentEntities);
+ this.systems.get(systemName).update(dt, this);
});
};
}
diff --git a/client/lib/components/BoundingBox.ts b/engine/components/BoundingBox.ts
index 2b1d648..2b1d648 100644
--- a/client/lib/components/BoundingBox.ts
+++ b/engine/components/BoundingBox.ts
diff --git a/client/lib/components/Collide.ts b/engine/components/Collide.ts
index 889ecf8..889ecf8 100644
--- a/client/lib/components/Collide.ts
+++ b/engine/components/Collide.ts
diff --git a/client/lib/components/Component.ts b/engine/components/Component.ts
index 7331982..7331982 100644
--- a/client/lib/components/Component.ts
+++ b/engine/components/Component.ts
diff --git a/client/lib/components/Control.ts b/engine/components/Control.ts
index 094ef1c..094ef1c 100644
--- a/client/lib/components/Control.ts
+++ b/engine/components/Control.ts
diff --git a/client/lib/components/FacingDirection.ts b/engine/components/FacingDirection.ts
index 1c701a3..1c701a3 100644
--- a/client/lib/components/FacingDirection.ts
+++ b/engine/components/FacingDirection.ts
diff --git a/client/lib/components/Forces.ts b/engine/components/Forces.ts
index bf540a1..bf540a1 100644
--- a/client/lib/components/Forces.ts
+++ b/engine/components/Forces.ts
diff --git a/client/lib/components/Gravity.ts b/engine/components/Gravity.ts
index 89fcb67..89fcb67 100644
--- a/client/lib/components/Gravity.ts
+++ b/engine/components/Gravity.ts
diff --git a/client/lib/components/Jump.ts b/engine/components/Jump.ts
index 0b40767..0b40767 100644
--- a/client/lib/components/Jump.ts
+++ b/engine/components/Jump.ts
diff --git a/client/lib/components/Mass.ts b/engine/components/Mass.ts
index daa2d71..daa2d71 100644
--- a/client/lib/components/Mass.ts
+++ b/engine/components/Mass.ts
diff --git a/client/lib/components/Moment.ts b/engine/components/Moment.ts
index 3d0dd2f..3d0dd2f 100644
--- a/client/lib/components/Moment.ts
+++ b/engine/components/Moment.ts
diff --git a/client/lib/components/Sprite.ts b/engine/components/Sprite.ts
index 90e1389..90e1389 100644
--- a/client/lib/components/Sprite.ts
+++ b/engine/components/Sprite.ts
diff --git a/client/lib/components/TopCollidable.ts b/engine/components/TopCollidable.ts
index 7fb147d..7fb147d 100644
--- a/client/lib/components/TopCollidable.ts
+++ b/engine/components/TopCollidable.ts
diff --git a/client/lib/components/Velocity.ts b/engine/components/Velocity.ts
index 119427d..119427d 100644
--- a/client/lib/components/Velocity.ts
+++ b/engine/components/Velocity.ts
diff --git a/client/lib/components/WallBounded.ts b/engine/components/WallBounded.ts
index 5f787e1..5f787e1 100644
--- a/client/lib/components/WallBounded.ts
+++ b/engine/components/WallBounded.ts
diff --git a/client/lib/components/index.ts b/engine/components/index.ts
index 67f1259..67f1259 100644
--- a/client/lib/components/index.ts
+++ b/engine/components/index.ts
diff --git a/client/lib/components/names.ts b/engine/components/names.ts
index e2ee3d3..e2ee3d3 100644
--- a/client/lib/components/names.ts
+++ b/engine/components/names.ts
diff --git a/client/lib/config/assets.ts b/engine/config/assets.ts
index 51a5303..51a5303 100644
--- a/client/lib/config/assets.ts
+++ b/engine/config/assets.ts
diff --git a/client/lib/config/constants.ts b/engine/config/constants.ts
index 27c8160..27c8160 100644
--- a/client/lib/config/constants.ts
+++ b/engine/config/constants.ts
diff --git a/client/lib/config/index.ts b/engine/config/index.ts
index 7a1052a..7a1052a 100644
--- a/client/lib/config/index.ts
+++ b/engine/config/index.ts
diff --git a/client/lib/config/sprites.ts b/engine/config/sprites.ts
index 18bec73..18bec73 100644
--- a/client/lib/config/sprites.ts
+++ b/engine/config/sprites.ts
diff --git a/client/lib/entities/Entity.ts b/engine/entities/Entity.ts
index e57ccde..e57ccde 100644
--- a/client/lib/entities/Entity.ts
+++ b/engine/entities/Entity.ts
diff --git a/client/lib/entities/Floor.ts b/engine/entities/Floor.ts
index d51badc..d51badc 100644
--- a/client/lib/entities/Floor.ts
+++ b/engine/entities/Floor.ts
diff --git a/client/lib/entities/Player.ts b/engine/entities/Player.ts
index 0ba5a41..0ba5a41 100644
--- a/client/lib/entities/Player.ts
+++ b/engine/entities/Player.ts
diff --git a/client/lib/entities/index.ts b/engine/entities/index.ts
index a921512..a921512 100644
--- a/client/lib/entities/index.ts
+++ b/engine/entities/index.ts
diff --git a/client/lib/interfaces/Action.ts b/engine/interfaces/Action.ts
index 61c89e1..61c89e1 100644
--- a/client/lib/interfaces/Action.ts
+++ b/engine/interfaces/Action.ts
diff --git a/client/lib/interfaces/Direction.ts b/engine/interfaces/Direction.ts
index 0bc6ef3..0bc6ef3 100644
--- a/client/lib/interfaces/Direction.ts
+++ b/engine/interfaces/Direction.ts
diff --git a/client/lib/interfaces/Draw.ts b/engine/interfaces/Draw.ts
index 6561a01..6561a01 100644
--- a/client/lib/interfaces/Draw.ts
+++ b/engine/interfaces/Draw.ts
diff --git a/client/lib/interfaces/LeaderBoardEntry.ts b/engine/interfaces/LeaderBoardEntry.ts
index 1b1e7b3..1b1e7b3 100644
--- a/client/lib/interfaces/LeaderBoardEntry.ts
+++ b/engine/interfaces/LeaderBoardEntry.ts
diff --git a/client/lib/interfaces/Vec2.ts b/engine/interfaces/Vec2.ts
index b2bae37..b2bae37 100644
--- a/client/lib/interfaces/Vec2.ts
+++ b/engine/interfaces/Vec2.ts
diff --git a/client/lib/interfaces/index.ts b/engine/interfaces/index.ts
index 0398abd..0398abd 100644
--- a/client/lib/interfaces/index.ts
+++ b/engine/interfaces/index.ts
diff --git a/client/lib/structures/QuadTree.ts b/engine/structures/QuadTree.ts
index 7913e59..7913e59 100644
--- a/client/lib/structures/QuadTree.ts
+++ b/engine/structures/QuadTree.ts
diff --git a/client/lib/structures/index.ts b/engine/structures/index.ts
index 605a82a..605a82a 100644
--- a/client/lib/structures/index.ts
+++ b/engine/structures/index.ts
diff --git a/client/lib/systems/Collision.ts b/engine/systems/Collision.ts
index 16ad8c6..4fcb906 100644
--- a/client/lib/systems/Collision.ts
+++ b/engine/systems/Collision.ts
@@ -7,13 +7,14 @@ import {
Velocity,
Moment,
} from "../components";
+import { Game } from "../Game";
import { PhysicsConstants } from "../config";
import { Entity } from "../entities";
import type { Dimension2D } from "../interfaces";
import { QuadTree } from "../structures";
export class Collision extends System {
- private static readonly COLLIDABLE_COMPONENTS = [
+ private static readonly COLLIDABLE_COMPONENT_NAMES = [
ComponentNames.Collide,
ComponentNames.TopCollidable,
];
@@ -33,19 +34,17 @@ export class Collision extends System {
);
}
- public update(
- dt: number,
- entityMap: Map<number, Entity>,
- entityComponents: Map<string, Set<number>>
- ) {
+ public update(dt: number, game: Game) {
+ // rebuild the quadtree
this.quadTree.clear();
const entitiesToAddToQuadtree: Entity[] = [];
- Collision.COLLIDABLE_COMPONENTS.map((componentName) =>
- entityComponents.get(componentName)
+
+ Collision.COLLIDABLE_COMPONENT_NAMES.map((componentName) =>
+ game.componentEntities.get(componentName)
).forEach((entityIds: Set<number>) =>
entityIds.forEach((id) => {
- const entity = entityMap.get(id);
+ const entity = game.entities.get(id);
if (!entity.hasComponent(ComponentNames.BoundingBox)) {
return;
}
@@ -65,13 +64,15 @@ export class Collision extends System {
);
});
+ // find colliding entities and perform collisions
const collidingEntities = this.getCollidingEntities(
entitiesToAddToQuadtree,
- entityMap
+ game.entities
);
+
collidingEntities.forEach(([entityAId, entityBId]) => {
const [entityA, entityB] = [entityAId, entityBId].map((id) =>
- entityMap.get(id)
+ game.entities.get(id)
);
this.performCollision(entityA, entityB);
});
@@ -92,7 +93,7 @@ export class Collision extends System {
entityB.hasComponent(ComponentNames.TopCollidable) &&
entityABoundingBox.center.y <= entityBBoundingBox.center.y &&
velocity &&
- velocity.dCartesian.dy >= 0 // don't apply floor logic when coming through the bottom
+ velocity.dCartesian.dy >= 0 // don't apply "floor" logic when coming through the bottom
) {
if (entityBBoundingBox.rotation != 0) {
throw new Error(
@@ -157,11 +158,11 @@ export class Collision extends System {
return collidingEntityIds;
}
+ // ramblings: https://excalidraw.com/#json=z-xD86Za4a3duZuV2Oky0,KaGe-5iHJu1Si8inEo4GLQ
private getDyToPushOutOfFloor(
entityBoundingBox: BoundingBox,
floorBoundingBox: BoundingBox
): number {
- // ramblings: https://excalidraw.com/#json=z-xD86Za4a3duZuV2Oky0,KaGe-5iHJu1Si8inEo4GLQ
const {
rotation,
center: { x, y },
diff --git a/client/lib/systems/FacingDirection.ts b/engine/systems/FacingDirection.ts
index fbb4c7c..c6513ac 100644
--- a/client/lib/systems/FacingDirection.ts
+++ b/engine/systems/FacingDirection.ts
@@ -3,6 +3,7 @@ import {
Velocity,
FacingDirection as FacingDirectionComponent,
} from "../components";
+import { Game } from "../Game";
import type { Entity } from "../entities";
import { System, SystemNames } from "./";
@@ -11,15 +12,11 @@ export class FacingDirection extends System {
super(SystemNames.FacingDirection);
}
- public update(
- _dt: number,
- entityMap: Map<number, Entity>,
- componentEntities: Map<string, Set<number>>
- ) {
- componentEntities
+ public update(_dt: number, game: Game) {
+ game.componentEntities
.get(ComponentNames.FacingDirection)
?.forEach((entityId) => {
- const entity = entityMap.get(entityId);
+ const entity = game.entities.get(entityId);
if (!entity.hasComponent(ComponentNames.Velocity)) {
return;
}
diff --git a/client/lib/systems/Input.ts b/engine/systems/Input.ts
index 92932dd..9a92163 100644
--- a/client/lib/systems/Input.ts
+++ b/engine/systems/Input.ts
@@ -6,6 +6,7 @@ import {
Velocity,
Mass,
} from "../components";
+import { Game } from "../Game";
import { KeyConstants, PhysicsConstants } from "../config";
import type { Entity } from "../entities";
import { Action } from "../interfaces";
@@ -34,13 +35,9 @@ export class Input extends System {
return keys.some((key) => this.keys.has(key));
}
- public update(
- dt: number,
- entityMap: Map<number, Entity>,
- componentEntities: Map<string, Set<number>>
- ) {
- componentEntities.get(ComponentNames.Control)?.forEach((entityId) => {
- const entity = entityMap.get(entityId);
+ public update(dt: number, game: Game) {
+ game.componentEntities.get(ComponentNames.Control)?.forEach((entityId) => {
+ const entity = game.entities.get(entityId);
if (!entity.hasComponent(ComponentNames.Velocity)) {
return;
}
@@ -58,8 +55,8 @@ export class Input extends System {
}
});
- componentEntities.get(ComponentNames.Jump)?.forEach((entityId) => {
- const entity = entityMap.get(entityId);
+ game.componentEntities.get(ComponentNames.Jump)?.forEach((entityId) => {
+ const entity = game.entities.get(entityId);
const jump = entity.getComponent<Jump>(ComponentNames.Jump);
const velocity = entity.getComponent<Velocity>(ComponentNames.Velocity);
diff --git a/client/lib/systems/Physics.ts b/engine/systems/Physics.ts
index 319ae29..7edeb41 100644
--- a/client/lib/systems/Physics.ts
+++ b/engine/systems/Physics.ts
@@ -12,19 +12,16 @@ import {
import { PhysicsConstants } from "../config";
import type { Entity } from "../entities";
import type { Force2D } from "../interfaces";
+import { Game } from "../Game";
export class Physics extends System {
constructor() {
super(SystemNames.Physics);
}
- public update(
- dt: number,
- entityMap: Map<number, Entity>,
- componentEntities: Map<string, Set<number>>
- ): void {
- componentEntities.get(ComponentNames.Forces)?.forEach((entityId) => {
- const entity = entityMap.get(entityId);
+ public update(dt: number, game: Game): void {
+ game.componentEntities.get(ComponentNames.Forces)?.forEach((entityId) => {
+ const entity = game.entities.get(entityId);
const mass = entity.getComponent<Mass>(ComponentNames.Mass).mass;
const forces = entity.getComponent<Forces>(ComponentNames.Forces).forces;
@@ -74,8 +71,8 @@ export class Physics extends System {
}
});
- componentEntities.get(ComponentNames.Velocity)?.forEach((entityId) => {
- const entity = entityMap.get(entityId);
+ game.componentEntities.get(ComponentNames.Velocity)?.forEach((entityId) => {
+ const entity = game.entities.get(entityId);
const velocity = entity.getComponent<Velocity>(ComponentNames.Velocity);
const boundingBox = entity.getComponent<BoundingBox>(
ComponentNames.BoundingBox
diff --git a/client/lib/systems/Render.ts b/engine/systems/Render.ts
index 0c76b00..b5479e1 100644
--- a/client/lib/systems/Render.ts
+++ b/engine/systems/Render.ts
@@ -1,7 +1,9 @@
import { System, SystemNames } from ".";
import { BoundingBox, ComponentNames, Sprite } from "../components";
import type { Entity } from "../entities";
+import { Game } from "../Game";
import type { DrawArgs } from "../interfaces";
+import { clamp } from "../utils";
export class Render extends System {
private ctx: CanvasRenderingContext2D;
@@ -11,15 +13,11 @@ export class Render extends System {
this.ctx = ctx;
}
- public update(
- dt: number,
- entityMap: Map<number, Entity>,
- componentEntities: Map<string, Set<number>>
- ) {
+ public update(dt: number, game: Game) {
this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
- componentEntities.get(ComponentNames.Sprite)?.forEach((entityId) => {
- const entity = entityMap.get(entityId);
+ game.componentEntities.get(ComponentNames.Sprite)?.forEach((entityId) => {
+ const entity = game.entities.get(entityId);
const sprite = entity.getComponent<Sprite>(ComponentNames.Sprite);
sprite.update(dt);
@@ -29,6 +27,22 @@ export class Render extends System {
ComponentNames.BoundingBox
);
+ // don't render if we're outside the screen
+ if (
+ clamp(
+ boundingBox.center.y,
+ -boundingBox.dimension.height / 2,
+ this.ctx.canvas.height + boundingBox.dimension.height / 2
+ ) != boundingBox.center.y ||
+ clamp(
+ boundingBox.center.x,
+ -boundingBox.dimension.width / 2,
+ this.ctx.canvas.width + boundingBox.dimension.width / 2
+ ) != boundingBox.center.x
+ ) {
+ return;
+ }
+
drawArgs = {
center: boundingBox.center,
dimension: boundingBox.dimension,
diff --git a/client/lib/systems/System.ts b/engine/systems/System.ts
index 2accc97..1aad285 100644
--- a/client/lib/systems/System.ts
+++ b/engine/systems/System.ts
@@ -1,4 +1,5 @@
import { Entity } from "../entities";
+import { Game } from "../Game";
export abstract class System {
public readonly name: string;
@@ -7,9 +8,5 @@ export abstract class System {
this.name = name;
}
- abstract update(
- dt: number,
- entityMap: Map<number, Entity>,
- componentEntities: Map<string, Set<number>>
- ): void;
+ abstract update(dt: number, game: Game): void;
}
diff --git a/engine/systems/WallBounds.ts b/engine/systems/WallBounds.ts
new file mode 100644
index 0000000..6ea2267
--- /dev/null
+++ b/engine/systems/WallBounds.ts
@@ -0,0 +1,36 @@
+import { System, SystemNames } from ".";
+import { BoundingBox, ComponentNames } from "../components";
+import { Game } from "../Game";
+import type { Entity } from "../entities";
+import { clamp } from "../utils";
+
+export class WallBounds extends System {
+ private screenWidth: number;
+
+ constructor(screenWidth: number) {
+ super(SystemNames.WallBounds);
+
+ this.screenWidth = screenWidth;
+ }
+
+ public update(_dt: number, game: Game) {
+ game.componentEntities
+ .get(ComponentNames.WallBounded)
+ ?.forEach((entityId) => {
+ const entity = game.entities.get(entityId);
+ if (!entity.hasComponent(ComponentNames.BoundingBox)) {
+ return;
+ }
+
+ const boundingBox = entity.getComponent<BoundingBox>(
+ ComponentNames.BoundingBox
+ );
+
+ boundingBox.center.x = clamp(
+ boundingBox.center.x,
+ boundingBox.dimension.width / 2,
+ this.screenWidth - boundingBox.dimension.width / 2
+ );
+ });
+ }
+}
diff --git a/client/lib/systems/index.ts b/engine/systems/index.ts
index 6cb6f35..6cb6f35 100644
--- a/client/lib/systems/index.ts
+++ b/engine/systems/index.ts
diff --git a/client/lib/systems/names.ts b/engine/systems/names.ts
index 23f31fc..23f31fc 100644
--- a/client/lib/systems/names.ts
+++ b/engine/systems/names.ts
diff --git a/engine/utils/clamp.ts b/engine/utils/clamp.ts
new file mode 100644
index 0000000..42e1764
--- /dev/null
+++ b/engine/utils/clamp.ts
@@ -0,0 +1,2 @@
+export const clamp = (num: number, min: number, max: number) =>
+ Math.min(Math.max(num, min), max);
diff --git a/client/lib/utils/dotProduct.ts b/engine/utils/dotProduct.ts
index 59f8857..59f8857 100644
--- a/client/lib/utils/dotProduct.ts
+++ b/engine/utils/dotProduct.ts
diff --git a/client/lib/utils/index.ts b/engine/utils/index.ts
index 1f8e2f0..4e465c2 100644
--- a/client/lib/utils/index.ts
+++ b/engine/utils/index.ts
@@ -1,3 +1,4 @@
export * from "./rotateVector";
export * from "./normalizeVector";
export * from "./dotProduct";
+export * from "./clamp";
diff --git a/client/lib/utils/normalizeVector.ts b/engine/utils/normalizeVector.ts
index e6dfd7f..e6dfd7f 100644
--- a/client/lib/utils/normalizeVector.ts
+++ b/engine/utils/normalizeVector.ts
diff --git a/client/lib/utils/rotateVector.ts b/engine/utils/rotateVector.ts
index 82bb54d..82bb54d 100644
--- a/client/lib/utils/rotateVector.ts
+++ b/engine/utils/rotateVector.ts
diff --git a/server/README.md b/server/README.md
new file mode 100644
index 0000000..84286d5
--- /dev/null
+++ b/server/README.md
@@ -0,0 +1,15 @@
+# server
+
+To install dependencies:
+
+```bash
+bun install
+```
+
+To run:
+
+```bash
+bun run index.ts
+```
+
+This project was created using `bun init` in bun v0.6.14. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
diff --git a/server/bun.lockb b/server/bun.lockb
new file mode 100755
index 0000000..7f8b5ce
--- /dev/null
+++ b/server/bun.lockb
Binary files differ
diff --git a/server/index.ts b/server/index.ts
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/server/index.ts
diff --git a/server/package.json b/server/package.json
new file mode 100644
index 0000000..0bb97a9
--- /dev/null
+++ b/server/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "server",
+ "module": "src/index.ts",
+ "type": "module",
+ "devDependencies": {
+ "bun-types": "^0.6.14"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0"
+ },
+ "dependencies": {
+ }
+}
diff --git a/server/src/index.ts b/server/src/index.ts
new file mode 100644
index 0000000..138762b
--- /dev/null
+++ b/server/src/index.ts
@@ -0,0 +1,3 @@
+import { Game } from "../../engine/Game";
+
+console.log(Game);
diff --git a/server/tsconfig.json b/server/tsconfig.json
new file mode 100644
index 0000000..29f8aa0
--- /dev/null
+++ b/server/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "lib": ["ESNext"],
+ "module": "esnext",
+ "target": "esnext",
+ "moduleResolution": "bundler",
+ "moduleDetection": "force",
+ "allowImportingTsExtensions": true,
+ "strict": true,
+ "downlevelIteration": true,
+ "skipLibCheck": true,
+ "jsx": "preserve",
+ "allowSyntheticDefaultImports": true,
+ "forceConsistentCasingInFileNames": true,
+ "allowJs": true,
+ "noEmit": true,
+ "types": [
+ "bun-types" // add Bun global
+ ]
+ }
+}