diff options
-rw-r--r-- | .gitignore | 169 | ||||
-rw-r--r-- | client/lib/systems/WallBounds.ts | 35 | ||||
-rw-r--r-- | client/package-lock.json | 8 | ||||
-rw-r--r-- | client/package.json | 3 | ||||
-rw-r--r-- | client/src/JumpStorm.ts (renamed from client/lib/JumpStorm.ts) | 6 | ||||
-rw-r--r-- | client/src/components/GameCanvas.svelte | 9 | ||||
-rw-r--r-- | client/src/components/LeaderBoard.svelte | 2 | ||||
-rw-r--r-- | client/src/components/LeaderBoardCard.svelte | 2 | ||||
-rw-r--r-- | client/tsconfig.json | 3 | ||||
-rw-r--r-- | client/vite.config.ts | 12 | ||||
-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.ts | 36 | ||||
-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.ts | 2 | ||||
-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.md | 15 | ||||
-rwxr-xr-x | server/bun.lockb | bin | 0 -> 1650 bytes | |||
-rw-r--r-- | server/index.ts | 0 | ||||
-rw-r--r-- | server/package.json | 13 | ||||
-rw-r--r-- | server/src/index.ts | 3 | ||||
-rw-r--r-- | server/tsconfig.json | 21 |
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 Binary files differnew file mode 100755 index 0000000..7f8b5ce --- /dev/null +++ b/server/bun.lockb 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 + ] + } +} |