From d9473be53ddd94f4ad0ea8193a6c5a7e037e7781 Mon Sep 17 00:00:00 2001 From: Abbas Mahdavi Date: Thu, 18 Jul 2024 03:05:38 -0700 Subject: [PATCH 1/7] Implement basic 2D vector operations and grid-based ray tracing demo --- .gitignore | 1 + LICENSE | 21 ----- index.html | 18 ++++ index.js | 173 ++++++++++++++++++++++++++++++++++++++ index.ts | 206 ++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 30 +++++++ package.json | 14 ++++ tsconfig.json | 108 ++++++++++++++++++++++++ 8 files changed, 550 insertions(+), 21 deletions(-) create mode 100644 .gitignore delete mode 100644 LICENSE create mode 100644 index.html create mode 100644 index.js create mode 100644 index.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 60d7219..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Abbas Mahdavi - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/index.html b/index.html new file mode 100644 index 0000000..6ab0e51 --- /dev/null +++ b/index.html @@ -0,0 +1,18 @@ + + + + Ray Casting Game + + + + + + + diff --git a/index.js b/index.js new file mode 100644 index 0000000..75befb6 --- /dev/null +++ b/index.js @@ -0,0 +1,173 @@ +"use strict"; +class Vector2 { + constructor(x, y) { + this.x = x; + this.y = y; + } + add(that) { + return new Vector2(this.x + that.x, this.y + that.y); + } + sub(that) { + return new Vector2(this.x - that.x, this.y - that.y); + } + div(that) { + return new Vector2(this.x / that.x, this.y / that.y); + } + mul(that) { + return new Vector2(this.x * that.x, this.y * that.y); + } + length() { + return Math.sqrt(this.x * this.x + this.y * this.y); + } + norm() { + const l = this.length(); + if (l == 0) + return new Vector2(0, 0); + return new Vector2(this.x / l, this.y / l); + } + scale(value) { + return new Vector2(this.x * value, this.y * value); + } + distanceTo(that) { + return that.sub(this).length(); + } + array() { + return [this.x, this.y]; + } +} +const EPS = 1e-3; +const GRID_ROWS = 10; +const GRID_COLS = 10; +const GRId_SIZE = new Vector2(GRID_COLS, GRID_ROWS); +let scene = Array(GRID_ROWS) + .fill(0) + .map(() => Array(GRID_COLS).fill(0)); +function drawLine(ctx, p1, p2) { + ctx.beginPath(); + ctx.moveTo(...p1.array()); + ctx.lineTo(...p2.array()); + ctx.stroke(); +} +function drawCircle(ctx, center, radius) { + ctx.beginPath(); + ctx.arc(...center.array(), radius, 0, 2 * Math.PI); + ctx.fill(); +} +function canvasSize(ctx) { + return new Vector2(ctx.canvas.width, ctx.canvas.height); +} +function drawGrid(ctx, p2) { + ctx.reset(); + ctx.scale(ctx.canvas.width / GRID_COLS, ctx.canvas.height / GRID_ROWS); + ctx.lineWidth = 0.02; + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + ctx.strokeStyle = "#303030"; + for (let y = 0; y < GRID_ROWS; ++y) { + for (let x = 0; x < GRID_COLS; ++x) { + if (scene[y][x] !== 0) { + ctx.fillStyle = "#303030"; + ctx.fillRect(x, y, 1, 1); + } + } + } + for (let x = 0; x <= GRID_ROWS; ++x) { + drawLine(ctx, new Vector2(x, 0), new Vector2(x, GRID_ROWS)); + } + for (let y = 0; y <= GRID_COLS; ++y) { + drawLine(ctx, new Vector2(0, y), new Vector2(GRID_COLS, y)); + } + let p1 = new Vector2(GRID_COLS * 0.16, GRID_ROWS * 0.89); + ctx.fillStyle = "lime"; + drawCircle(ctx, p1, 0.2); + if (p2 !== undefined) { + for (;;) { + ctx.strokeStyle = "lime"; + drawCircle(ctx, p2, 0.2); + drawLine(ctx, p1, p2); + const c = hittingCell(p1, p2); + if (c.x < 0 || + c.x >= GRId_SIZE.x || + c.y < 0 || + c.y >= GRId_SIZE.y || + scene[c.y][c.x] == 1) { + break; + } + const p3 = rayStep(p1, p2); + p1 = p2; + p2 = p3; + } + } +} +function rayStep(p1, p2) { + /* slope equation + p1 = (x1, y1) + p2 = (x2, y2) + + y1 = m*x1 + c + y2 = m*x2 + c + + dy = y2 - y1 + dx = x2 - x1 + m = dy / dx + c = y1 - k*x1 + + */ + let p3 = p2; + const d = p2.sub(p1); + if (d.x != 0) { + const m = d.y / d.x; + const c = p1.y - m * p1.x; + const x3 = snap(p2.x, d.x); + const y3 = m * x3 + c; + { + const y3 = x3 * m + c; + p3 = new Vector2(x3, y3); + } + if (m !== 0) { + const y3 = snap(p2.y, d.y); + const x3 = (y3 - c) / m; + const p3t = new Vector2(x3, y3); + if (p2.distanceTo(p3t) < p2.distanceTo(p3)) { + p3 = p3t; + } + } + } + else { + const y3 = snap(p2.y, d.y); + const x3 = p2.x; + p3 = new Vector2(x3, y3); + } + return p3; +} +function snap(x, dx) { + if (dx > 0) + return Math.ceil(x + Math.sign(dx) * EPS); + if (dx < 0) + return Math.floor(x + Math.sign(dx) * EPS); + return x; +} +function hittingCell(p1, p2) { + const d = p2.sub(p1); + return new Vector2(Math.floor(p2.x + Math.sign(d.x) * EPS), Math.floor(p2.y + Math.sign(d.y) * EPS)); +} +(() => { + scene[1][1] = 1; + const game = document.getElementById("game"); + if (game === null) { + throw new Error("Can't find game canvas!"); + } + const ctx = game.getContext("2d"); + if (ctx === null) { + throw new Error("Not supported!"); + } + let p2; + game.addEventListener("mousemove", (event) => { + p2 = new Vector2(event.offsetX, event.offsetY) + .div(canvasSize(ctx)) + .mul(new Vector2(GRID_COLS, GRID_ROWS)); + drawGrid(ctx, p2); + }); + drawGrid(ctx, p2); + console.log(ctx); +})(); diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..c2c5ae5 --- /dev/null +++ b/index.ts @@ -0,0 +1,206 @@ +class Vector2 { + x: number; + y: number; + constructor(x: number, y: number) { + this.x = x; + this.y = y; + } + add(that: Vector2): Vector2 { + return new Vector2(this.x + that.x, this.y + that.y); + } + sub(that: Vector2): Vector2 { + return new Vector2(this.x - that.x, this.y - that.y); + } + + div(that: Vector2): Vector2 { + return new Vector2(this.x / that.x, this.y / that.y); + } + + mul(that: Vector2): Vector2 { + return new Vector2(this.x * that.x, this.y * that.y); + } + + length(): number { + return Math.sqrt(this.x * this.x + this.y * this.y); + } + + norm(): Vector2 { + const l = this.length(); + if (l == 0) return new Vector2(0, 0); + return new Vector2(this.x / l, this.y / l); + } + scale(value: number): Vector2 { + return new Vector2(this.x * value, this.y * value); + } + distanceTo(that: Vector2): number { + return that.sub(this).length(); + } + array(): [number, number] { + return [this.x, this.y]; + } +} + +const EPS = 1e-3; +const GRID_ROWS = 10; +const GRID_COLS = 10; +const GRId_SIZE = new Vector2(GRID_COLS, GRID_ROWS); +let scene = Array(GRID_ROWS) + .fill(0) + .map(() => Array(GRID_COLS).fill(0)); + +function drawLine(ctx: CanvasRenderingContext2D, p1: Vector2, p2: Vector2) { + ctx.beginPath(); + ctx.moveTo(...p1.array()); + ctx.lineTo(...p2.array()); + ctx.stroke(); +} + +function drawCircle( + ctx: CanvasRenderingContext2D, + center: Vector2, + radius: number +) { + ctx.beginPath(); + ctx.arc(...center.array(), radius, 0, 2 * Math.PI); + ctx.fill(); +} + +function canvasSize(ctx: CanvasRenderingContext2D): Vector2 { + return new Vector2(ctx.canvas.width, ctx.canvas.height); +} + +function drawGrid(ctx: CanvasRenderingContext2D, p2: Vector2 | undefined) { + ctx.reset(); + ctx.scale(ctx.canvas.width / GRID_COLS, ctx.canvas.height / GRID_ROWS); + ctx.lineWidth = 0.02; + + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + ctx.strokeStyle = "#303030"; + + for (let y = 0; y < GRID_ROWS; ++y) { + for (let x = 0; x < GRID_COLS; ++x) { + if (scene[y][x] !== 0) { + ctx.fillStyle = "#303030"; + ctx.fillRect(x, y, 1, 1); + } + } + } + + for (let x = 0; x <= GRID_ROWS; ++x) { + drawLine(ctx, new Vector2(x, 0), new Vector2(x, GRID_ROWS)); + } + for (let y = 0; y <= GRID_COLS; ++y) { + drawLine(ctx, new Vector2(0, y), new Vector2(GRID_COLS, y)); + } + + let p1 = new Vector2(GRID_COLS * 0.16, GRID_ROWS * 0.89); + ctx.fillStyle = "lime"; + drawCircle(ctx, p1, 0.2); + if (p2 !== undefined) { + for (;;) { + ctx.strokeStyle = "lime"; + drawCircle(ctx, p2, 0.2); + drawLine(ctx, p1, p2); + + const c = hittingCell(p1, p2); + if ( + c.x < 0 || + c.x >= GRId_SIZE.x || + c.y < 0 || + c.y >= GRId_SIZE.y || + scene[c.y][c.x] == 1 + ) { + break; + } + + const p3 = rayStep(p1, p2); + p1 = p2; + p2 = p3; + } + } +} + +function rayStep(p1: Vector2, p2: Vector2): Vector2 { + /* slope equation + p1 = (x1, y1) + p2 = (x2, y2) + + y1 = m*x1 + c + y2 = m*x2 + c + + dy = y2 - y1 + dx = x2 - x1 + m = dy / dx + c = y1 - k*x1 + + */ + let p3 = p2; + const d = p2.sub(p1); + if (d.x != 0) { + const m = d.y / d.x; + const c = p1.y - m * p1.x; + const x3 = snap(p2.x, d.x); + const y3 = m * x3 + c; + + { + const y3 = x3 * m + c; + p3 = new Vector2(x3, y3); + } + + if (m !== 0) { + const y3 = snap(p2.y, d.y); + const x3 = (y3 - c) / m; + const p3t = new Vector2(x3, y3); + if (p2.distanceTo(p3t) < p2.distanceTo(p3)) { + p3 = p3t; + } + } + } else { + const y3 = snap(p2.y, d.y); + const x3 = p2.x; + p3 = new Vector2(x3, y3); + } + + return p3; +} + +function snap(x: number, dx: number): number { + if (dx > 0) return Math.ceil(x + Math.sign(dx) * EPS); + if (dx < 0) return Math.floor(x + Math.sign(dx) * EPS); + return x; +} + +function hittingCell(p1: Vector2, p2: Vector2): Vector2 { + const d = p2.sub(p1); + return new Vector2( + Math.floor(p2.x + Math.sign(d.x) * EPS), + Math.floor(p2.y + Math.sign(d.y) * EPS) + ); +} + +(() => { + scene[1][1] = 1; + const game = document.getElementById("game") as HTMLCanvasElement | null; + if (game === null) { + throw new Error("Can't find game canvas!"); + } + + const ctx = game.getContext("2d"); + if (ctx === null) { + throw new Error("Not supported!"); + } + + let p2: Vector2 | undefined; + + game.addEventListener("mousemove", (event) => { + p2 = new Vector2(event.offsetX, event.offsetY) + .div(canvasSize(ctx)) + .mul(new Vector2(GRID_COLS, GRID_ROWS)); + drawGrid(ctx, p2); + }); + + drawGrid(ctx, p2); + + console.log(ctx); +})(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1d5bd04 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,30 @@ +{ + "name": "raycastinggame", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "raycastinggame", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "typescript": "^5.5.3" + } + }, + "node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..fc916c7 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "raycastinggame", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "MIT", + "description": "", + "devDependencies": { + "typescript": "^5.5.3" + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8bb6097 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,108 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From 9846d483f1c3698ee28ff641074b7c256c921512 Mon Sep 17 00:00:00 2001 From: Abbas Mahdavi Date: Fri, 19 Jul 2024 02:57:10 -0700 Subject: [PATCH 2/7] Implement dynamic sizing for the grid layout --- index.html | 2 +- index.js | 72 ++++++++++++++++++++++++++++---------------- index.ts | 88 +++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 109 insertions(+), 53 deletions(-) diff --git a/index.html b/index.html index 6ab0e51..34fa024 100644 --- a/index.html +++ b/index.html @@ -12,7 +12,7 @@ - + diff --git a/index.js b/index.js index 75befb6..c4fff58 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,9 @@ class Vector2 { this.x = x; this.y = y; } + static zero() { + return new Vector2(0, 0); + } add(that) { return new Vector2(this.x + that.x, this.y + that.y); } @@ -36,12 +39,6 @@ class Vector2 { } } const EPS = 1e-3; -const GRID_ROWS = 10; -const GRID_COLS = 10; -const GRId_SIZE = new Vector2(GRID_COLS, GRID_ROWS); -let scene = Array(GRID_ROWS) - .fill(0) - .map(() => Array(GRID_COLS).fill(0)); function drawLine(ctx, p1, p2) { ctx.beginPath(); ctx.moveTo(...p1.array()); @@ -56,28 +53,37 @@ function drawCircle(ctx, center, radius) { function canvasSize(ctx) { return new Vector2(ctx.canvas.width, ctx.canvas.height); } -function drawGrid(ctx, p2) { +function sceneSize(scene) { + const y = scene.length; + let x = Number.MIN_VALUE; + for (let row of scene) { + x = Math.max(x, row.length); + } + return new Vector2(x, y); +} +function minimap(ctx, p1, p2, position, size, scene) { ctx.reset(); - ctx.scale(ctx.canvas.width / GRID_COLS, ctx.canvas.height / GRID_ROWS); - ctx.lineWidth = 0.02; ctx.fillStyle = "#181818"; ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); - ctx.strokeStyle = "#303030"; - for (let y = 0; y < GRID_ROWS; ++y) { - for (let x = 0; x < GRID_COLS; ++x) { + const gridSize = sceneSize(scene); + ctx.translate(...position.array()); + ctx.scale(...size.div(gridSize).array()); + ctx.lineWidth = 0.06; + for (let y = 0; y < gridSize.y; ++y) { + for (let x = 0; x < gridSize.x; ++x) { if (scene[y][x] !== 0) { ctx.fillStyle = "#303030"; ctx.fillRect(x, y, 1, 1); } } } - for (let x = 0; x <= GRID_ROWS; ++x) { - drawLine(ctx, new Vector2(x, 0), new Vector2(x, GRID_ROWS)); + ctx.strokeStyle = "#303030"; + for (let x = 0; x <= gridSize.x; ++x) { + drawLine(ctx, new Vector2(x, 0), new Vector2(x, gridSize.y)); } - for (let y = 0; y <= GRID_COLS; ++y) { - drawLine(ctx, new Vector2(0, y), new Vector2(GRID_COLS, y)); + for (let y = 0; y <= gridSize.y; ++y) { + drawLine(ctx, new Vector2(0, y), new Vector2(gridSize.x, y)); } - let p1 = new Vector2(GRID_COLS * 0.16, GRID_ROWS * 0.89); ctx.fillStyle = "lime"; drawCircle(ctx, p1, 0.2); if (p2 !== undefined) { @@ -87,9 +93,9 @@ function drawGrid(ctx, p2) { drawLine(ctx, p1, p2); const c = hittingCell(p1, p2); if (c.x < 0 || - c.x >= GRId_SIZE.x || + c.x >= gridSize.x || c.y < 0 || - c.y >= GRId_SIZE.y || + c.y >= gridSize.y || scene[c.y][c.x] == 1) { break; } @@ -152,22 +158,38 @@ function hittingCell(p1, p2) { return new Vector2(Math.floor(p2.x + Math.sign(d.x) * EPS), Math.floor(p2.y + Math.sign(d.y) * EPS)); } (() => { - scene[1][1] = 1; + let scene = [ + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ]; const game = document.getElementById("game"); if (game === null) { throw new Error("Can't find game canvas!"); } + const factor = 70; + game.width = 16 * factor; + game.height = 12 * factor; const ctx = game.getContext("2d"); if (ctx === null) { throw new Error("Not supported!"); } + let p1 = sceneSize(scene).mul(new Vector2(0.98, 0.89)); let p2; + let minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); + let cellSize = ctx.canvas.width * 0.03; + let minimapSize = sceneSize(scene).scale(cellSize); game.addEventListener("mousemove", (event) => { p2 = new Vector2(event.offsetX, event.offsetY) - .div(canvasSize(ctx)) - .mul(new Vector2(GRID_COLS, GRID_ROWS)); - drawGrid(ctx, p2); + .sub(minimapPosition) + .div(minimapSize) + .mul(sceneSize(scene)); + minimap(ctx, p1, p2, minimapPosition, minimapSize, scene); }); - drawGrid(ctx, p2); - console.log(ctx); + minimap(ctx, p1, p2, minimapPosition, minimapSize, scene); })(); diff --git a/index.ts b/index.ts index c2c5ae5..5dc712d 100644 --- a/index.ts +++ b/index.ts @@ -5,6 +5,9 @@ class Vector2 { this.x = x; this.y = y; } + static zero(): Vector2 { + return new Vector2(0, 0); + } add(that: Vector2): Vector2 { return new Vector2(this.x + that.x, this.y + that.y); } @@ -41,12 +44,6 @@ class Vector2 { } const EPS = 1e-3; -const GRID_ROWS = 10; -const GRID_COLS = 10; -const GRId_SIZE = new Vector2(GRID_COLS, GRID_ROWS); -let scene = Array(GRID_ROWS) - .fill(0) - .map(() => Array(GRID_COLS).fill(0)); function drawLine(ctx: CanvasRenderingContext2D, p1: Vector2, p2: Vector2) { ctx.beginPath(); @@ -69,17 +66,39 @@ function canvasSize(ctx: CanvasRenderingContext2D): Vector2 { return new Vector2(ctx.canvas.width, ctx.canvas.height); } -function drawGrid(ctx: CanvasRenderingContext2D, p2: Vector2 | undefined) { +function sceneSize(scene: Scene): Vector2 { + const y = scene.length; + let x = Number.MIN_VALUE; + for (let row of scene) { + x = Math.max(x, row.length); + } + return new Vector2(x, y); +} + +type Scene = Array>; + +function minimap( + ctx: CanvasRenderingContext2D, + p1: Vector2, + p2: Vector2 | undefined, + position: Vector2, + size: Vector2, + scene: Scene +) { ctx.reset(); - ctx.scale(ctx.canvas.width / GRID_COLS, ctx.canvas.height / GRID_ROWS); - ctx.lineWidth = 0.02; ctx.fillStyle = "#181818"; ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); - ctx.strokeStyle = "#303030"; - for (let y = 0; y < GRID_ROWS; ++y) { - for (let x = 0; x < GRID_COLS; ++x) { + const gridSize = sceneSize(scene); + + ctx.translate(...position.array()); + ctx.scale(...size.div(gridSize).array()); + + ctx.lineWidth = 0.06; + + for (let y = 0; y < gridSize.y; ++y) { + for (let x = 0; x < gridSize.x; ++x) { if (scene[y][x] !== 0) { ctx.fillStyle = "#303030"; ctx.fillRect(x, y, 1, 1); @@ -87,14 +106,15 @@ function drawGrid(ctx: CanvasRenderingContext2D, p2: Vector2 | undefined) { } } - for (let x = 0; x <= GRID_ROWS; ++x) { - drawLine(ctx, new Vector2(x, 0), new Vector2(x, GRID_ROWS)); + ctx.strokeStyle = "#303030"; + + for (let x = 0; x <= gridSize.x; ++x) { + drawLine(ctx, new Vector2(x, 0), new Vector2(x, gridSize.y)); } - for (let y = 0; y <= GRID_COLS; ++y) { - drawLine(ctx, new Vector2(0, y), new Vector2(GRID_COLS, y)); + for (let y = 0; y <= gridSize.y; ++y) { + drawLine(ctx, new Vector2(0, y), new Vector2(gridSize.x, y)); } - let p1 = new Vector2(GRID_COLS * 0.16, GRID_ROWS * 0.89); ctx.fillStyle = "lime"; drawCircle(ctx, p1, 0.2); if (p2 !== undefined) { @@ -106,9 +126,9 @@ function drawGrid(ctx: CanvasRenderingContext2D, p2: Vector2 | undefined) { const c = hittingCell(p1, p2); if ( c.x < 0 || - c.x >= GRId_SIZE.x || + c.x >= gridSize.x || c.y < 0 || - c.y >= GRId_SIZE.y || + c.y >= gridSize.y || scene[c.y][c.x] == 1 ) { break; @@ -180,27 +200,41 @@ function hittingCell(p1: Vector2, p2: Vector2): Vector2 { } (() => { - scene[1][1] = 1; + let scene = [ + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + ]; const game = document.getElementById("game") as HTMLCanvasElement | null; if (game === null) { throw new Error("Can't find game canvas!"); } + const factor = 70; + game.width = 16 * factor; + game.height = 12 * factor; const ctx = game.getContext("2d"); if (ctx === null) { throw new Error("Not supported!"); } + let p1 = sceneSize(scene).mul(new Vector2(0.98, 0.89)); let p2: Vector2 | undefined; - + let minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); + let cellSize = ctx.canvas.width * 0.03; + let minimapSize = sceneSize(scene).scale(cellSize); game.addEventListener("mousemove", (event) => { p2 = new Vector2(event.offsetX, event.offsetY) - .div(canvasSize(ctx)) - .mul(new Vector2(GRID_COLS, GRID_ROWS)); - drawGrid(ctx, p2); + .sub(minimapPosition) + .div(minimapSize) + .mul(sceneSize(scene)); + minimap(ctx, p1, p2, minimapPosition, minimapSize, scene); }); - drawGrid(ctx, p2); - - console.log(ctx); + minimap(ctx, p1, p2, minimapPosition, minimapSize, scene); })(); From dc681a7308df9db866267c57c925107cf772fcd8 Mon Sep 17 00:00:00 2001 From: Abbas Mahdavi Date: Fri, 19 Jul 2024 03:58:00 -0700 Subject: [PATCH 3/7] Added player class and calculated player FOV --- index.js | 148 ++++++++++++++++++++------------------- index.ts | 208 +++++++++++++++++++++++++++++-------------------------- 2 files changed, 186 insertions(+), 170 deletions(-) diff --git a/index.js b/index.js index c4fff58..1e90779 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,7 @@ "use strict"; +const EPS = 1e-3; +const NEAR_CLIPPING_PLANE = 0.75; +const FOV = Math.PI * 0.5; class Vector2 { constructor(x, y) { this.x = x; @@ -7,6 +10,9 @@ class Vector2 { static zero() { return new Vector2(0, 0); } + static fromAngle(angle) { + return new Vector2(Math.cos(angle), Math.sin(angle)); + } add(that) { return new Vector2(this.x + that.x, this.y + that.y); } @@ -31,6 +37,9 @@ class Vector2 { scale(value) { return new Vector2(this.x * value, this.y * value); } + rot90() { + return new Vector2(-this.y, this.x); + } distanceTo(that) { return that.sub(this).length(); } @@ -38,7 +47,19 @@ class Vector2 { return [this.x, this.y]; } } -const EPS = 1e-3; +class Player { + constructor(position, direction) { + this.position = position; + this.direction = direction; + } + fovRange() { + const l = Math.tan(FOV * 0.5) * NEAR_CLIPPING_PLANE; + const p = this.position.add(Vector2.fromAngle(this.direction).scale(NEAR_CLIPPING_PLANE)); + const p1 = p.add(p.sub(this.position).rot90().norm().scale(l)); + const p2 = p.sub(p.sub(this.position).rot90().norm().scale(l)); + return [p1, p2]; + } +} function drawLine(ctx, p1, p2) { ctx.beginPath(); ctx.moveTo(...p1.array()); @@ -61,49 +82,16 @@ function sceneSize(scene) { } return new Vector2(x, y); } -function minimap(ctx, p1, p2, position, size, scene) { - ctx.reset(); - ctx.fillStyle = "#181818"; - ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); - const gridSize = sceneSize(scene); - ctx.translate(...position.array()); - ctx.scale(...size.div(gridSize).array()); - ctx.lineWidth = 0.06; - for (let y = 0; y < gridSize.y; ++y) { - for (let x = 0; x < gridSize.x; ++x) { - if (scene[y][x] !== 0) { - ctx.fillStyle = "#303030"; - ctx.fillRect(x, y, 1, 1); - } - } - } - ctx.strokeStyle = "#303030"; - for (let x = 0; x <= gridSize.x; ++x) { - drawLine(ctx, new Vector2(x, 0), new Vector2(x, gridSize.y)); - } - for (let y = 0; y <= gridSize.y; ++y) { - drawLine(ctx, new Vector2(0, y), new Vector2(gridSize.x, y)); - } - ctx.fillStyle = "lime"; - drawCircle(ctx, p1, 0.2); - if (p2 !== undefined) { - for (;;) { - ctx.strokeStyle = "lime"; - drawCircle(ctx, p2, 0.2); - drawLine(ctx, p1, p2); - const c = hittingCell(p1, p2); - if (c.x < 0 || - c.x >= gridSize.x || - c.y < 0 || - c.y >= gridSize.y || - scene[c.y][c.x] == 1) { - break; - } - const p3 = rayStep(p1, p2); - p1 = p2; - p2 = p3; - } - } +function snap(x, dx) { + if (dx > 0) + return Math.ceil(x + Math.sign(dx) * EPS); + if (dx < 0) + return Math.floor(x + Math.sign(dx) * EPS); + return x; +} +function hittingCell(p1, p2) { + const d = p2.sub(p1); + return new Vector2(Math.floor(p2.x + Math.sign(d.x) * EPS), Math.floor(p2.y + Math.sign(d.y) * EPS)); } function rayStep(p1, p2) { /* slope equation @@ -146,27 +134,51 @@ function rayStep(p1, p2) { } return p3; } -function snap(x, dx) { - if (dx > 0) - return Math.ceil(x + Math.sign(dx) * EPS); - if (dx < 0) - return Math.floor(x + Math.sign(dx) * EPS); - return x; +function castRay(scene, p1, p2) { + throw new Error("castRay TODO"); } -function hittingCell(p1, p2) { - const d = p2.sub(p1); - return new Vector2(Math.floor(p2.x + Math.sign(d.x) * EPS), Math.floor(p2.y + Math.sign(d.y) * EPS)); +function minimap(ctx, player, position, size, scene) { + ctx.save(); + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + const gridSize = sceneSize(scene); + ctx.translate(...position.array()); + ctx.scale(...size.div(gridSize).array()); + ctx.lineWidth = 0.06; + for (let y = 0; y < gridSize.y; ++y) { + for (let x = 0; x < gridSize.x; ++x) { + if (scene[y][x] !== 0) { + ctx.fillStyle = "#303030"; + ctx.fillRect(x, y, 1, 1); + } + } + } + ctx.strokeStyle = "#303030"; + for (let x = 0; x <= gridSize.x; ++x) { + drawLine(ctx, new Vector2(x, 0), new Vector2(x, gridSize.y)); + } + for (let y = 0; y <= gridSize.y; ++y) { + drawLine(ctx, new Vector2(0, y), new Vector2(gridSize.x, y)); + } + ctx.fillStyle = "lime"; + drawCircle(ctx, player.position, 0.2); + const [p1, p2] = player.fovRange(); + ctx.strokeStyle = "lime"; + drawLine(ctx, p1, p2); + drawLine(ctx, player.position, p1); + drawLine(ctx, player.position, p2); + ctx.restore(); } (() => { let scene = [ - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 0, 0, 0], + [0, 1, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0], ]; const game = document.getElementById("game"); if (game === null) { @@ -179,17 +191,9 @@ function hittingCell(p1, p2) { if (ctx === null) { throw new Error("Not supported!"); } - let p1 = sceneSize(scene).mul(new Vector2(0.98, 0.89)); - let p2; + let player = new Player(sceneSize(scene).mul(new Vector2(0.65, 0.65)), Math.PI * 1.25); let minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); - let cellSize = ctx.canvas.width * 0.03; + let cellSize = ctx.canvas.width * 0.07; let minimapSize = sceneSize(scene).scale(cellSize); - game.addEventListener("mousemove", (event) => { - p2 = new Vector2(event.offsetX, event.offsetY) - .sub(minimapPosition) - .div(minimapSize) - .mul(sceneSize(scene)); - minimap(ctx, p1, p2, minimapPosition, minimapSize, scene); - }); - minimap(ctx, p1, p2, minimapPosition, minimapSize, scene); + minimap(ctx, player, minimapPosition, minimapSize, scene); })(); diff --git a/index.ts b/index.ts index 5dc712d..b4d41ff 100644 --- a/index.ts +++ b/index.ts @@ -1,3 +1,7 @@ +const EPS = 1e-3; +const NEAR_CLIPPING_PLANE = 0.75; +const FOV = Math.PI * 0.5; + class Vector2 { x: number; y: number; @@ -8,25 +12,24 @@ class Vector2 { static zero(): Vector2 { return new Vector2(0, 0); } + static fromAngle(angle: number) { + return new Vector2(Math.cos(angle), Math.sin(angle)); + } add(that: Vector2): Vector2 { return new Vector2(this.x + that.x, this.y + that.y); } sub(that: Vector2): Vector2 { return new Vector2(this.x - that.x, this.y - that.y); } - div(that: Vector2): Vector2 { return new Vector2(this.x / that.x, this.y / that.y); } - mul(that: Vector2): Vector2 { return new Vector2(this.x * that.x, this.y * that.y); } - length(): number { return Math.sqrt(this.x * this.x + this.y * this.y); } - norm(): Vector2 { const l = this.length(); if (l == 0) return new Vector2(0, 0); @@ -35,6 +38,9 @@ class Vector2 { scale(value: number): Vector2 { return new Vector2(this.x * value, this.y * value); } + rot90(): Vector2 { + return new Vector2(-this.y, this.x); + } distanceTo(that: Vector2): number { return that.sub(this).length(); } @@ -43,7 +49,27 @@ class Vector2 { } } -const EPS = 1e-3; +class Player { + position: Vector2; + direction: number; + + constructor(position: Vector2, direction: number) { + this.position = position; + this.direction = direction; + } + + fovRange(): [Vector2, Vector2] { + const l = Math.tan(FOV * 0.5) * NEAR_CLIPPING_PLANE; + const p = this.position.add( + Vector2.fromAngle(this.direction).scale(NEAR_CLIPPING_PLANE) + ); + + const p1 = p.add(p.sub(this.position).rot90().norm().scale(l)); + const p2 = p.sub(p.sub(this.position).rot90().norm().scale(l)); + + return [p1, p2]; + } +} function drawLine(ctx: CanvasRenderingContext2D, p1: Vector2, p2: Vector2) { ctx.beginPath(); @@ -75,70 +101,18 @@ function sceneSize(scene: Scene): Vector2 { return new Vector2(x, y); } -type Scene = Array>; - -function minimap( - ctx: CanvasRenderingContext2D, - p1: Vector2, - p2: Vector2 | undefined, - position: Vector2, - size: Vector2, - scene: Scene -) { - ctx.reset(); - - ctx.fillStyle = "#181818"; - ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); - - const gridSize = sceneSize(scene); - - ctx.translate(...position.array()); - ctx.scale(...size.div(gridSize).array()); - - ctx.lineWidth = 0.06; - - for (let y = 0; y < gridSize.y; ++y) { - for (let x = 0; x < gridSize.x; ++x) { - if (scene[y][x] !== 0) { - ctx.fillStyle = "#303030"; - ctx.fillRect(x, y, 1, 1); - } - } - } - - ctx.strokeStyle = "#303030"; - - for (let x = 0; x <= gridSize.x; ++x) { - drawLine(ctx, new Vector2(x, 0), new Vector2(x, gridSize.y)); - } - for (let y = 0; y <= gridSize.y; ++y) { - drawLine(ctx, new Vector2(0, y), new Vector2(gridSize.x, y)); - } - - ctx.fillStyle = "lime"; - drawCircle(ctx, p1, 0.2); - if (p2 !== undefined) { - for (;;) { - ctx.strokeStyle = "lime"; - drawCircle(ctx, p2, 0.2); - drawLine(ctx, p1, p2); - - const c = hittingCell(p1, p2); - if ( - c.x < 0 || - c.x >= gridSize.x || - c.y < 0 || - c.y >= gridSize.y || - scene[c.y][c.x] == 1 - ) { - break; - } +function snap(x: number, dx: number): number { + if (dx > 0) return Math.ceil(x + Math.sign(dx) * EPS); + if (dx < 0) return Math.floor(x + Math.sign(dx) * EPS); + return x; +} - const p3 = rayStep(p1, p2); - p1 = p2; - p2 = p3; - } - } +function hittingCell(p1: Vector2, p2: Vector2): Vector2 { + const d = p2.sub(p1); + return new Vector2( + Math.floor(p2.x + Math.sign(d.x) * EPS), + Math.floor(p2.y + Math.sign(d.y) * EPS) + ); } function rayStep(p1: Vector2, p2: Vector2): Vector2 { @@ -185,30 +159,72 @@ function rayStep(p1: Vector2, p2: Vector2): Vector2 { return p3; } -function snap(x: number, dx: number): number { - if (dx > 0) return Math.ceil(x + Math.sign(dx) * EPS); - if (dx < 0) return Math.floor(x + Math.sign(dx) * EPS); - return x; +type Scene = Array>; + +function castRay(scene: Scene, p1: Vector2, p2: Vector2): Vector2 { + throw new Error("castRay TODO"); } -function hittingCell(p1: Vector2, p2: Vector2): Vector2 { - const d = p2.sub(p1); - return new Vector2( - Math.floor(p2.x + Math.sign(d.x) * EPS), - Math.floor(p2.y + Math.sign(d.y) * EPS) - ); +function minimap( + ctx: CanvasRenderingContext2D, + player: Player, + position: Vector2, + size: Vector2, + scene: Scene +) { + ctx.save(); + + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + + const gridSize = sceneSize(scene); + + ctx.translate(...position.array()); + ctx.scale(...size.div(gridSize).array()); + + ctx.lineWidth = 0.06; + + for (let y = 0; y < gridSize.y; ++y) { + for (let x = 0; x < gridSize.x; ++x) { + if (scene[y][x] !== 0) { + ctx.fillStyle = "#303030"; + ctx.fillRect(x, y, 1, 1); + } + } + } + + ctx.strokeStyle = "#303030"; + + for (let x = 0; x <= gridSize.x; ++x) { + drawLine(ctx, new Vector2(x, 0), new Vector2(x, gridSize.y)); + } + for (let y = 0; y <= gridSize.y; ++y) { + drawLine(ctx, new Vector2(0, y), new Vector2(gridSize.x, y)); + } + + ctx.fillStyle = "lime"; + drawCircle(ctx, player.position, 0.2); + + const [p1, p2] = player.fovRange(); + + ctx.strokeStyle = "lime"; + drawLine(ctx, p1, p2); + drawLine(ctx, player.position, p1); + drawLine(ctx, player.position, p2); + + ctx.restore(); } (() => { let scene = [ - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 0, 0, 0], + [0, 1, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0], ]; const game = document.getElementById("game") as HTMLCanvasElement | null; if (game === null) { @@ -223,18 +239,14 @@ function hittingCell(p1: Vector2, p2: Vector2): Vector2 { throw new Error("Not supported!"); } - let p1 = sceneSize(scene).mul(new Vector2(0.98, 0.89)); - let p2: Vector2 | undefined; + let player = new Player( + sceneSize(scene).mul(new Vector2(0.65, 0.65)), + Math.PI * 1.25 + ); + let minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); - let cellSize = ctx.canvas.width * 0.03; + let cellSize = ctx.canvas.width * 0.07; let minimapSize = sceneSize(scene).scale(cellSize); - game.addEventListener("mousemove", (event) => { - p2 = new Vector2(event.offsetX, event.offsetY) - .sub(minimapPosition) - .div(minimapSize) - .mul(sceneSize(scene)); - minimap(ctx, p1, p2, minimapPosition, minimapSize, scene); - }); - - minimap(ctx, p1, p2, minimapPosition, minimapSize, scene); + + minimap(ctx, player, minimapPosition, minimapSize, scene); })(); From cf8259ad3c40bd87e2c84e7e6fc6c38dcc41b667 Mon Sep 17 00:00:00 2001 From: Abbas Mahdavi Date: Sat, 20 Jul 2024 00:03:27 -0700 Subject: [PATCH 4/7] Implement basic raycasting to detect walls and render scene strips based on player perspective --- index.js | 53 ++++++++++++++++++++++++++++++++--------- index.ts | 66 +++++++++++++++++++++++++++++++++++++++------------- package.json | 3 ++- 3 files changed, 94 insertions(+), 28 deletions(-) diff --git a/index.js b/index.js index 1e90779..d7520c3 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,7 @@ const EPS = 1e-3; const NEAR_CLIPPING_PLANE = 0.75; const FOV = Math.PI * 0.5; +const SCREEN_WIDTH = 100; class Vector2 { constructor(x, y) { this.x = x; @@ -43,6 +44,9 @@ class Vector2 { distanceTo(that) { return that.sub(this).length(); } + lerp(that, t) { + return that.sub(this).scale(t).add(this); + } array() { return [this.x, this.y]; } @@ -55,8 +59,8 @@ class Player { fovRange() { const l = Math.tan(FOV * 0.5) * NEAR_CLIPPING_PLANE; const p = this.position.add(Vector2.fromAngle(this.direction).scale(NEAR_CLIPPING_PLANE)); - const p1 = p.add(p.sub(this.position).rot90().norm().scale(l)); - const p2 = p.sub(p.sub(this.position).rot90().norm().scale(l)); + const p1 = p.sub(p.sub(this.position).rot90().norm().scale(l)); + const p2 = p.add(p.sub(this.position).rot90().norm().scale(l)); return [p1, p2]; } } @@ -134,16 +138,13 @@ function rayStep(p1, p2) { } return p3; } -function castRay(scene, p1, p2) { - throw new Error("castRay TODO"); -} function minimap(ctx, player, position, size, scene) { ctx.save(); - ctx.fillStyle = "#181818"; - ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); const gridSize = sceneSize(scene); ctx.translate(...position.array()); ctx.scale(...size.div(gridSize).array()); + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ...gridSize.array()); ctx.lineWidth = 0.06; for (let y = 0; y < gridSize.y; ++y) { for (let x = 0; x < gridSize.x; ++x) { @@ -169,6 +170,33 @@ function minimap(ctx, player, position, size, scene) { drawLine(ctx, player.position, p2); ctx.restore(); } +function insideScene(scene, p) { + const size = sceneSize(scene); + return 0 <= p.x && p.x < size.x && 0 <= p.y && p.y < size.y; +} +function castRay(scene, p1, p2) { + for (;;) { + const c = hittingCell(p1, p2); + if (!insideScene(scene, c) || scene[c.y][c.x] !== 0) + break; + const p3 = rayStep(p1, p2); + p1 = p2; + p2 = p3; + } + return p2; +} +function render(ctx, player, scene) { + const [r1, r2] = player.fovRange(); + const stripWidth = ctx.canvas.width / SCREEN_WIDTH; + for (let x = 0; x < SCREEN_WIDTH; ++x) { + const p = castRay(scene, player.position, r1.lerp(r2, x / SCREEN_WIDTH)); + const c = hittingCell(player.position, p); + if (insideScene(scene, c) && scene[c.y][c.x] !== 0) { + ctx.fillStyle = "red"; + ctx.fillRect(x * stripWidth, 0, stripWidth, ctx.canvas.height); + } + } +} (() => { let scene = [ [0, 0, 0, 1, 0, 0, 0, 0, 0], @@ -184,16 +212,19 @@ function minimap(ctx, player, position, size, scene) { if (game === null) { throw new Error("Can't find game canvas!"); } - const factor = 70; + const factor = 80; game.width = 16 * factor; - game.height = 12 * factor; + game.height = 9 * factor; const ctx = game.getContext("2d"); if (ctx === null) { throw new Error("Not supported!"); } - let player = new Player(sceneSize(scene).mul(new Vector2(0.65, 0.65)), Math.PI * 1.25); + let player = new Player(sceneSize(scene).mul(new Vector2(0.65, 0.65)), Math.PI); let minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); - let cellSize = ctx.canvas.width * 0.07; + let cellSize = ctx.canvas.width * 0.025; let minimapSize = sceneSize(scene).scale(cellSize); + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + render(ctx, player, scene); minimap(ctx, player, minimapPosition, minimapSize, scene); })(); diff --git a/index.ts b/index.ts index b4d41ff..215d1a6 100644 --- a/index.ts +++ b/index.ts @@ -1,6 +1,7 @@ const EPS = 1e-3; const NEAR_CLIPPING_PLANE = 0.75; const FOV = Math.PI * 0.5; +const SCREEN_WIDTH = 100; class Vector2 { x: number; @@ -44,6 +45,9 @@ class Vector2 { distanceTo(that: Vector2): number { return that.sub(this).length(); } + lerp(that: Vector2, t: number): Vector2 { + return that.sub(this).scale(t).add(this); + } array(): [number, number] { return [this.x, this.y]; } @@ -64,8 +68,8 @@ class Player { Vector2.fromAngle(this.direction).scale(NEAR_CLIPPING_PLANE) ); - const p1 = p.add(p.sub(this.position).rot90().norm().scale(l)); - const p2 = p.sub(p.sub(this.position).rot90().norm().scale(l)); + const p1 = p.sub(p.sub(this.position).rot90().norm().scale(l)); + const p2 = p.add(p.sub(this.position).rot90().norm().scale(l)); return [p1, p2]; } @@ -159,12 +163,6 @@ function rayStep(p1: Vector2, p2: Vector2): Vector2 { return p3; } -type Scene = Array>; - -function castRay(scene: Scene, p1: Vector2, p2: Vector2): Vector2 { - throw new Error("castRay TODO"); -} - function minimap( ctx: CanvasRenderingContext2D, player: Player, @@ -174,16 +172,15 @@ function minimap( ) { ctx.save(); - ctx.fillStyle = "#181818"; - ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); - const gridSize = sceneSize(scene); ctx.translate(...position.array()); ctx.scale(...size.div(gridSize).array()); - ctx.lineWidth = 0.06; + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ...gridSize.array()); + ctx.lineWidth = 0.06; for (let y = 0; y < gridSize.y; ++y) { for (let x = 0; x < gridSize.x; ++x) { if (scene[y][x] !== 0) { @@ -215,6 +212,39 @@ function minimap( ctx.restore(); } +type Scene = Array>; + +function insideScene(scene: Scene, p: Vector2): boolean { + const size = sceneSize(scene); + return 0 <= p.x && p.x < size.x && 0 <= p.y && p.y < size.y; +} + +function castRay(scene: Scene, p1: Vector2, p2: Vector2): Vector2 { + for (;;) { + const c = hittingCell(p1, p2); + if (!insideScene(scene, c) || scene[c.y][c.x] !== 0) break; + const p3 = rayStep(p1, p2); + p1 = p2; + p2 = p3; + } + + return p2; +} + +function render(ctx: CanvasRenderingContext2D, player: Player, scene: Scene) { + const [r1, r2] = player.fovRange(); + const stripWidth = ctx.canvas.width / SCREEN_WIDTH; + + for (let x = 0; x < SCREEN_WIDTH; ++x) { + const p = castRay(scene, player.position, r1.lerp(r2, x / SCREEN_WIDTH)); + const c = hittingCell(player.position, p); + if (insideScene(scene, c) && scene[c.y][c.x] !== 0) { + ctx.fillStyle = "red"; + ctx.fillRect(x * stripWidth, 0, stripWidth, ctx.canvas.height); + } + } +} + (() => { let scene = [ [0, 0, 0, 1, 0, 0, 0, 0, 0], @@ -230,9 +260,9 @@ function minimap( if (game === null) { throw new Error("Can't find game canvas!"); } - const factor = 70; + const factor = 80; game.width = 16 * factor; - game.height = 12 * factor; + game.height = 9 * factor; const ctx = game.getContext("2d"); if (ctx === null) { @@ -241,12 +271,16 @@ function minimap( let player = new Player( sceneSize(scene).mul(new Vector2(0.65, 0.65)), - Math.PI * 1.25 + Math.PI ); let minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); - let cellSize = ctx.canvas.width * 0.07; + let cellSize = ctx.canvas.width * 0.025; let minimapSize = sceneSize(scene).scale(cellSize); + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + + render(ctx, player, scene); minimap(ctx, player, minimapPosition, minimapSize, scene); })(); diff --git a/package.json b/package.json index fc916c7..32358d6 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "version": "1.0.0", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "watch": "tsc --watch" }, "author": "", "license": "MIT", From aa0f0ec35598e65c23617d0d1042ef6f45471d64 Mon Sep 17 00:00:00 2001 From: Abbas Mahdavi Date: Sat, 20 Jul 2024 01:37:27 -0700 Subject: [PATCH 5/7] Add renderScene function and keyboard controls for player movement --- index.js | 85 ++++++++++++++++++++++++++++++------------- index.ts | 107 ++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 139 insertions(+), 53 deletions(-) diff --git a/index.js b/index.js index d7520c3..76d4322 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,10 @@ "use strict"; const EPS = 1e-3; const NEAR_CLIPPING_PLANE = 0.75; +const FAR_CLIPPING_PLANE = 20.0; const FOV = Math.PI * 0.5; -const SCREEN_WIDTH = 100; +const SCREEN_WIDTH = 200; +const PLAYER_STEP_LEN = 0.5; class Vector2 { constructor(x, y) { this.x = x; @@ -138,7 +140,7 @@ function rayStep(p1, p2) { } return p3; } -function minimap(ctx, player, position, size, scene) { +function renderMinimap(ctx, player, position, size, scene) { ctx.save(); const gridSize = sceneSize(scene); ctx.translate(...position.array()); @@ -185,19 +187,39 @@ function castRay(scene, p1, p2) { } return p2; } -function render(ctx, player, scene) { +function renderScene(ctx, player, scene) { const [r1, r2] = player.fovRange(); - const stripWidth = ctx.canvas.width / SCREEN_WIDTH; + const stripWidth = Math.ceil(ctx.canvas.width / SCREEN_WIDTH); for (let x = 0; x < SCREEN_WIDTH; ++x) { const p = castRay(scene, player.position, r1.lerp(r2, x / SCREEN_WIDTH)); const c = hittingCell(player.position, p); if (insideScene(scene, c) && scene[c.y][c.x] !== 0) { - ctx.fillStyle = "red"; - ctx.fillRect(x * stripWidth, 0, stripWidth, ctx.canvas.height); + const t = 1 - p.sub(player.position).length() / FAR_CLIPPING_PLANE; + const stripHeight = t * ctx.canvas.height; + ctx.fillStyle = `rgba(${255 * t}, 0, 0, 1)`; + ctx.fillRect(x * stripWidth, ctx.canvas.height * 0.5 - stripHeight * 0.5, stripWidth, stripHeight); } } } +function renderGame(ctx, player, scene) { + const minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); + const cellSize = ctx.canvas.width * 0.025; + const minimapSize = sceneSize(scene).scale(cellSize); + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + renderScene(ctx, player, scene); + renderMinimap(ctx, player, minimapPosition, minimapSize, scene); +} (() => { + const game = document.getElementById("game"); + if (game === null) + throw new Error("Can't find game canvas!"); + const factor = 80; + game.width = 16 * factor; + game.height = 9 * factor; + const ctx = game.getContext("2d"); + if (ctx === null) + throw new Error("Not supported!"); let scene = [ [0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0], @@ -208,23 +230,36 @@ function render(ctx, player, scene) { [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], ]; - const game = document.getElementById("game"); - if (game === null) { - throw new Error("Can't find game canvas!"); - } - const factor = 80; - game.width = 16 * factor; - game.height = 9 * factor; - const ctx = game.getContext("2d"); - if (ctx === null) { - throw new Error("Not supported!"); - } - let player = new Player(sceneSize(scene).mul(new Vector2(0.65, 0.65)), Math.PI); - let minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); - let cellSize = ctx.canvas.width * 0.025; - let minimapSize = sceneSize(scene).scale(cellSize); - ctx.fillStyle = "#181818"; - ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); - render(ctx, player, scene); - minimap(ctx, player, minimapPosition, minimapSize, scene); + let player = new Player(sceneSize(scene).mul(new Vector2(0.65, 0.65)), Math.PI * 1.25); + window.addEventListener("keydown", (e) => { + if (!e.repeat) { + switch (e.code) { + case "KeyW": + { + player.position = player.position.add(Vector2.fromAngle(player.direction).scale(PLAYER_STEP_LEN)); + renderGame(ctx, player, scene); + } + break; + case "KeyS": + { + player.position = player.position.sub(Vector2.fromAngle(player.direction).scale(PLAYER_STEP_LEN)); + renderGame(ctx, player, scene); + } + break; + case "KeyD": + { + player.direction += Math.PI * 0.1; + renderGame(ctx, player, scene); + } + break; + case "KeyA": + { + player.direction -= Math.PI * 0.1; + renderGame(ctx, player, scene); + } + break; + } + } + }); + renderGame(ctx, player, scene); })(); diff --git a/index.ts b/index.ts index 215d1a6..a266c1a 100644 --- a/index.ts +++ b/index.ts @@ -1,7 +1,9 @@ const EPS = 1e-3; const NEAR_CLIPPING_PLANE = 0.75; +const FAR_CLIPPING_PLANE = 20.0; const FOV = Math.PI * 0.5; -const SCREEN_WIDTH = 100; +const SCREEN_WIDTH = 200; +const PLAYER_STEP_LEN = 0.5; class Vector2 { x: number; @@ -163,7 +165,7 @@ function rayStep(p1: Vector2, p2: Vector2): Vector2 { return p3; } -function minimap( +function renderMinimap( ctx: CanvasRenderingContext2D, player: Player, position: Vector2, @@ -231,21 +233,56 @@ function castRay(scene: Scene, p1: Vector2, p2: Vector2): Vector2 { return p2; } -function render(ctx: CanvasRenderingContext2D, player: Player, scene: Scene) { +function renderScene( + ctx: CanvasRenderingContext2D, + player: Player, + scene: Scene +) { const [r1, r2] = player.fovRange(); - const stripWidth = ctx.canvas.width / SCREEN_WIDTH; + const stripWidth = Math.ceil(ctx.canvas.width / SCREEN_WIDTH); for (let x = 0; x < SCREEN_WIDTH; ++x) { const p = castRay(scene, player.position, r1.lerp(r2, x / SCREEN_WIDTH)); const c = hittingCell(player.position, p); if (insideScene(scene, c) && scene[c.y][c.x] !== 0) { - ctx.fillStyle = "red"; - ctx.fillRect(x * stripWidth, 0, stripWidth, ctx.canvas.height); + const t = 1 - p.sub(player.position).length() / FAR_CLIPPING_PLANE; + const stripHeight = t * ctx.canvas.height; + ctx.fillStyle = `rgba(${255 * t}, 0, 0, 1)`; + ctx.fillRect( + x * stripWidth, + ctx.canvas.height * 0.5 - stripHeight * 0.5, + stripWidth, + stripHeight + ); } } } +function renderGame( + ctx: CanvasRenderingContext2D, + player: Player, + scene: Scene +) { + const minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); + const cellSize = ctx.canvas.width * 0.025; + const minimapSize = sceneSize(scene).scale(cellSize); + + ctx.fillStyle = "#181818"; + ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + renderScene(ctx, player, scene); + renderMinimap(ctx, player, minimapPosition, minimapSize, scene); +} + (() => { + const game = document.getElementById("game") as HTMLCanvasElement | null; + if (game === null) throw new Error("Can't find game canvas!"); + const factor = 80; + game.width = 16 * factor; + game.height = 9 * factor; + + const ctx = game.getContext("2d"); + if (ctx === null) throw new Error("Not supported!"); + let scene = [ [0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0], @@ -256,31 +293,45 @@ function render(ctx: CanvasRenderingContext2D, player: Player, scene: Scene) { [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], ]; - const game = document.getElementById("game") as HTMLCanvasElement | null; - if (game === null) { - throw new Error("Can't find game canvas!"); - } - const factor = 80; - game.width = 16 * factor; - game.height = 9 * factor; - - const ctx = game.getContext("2d"); - if (ctx === null) { - throw new Error("Not supported!"); - } - let player = new Player( sceneSize(scene).mul(new Vector2(0.65, 0.65)), - Math.PI + Math.PI * 1.25 ); - let minimapPosition = Vector2.zero().add(canvasSize(ctx).scale(0.03)); - let cellSize = ctx.canvas.width * 0.025; - let minimapSize = sceneSize(scene).scale(cellSize); - - ctx.fillStyle = "#181818"; - ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); + window.addEventListener("keydown", (e) => { + if (!e.repeat) { + switch (e.code) { + case "KeyW": + { + player.position = player.position.add( + Vector2.fromAngle(player.direction).scale(PLAYER_STEP_LEN) + ); + renderGame(ctx, player, scene); + } + break; + case "KeyS": + { + player.position = player.position.sub( + Vector2.fromAngle(player.direction).scale(PLAYER_STEP_LEN) + ); + renderGame(ctx, player, scene); + } + break; + case "KeyD": + { + player.direction += Math.PI * 0.1; + renderGame(ctx, player, scene); + } + break; + case "KeyA": + { + player.direction -= Math.PI * 0.1; + renderGame(ctx, player, scene); + } + break; + } + } + }); - render(ctx, player, scene); - minimap(ctx, player, minimapPosition, minimapSize, scene); + renderGame(ctx, player, scene); })(); From f3ebf23b600777fd313088827b8043e1fec5e5e4 Mon Sep 17 00:00:00 2001 From: Abbas Mahdavi Date: Sun, 21 Jul 2024 01:26:51 -0700 Subject: [PATCH 6/7] calculate the perpenducular distance, instead of the Euclidean distance, to get rid of fisheye effect --- README.md | 7 +++++++ index.js | 44 +++++++++++++++++++++++++------------------ index.ts | 56 +++++++++++++++++++++++++++++++------------------------ 3 files changed, 65 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 5aa6ce0..f235fe7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ # RayCastingGame + This project is a basic implementation of a ray casting game using TypeScript and HTML5 Canvas. It features a grid-based environment where rays are cast from a point and interact with obstacles on the grid. + +Guide by Tsoding Daily and Lode's Computer Graphics Tutorial : https://lodev.org/cgtutor/raycasting.html + +#Build Index.js +npm install +npm run build diff --git a/index.js b/index.js index 76d4322..c400719 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,9 @@ "use strict"; -const EPS = 1e-3; +const EPS = 1e-6; const NEAR_CLIPPING_PLANE = 0.75; const FAR_CLIPPING_PLANE = 20.0; const FOV = Math.PI * 0.5; -const SCREEN_WIDTH = 200; +const SCREEN_WIDTH = 300; const PLAYER_STEP_LEN = 0.5; class Vector2 { constructor(x, y) { @@ -49,6 +49,9 @@ class Vector2 { lerp(that, t) { return that.sub(this).scale(t).add(this); } + dot(that) { + return this.x * that.x + this.y * that.y; + } array() { return [this.x, this.y]; } @@ -150,8 +153,9 @@ function renderMinimap(ctx, player, position, size, scene) { ctx.lineWidth = 0.06; for (let y = 0; y < gridSize.y; ++y) { for (let x = 0; x < gridSize.x; ++x) { - if (scene[y][x] !== 0) { - ctx.fillStyle = "#303030"; + const color = scene[y][x]; + if (color !== null) { + ctx.fillStyle = color; ctx.fillRect(x, y, 1, 1); } } @@ -179,7 +183,7 @@ function insideScene(scene, p) { function castRay(scene, p1, p2) { for (;;) { const c = hittingCell(p1, p2); - if (!insideScene(scene, c) || scene[c.y][c.x] !== 0) + if (!insideScene(scene, c) || scene[c.y][c.x] !== null) break; const p3 = rayStep(p1, p2); p1 = p2; @@ -193,11 +197,15 @@ function renderScene(ctx, player, scene) { for (let x = 0; x < SCREEN_WIDTH; ++x) { const p = castRay(scene, player.position, r1.lerp(r2, x / SCREEN_WIDTH)); const c = hittingCell(player.position, p); - if (insideScene(scene, c) && scene[c.y][c.x] !== 0) { - const t = 1 - p.sub(player.position).length() / FAR_CLIPPING_PLANE; - const stripHeight = t * ctx.canvas.height; - ctx.fillStyle = `rgba(${255 * t}, 0, 0, 1)`; - ctx.fillRect(x * stripWidth, ctx.canvas.height * 0.5 - stripHeight * 0.5, stripWidth, stripHeight); + if (insideScene(scene, c)) { + const color = scene[c.y][c.x]; + if (color !== null) { + const v = p.sub(player.position); + const d = Vector2.fromAngle(player.direction); + const stripHeight = ctx.canvas.height / v.dot(d); + ctx.fillStyle = color; + ctx.fillRect(x * stripWidth, ctx.canvas.height * 0.5 - stripHeight * 0.5, stripWidth, stripHeight); + } } } } @@ -221,14 +229,14 @@ function renderGame(ctx, player, scene) { if (ctx === null) throw new Error("Not supported!"); let scene = [ - [0, 0, 0, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0], - [0, 1, 1, 1, 0, 0, 0, 0, 0], - [0, 0, 1, 1, 0, 0, 0, 0, 0], - [0, 1, 1, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0], + [null, null, null, "red", null, null, null, null, null], + [null, null, null, "orange", null, null, null, null, null], + [null, "green", "red", "blue", null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], + [null, "red", "purple", null, null, null, null, null, null], + [null, null, "blue", null, null, null, null, null, null], + [null, null, null, "red", "yellow", null, null, null, null], + [null, null, null, null, "green", null, null, null, null], ]; let player = new Player(sceneSize(scene).mul(new Vector2(0.65, 0.65)), Math.PI * 1.25); window.addEventListener("keydown", (e) => { diff --git a/index.ts b/index.ts index a266c1a..3f91c7e 100644 --- a/index.ts +++ b/index.ts @@ -1,8 +1,8 @@ -const EPS = 1e-3; +const EPS = 1e-6; const NEAR_CLIPPING_PLANE = 0.75; const FAR_CLIPPING_PLANE = 20.0; const FOV = Math.PI * 0.5; -const SCREEN_WIDTH = 200; +const SCREEN_WIDTH = 300; const PLAYER_STEP_LEN = 0.5; class Vector2 { @@ -50,6 +50,9 @@ class Vector2 { lerp(that: Vector2, t: number): Vector2 { return that.sub(this).scale(t).add(this); } + dot(that: Vector2): number { + return this.x * that.x + this.y * that.y; + } array(): [number, number] { return [this.x, this.y]; } @@ -185,8 +188,9 @@ function renderMinimap( ctx.lineWidth = 0.06; for (let y = 0; y < gridSize.y; ++y) { for (let x = 0; x < gridSize.x; ++x) { - if (scene[y][x] !== 0) { - ctx.fillStyle = "#303030"; + const color = scene[y][x]; + if (color !== null) { + ctx.fillStyle = color; ctx.fillRect(x, y, 1, 1); } } @@ -214,7 +218,7 @@ function renderMinimap( ctx.restore(); } -type Scene = Array>; +type Scene = Array>; function insideScene(scene: Scene, p: Vector2): boolean { const size = sceneSize(scene); @@ -224,7 +228,7 @@ function insideScene(scene: Scene, p: Vector2): boolean { function castRay(scene: Scene, p1: Vector2, p2: Vector2): Vector2 { for (;;) { const c = hittingCell(p1, p2); - if (!insideScene(scene, c) || scene[c.y][c.x] !== 0) break; + if (!insideScene(scene, c) || scene[c.y][c.x] !== null) break; const p3 = rayStep(p1, p2); p1 = p2; p2 = p3; @@ -244,16 +248,20 @@ function renderScene( for (let x = 0; x < SCREEN_WIDTH; ++x) { const p = castRay(scene, player.position, r1.lerp(r2, x / SCREEN_WIDTH)); const c = hittingCell(player.position, p); - if (insideScene(scene, c) && scene[c.y][c.x] !== 0) { - const t = 1 - p.sub(player.position).length() / FAR_CLIPPING_PLANE; - const stripHeight = t * ctx.canvas.height; - ctx.fillStyle = `rgba(${255 * t}, 0, 0, 1)`; - ctx.fillRect( - x * stripWidth, - ctx.canvas.height * 0.5 - stripHeight * 0.5, - stripWidth, - stripHeight - ); + if (insideScene(scene, c)) { + const color = scene[c.y][c.x]; + if (color !== null) { + const v = p.sub(player.position); + const d = Vector2.fromAngle(player.direction); + const stripHeight = ctx.canvas.height / v.dot(d); + ctx.fillStyle = color; + ctx.fillRect( + x * stripWidth, + ctx.canvas.height * 0.5 - stripHeight * 0.5, + stripWidth, + stripHeight + ); + } } } } @@ -284,14 +292,14 @@ function renderGame( if (ctx === null) throw new Error("Not supported!"); let scene = [ - [0, 0, 0, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0], - [0, 1, 1, 1, 0, 0, 0, 0, 0], - [0, 0, 1, 1, 0, 0, 0, 0, 0], - [0, 1, 1, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0], + [null, null, null, "red", null, null, null, null, null], + [null, null, null, "orange", null, null, null, null, null], + [null, "green", "red", "blue", null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], + [null, "red", "purple", null, null, null, null, null, null], + [null, null, "blue", null, null, null, null, null, null], + [null, null, null, "red", "yellow", null, null, null, null], + [null, null, null, null, "green", null, null, null, null], ]; let player = new Player( sceneSize(scene).mul(new Vector2(0.65, 0.65)), From 7ef5c6be4224d2a8fcffbb8c34c2b21109350620 Mon Sep 17 00:00:00 2001 From: Abbas Mahdavi Date: Mon, 22 Jul 2024 17:14:11 -0700 Subject: [PATCH 7/7] Squashed commit of the following: commit 9007ea9e061bf5e198b18d08b0266ead39fc6417 Author: Abbas Mahdavi Date: Mon Jul 22 17:03:38 2024 -0700 add wall asset, create server.js to host html on http-server commit 1859bc45d262bb01565c68efd0b1bfa3365811f6 Author: Abbas Mahdavi Date: Mon Jul 22 16:25:23 2024 -0700 improved player movement and rotation controls: - Implemented keyboard controls for player movement (W/S) and rotation (A/D). - Updated game loop to adjust player position and direction based on input. commit 2a669fdf03ce1242ad72d7bb85fb8881e4a84084 Author: Abbas Mahdavi Date: Mon Jul 22 16:22:00 2024 -0700 Add image rendering support in scene rendering: - Updated rendering logic to handle instances of HTMLImageElement in addition to Color. - Added image drawing with proper scaling and positioning based on player view and distance. - Implemented a transparency overlay to blend images with the scene. commit bf2c1d906d8b434a3697ce851d8b8d81c63053cd Author: Abbas Mahdavi Date: Mon Jul 22 15:57:54 2024 -0700 Implement color class commit a1548816ae856cc11999e5416684cc50c467cf35 Author: Abbas Mahdavi Date: Mon Jul 22 15:23:20 2024 -0700 add serve.js to serve the html on a http server commit 05bb5bc5ad97a451af39f6de52953bd7eb6e22f5 Author: Abbas Mahdavi Date: Sun Jul 21 02:06:50 2024 -0700 allow ray to go outside of scene --- assets/images/sad.png | Bin 0 -> 55673 bytes assets/textures/wall.png | Bin 0 -> 184207 bytes index.js | 198 +++++++++++++++++++++++++++------- index.ts | 224 +++++++++++++++++++++++++++++++-------- package.json | 2 +- server.js | 18 ++++ 6 files changed, 353 insertions(+), 89 deletions(-) create mode 100644 assets/images/sad.png create mode 100644 assets/textures/wall.png create mode 100644 server.js diff --git a/assets/images/sad.png b/assets/images/sad.png new file mode 100644 index 0000000000000000000000000000000000000000..12a794f78b85ee9b3243e8e825b4a1901fbcbb2b GIT binary patch literal 55673 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

V& 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 literal 0 HcmV?d00001 diff --git a/index.js b/index.js index c400719..378116f 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,20 @@ "use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; const EPS = 1e-6; -const NEAR_CLIPPING_PLANE = 0.75; -const FAR_CLIPPING_PLANE = 20.0; +const NEAR_CLIPPING_PLANE = 0.25; +const FAR_CLIPPING_PLANE = 10.0; const FOV = Math.PI * 0.5; const SCREEN_WIDTH = 300; const PLAYER_STEP_LEN = 0.5; +const PLAYER_SPEED = 2; class Vector2 { constructor(x, y) { this.x = x; @@ -31,9 +41,12 @@ class Vector2 { length() { return Math.sqrt(this.x * this.x + this.y * this.y); } + sqrLength() { + return this.x * this.x + this.y * this.y; + } norm() { const l = this.length(); - if (l == 0) + if (l === 0) return new Vector2(0, 0); return new Vector2(this.x / l, this.y / l); } @@ -43,8 +56,8 @@ class Vector2 { rot90() { return new Vector2(-this.y, this.x); } - distanceTo(that) { - return that.sub(this).length(); + sqrDistanceTo(that) { + return that.sub(this).sqrLength(); } lerp(that, t) { return that.sub(this).scale(t).add(this); @@ -56,6 +69,42 @@ class Vector2 { return [this.x, this.y]; } } +class Color { + constructor(r, g, b, a) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + static red() { + return new Color(1, 0, 0, 1); + } + static green() { + return new Color(0, 1, 0, 1); + } + static blue() { + return new Color(0, 0, 1, 1); + } + static yellow() { + return new Color(1, 1, 0, 1); + } + static purple() { + return new Color(1, 0, 1, 1); + } + static cyan() { + return new Color(0, 1, 1, 1); + } + brightness(factor) { + return new Color(factor * this.r, factor * this.g, factor * this.b, this.a); + } + toStyle() { + return (`rgba(` + + `${Math.floor(this.r * 255)}, ` + + `${Math.floor(this.g * 255)}, ` + + `${Math.floor(this.b * 255)}, ` + + `${this.a})`); + } +} class Player { constructor(position, direction) { this.position = position; @@ -131,7 +180,7 @@ function rayStep(p1, p2) { const y3 = snap(p2.y, d.y); const x3 = (y3 - c) / m; const p3t = new Vector2(x3, y3); - if (p2.distanceTo(p3t) < p2.distanceTo(p3)) { + if (p2.sqrDistanceTo(p3t) < p2.sqrDistanceTo(p3)) { p3 = p3t; } } @@ -153,11 +202,14 @@ function renderMinimap(ctx, player, position, size, scene) { ctx.lineWidth = 0.06; for (let y = 0; y < gridSize.y; ++y) { for (let x = 0; x < gridSize.x; ++x) { - const color = scene[y][x]; - if (color !== null) { - ctx.fillStyle = color; + const cell = scene[y][x]; + if (cell instanceof Color) { + ctx.fillStyle = cell.toStyle(); ctx.fillRect(x, y, 1, 1); } + else if (cell instanceof HTMLImageElement) { + ctx.drawImage(cell, x, y, 1, 1); + } } } ctx.strokeStyle = "#303030"; @@ -181,9 +233,10 @@ function insideScene(scene, p) { return 0 <= p.x && p.x < size.x && 0 <= p.y && p.y < size.y; } function castRay(scene, p1, p2) { - for (;;) { + let start = p1; + while (start.sqrDistanceTo(p1) < FAR_CLIPPING_PLANE * FAR_CLIPPING_PLANE) { const c = hittingCell(p1, p2); - if (!insideScene(scene, c) || scene[c.y][c.x] !== null) + if (insideScene(scene, c) && scene[c.y][c.x] !== null) break; const p3 = rayStep(p1, p2); p1 = p2; @@ -198,13 +251,29 @@ function renderScene(ctx, player, scene) { const p = castRay(scene, player.position, r1.lerp(r2, x / SCREEN_WIDTH)); const c = hittingCell(player.position, p); if (insideScene(scene, c)) { - const color = scene[c.y][c.x]; - if (color !== null) { + const cell = scene[c.y][c.x]; + if (cell instanceof Color) { + const v = p.sub(player.position); + const d = Vector2.fromAngle(player.direction); + const stripHeight = ctx.canvas.height / v.dot(d); + ctx.fillStyle = cell.brightness(1 / v.dot(d)).toStyle(); + ctx.fillRect(x * stripWidth, (ctx.canvas.height - stripHeight) * 0.5, stripWidth, stripHeight); + } + else if (cell instanceof HTMLImageElement) { const v = p.sub(player.position); const d = Vector2.fromAngle(player.direction); const stripHeight = ctx.canvas.height / v.dot(d); - ctx.fillStyle = color; - ctx.fillRect(x * stripWidth, ctx.canvas.height * 0.5 - stripHeight * 0.5, stripWidth, stripHeight); + let u = 0; + const t = p.sub(c); + if ((Math.abs(t.x) < EPS || Math.abs(t.x - 1) < EPS) && t.y > 0) { + u = t.y; + } + else { + u = t.x; + } + ctx.drawImage(cell, Math.floor(u * cell.width), 0, 1, cell.height, x * stripWidth, (ctx.canvas.height - stripHeight) * 0.5, stripWidth, stripHeight); + ctx.fillStyle = new Color(0, 0, 0, 1 - 1 / v.dot(d)).toStyle(); + ctx.fillRect(x * stripWidth, (ctx.canvas.height - stripHeight * 1.01) * 0.5, stripWidth, stripHeight * 1.01); } } } @@ -218,7 +287,17 @@ function renderGame(ctx, player, scene) { renderScene(ctx, player, scene); renderMinimap(ctx, player, minimapPosition, minimapSize, scene); } -(() => { +function loadImageData(url) { + return __awaiter(this, void 0, void 0, function* () { + const image = new Image(); + image.src = url; + return new Promise((resolve, reject) => { + image.onload = () => resolve(image); + image.onerror = reject; + }); + }); +} +(() => __awaiter(void 0, void 0, void 0, function* () { const game = document.getElementById("game"); if (game === null) throw new Error("Can't find game canvas!"); @@ -228,46 +307,83 @@ function renderGame(ctx, player, scene) { const ctx = game.getContext("2d"); if (ctx === null) throw new Error("Not supported!"); + const face = yield loadImageData("assets/textures/wall.png").catch(() => Color.purple()); let scene = [ - [null, null, null, "red", null, null, null, null, null], - [null, null, null, "orange", null, null, null, null, null], - [null, "green", "red", "blue", null, null, null, null, null], + [null, null, null, face, null, null, null, null, null], + [null, null, null, face, null, null, null, null, null], + [null, face, face, face, null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null], - [null, "red", "purple", null, null, null, null, null, null], - [null, null, "blue", null, null, null, null, null, null], - [null, null, null, "red", "yellow", null, null, null, null], - [null, null, null, null, "green", null, null, null, null], ]; let player = new Player(sceneSize(scene).mul(new Vector2(0.65, 0.65)), Math.PI * 1.25); + let movingForward = false; + let movingBackward = false; + let turningLeft = false; + let turningRight = false; window.addEventListener("keydown", (e) => { if (!e.repeat) { switch (e.code) { case "KeyW": - { - player.position = player.position.add(Vector2.fromAngle(player.direction).scale(PLAYER_STEP_LEN)); - renderGame(ctx, player, scene); - } + movingForward = true; break; case "KeyS": - { - player.position = player.position.sub(Vector2.fromAngle(player.direction).scale(PLAYER_STEP_LEN)); - renderGame(ctx, player, scene); - } + movingBackward = true; + break; + case "KeyA": + turningLeft = true; break; case "KeyD": - { - player.direction += Math.PI * 0.1; - renderGame(ctx, player, scene); - } + turningRight = true; + break; + } + } + }); + window.addEventListener("keyup", (e) => { + if (!e.repeat) { + switch (e.code) { + case "KeyW": + movingForward = false; + break; + case "KeyS": + movingBackward = false; break; case "KeyA": - { - player.direction -= Math.PI * 0.1; - renderGame(ctx, player, scene); - } + turningLeft = false; + break; + case "KeyD": + turningRight = false; break; } } }); - renderGame(ctx, player, scene); -})(); + let prevTimestamp = 0; + const frame = (timestamp) => { + const deltaTime = (timestamp - prevTimestamp) / 1000; + prevTimestamp = timestamp; + let velocity = Vector2.zero(); + let angularVelocity = 0.0; + if (movingForward) { + velocity = velocity.add(Vector2.fromAngle(player.direction).scale(PLAYER_SPEED)); + } + if (movingBackward) { + velocity = velocity.sub(Vector2.fromAngle(player.direction).scale(PLAYER_SPEED)); + } + if (turningLeft) { + angularVelocity -= Math.PI; + } + if (turningRight) { + angularVelocity += Math.PI; + } + player.direction = player.direction + angularVelocity * deltaTime; + player.position = player.position.add(velocity.scale(deltaTime)); + renderGame(ctx, player, scene); + window.requestAnimationFrame(frame); + }; + window.requestAnimationFrame((timestamp) => { + prevTimestamp = timestamp; + window.requestAnimationFrame(frame); + }); +}))(); diff --git a/index.ts b/index.ts index 3f91c7e..f95fbf3 100644 --- a/index.ts +++ b/index.ts @@ -1,9 +1,10 @@ const EPS = 1e-6; -const NEAR_CLIPPING_PLANE = 0.75; -const FAR_CLIPPING_PLANE = 20.0; +const NEAR_CLIPPING_PLANE = 0.25; +const FAR_CLIPPING_PLANE = 10.0; const FOV = Math.PI * 0.5; const SCREEN_WIDTH = 300; const PLAYER_STEP_LEN = 0.5; +const PLAYER_SPEED = 2; class Vector2 { x: number; @@ -15,7 +16,7 @@ class Vector2 { static zero(): Vector2 { return new Vector2(0, 0); } - static fromAngle(angle: number) { + static fromAngle(angle: number): Vector2 { return new Vector2(Math.cos(angle), Math.sin(angle)); } add(that: Vector2): Vector2 { @@ -33,9 +34,12 @@ class Vector2 { length(): number { return Math.sqrt(this.x * this.x + this.y * this.y); } + sqrLength(): number { + return this.x * this.x + this.y * this.y; + } norm(): Vector2 { const l = this.length(); - if (l == 0) return new Vector2(0, 0); + if (l === 0) return new Vector2(0, 0); return new Vector2(this.x / l, this.y / l); } scale(value: number): Vector2 { @@ -44,8 +48,8 @@ class Vector2 { rot90(): Vector2 { return new Vector2(-this.y, this.x); } - distanceTo(that: Vector2): number { - return that.sub(this).length(); + sqrDistanceTo(that: Vector2): number { + return that.sub(this).sqrLength(); } lerp(that: Vector2, t: number): Vector2 { return that.sub(this).scale(t).add(this); @@ -58,6 +62,49 @@ class Vector2 { } } +class Color { + r: number; + g: number; + b: number; + a: number; + constructor(r: number, g: number, b: number, a: number) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + static red(): Color { + return new Color(1, 0, 0, 1); + } + static green(): Color { + return new Color(0, 1, 0, 1); + } + static blue(): Color { + return new Color(0, 0, 1, 1); + } + static yellow(): Color { + return new Color(1, 1, 0, 1); + } + static purple(): Color { + return new Color(1, 0, 1, 1); + } + static cyan(): Color { + return new Color(0, 1, 1, 1); + } + brightness(factor: number): Color { + return new Color(factor * this.r, factor * this.g, factor * this.b, this.a); + } + toStyle(): string { + return ( + `rgba(` + + `${Math.floor(this.r * 255)}, ` + + `${Math.floor(this.g * 255)}, ` + + `${Math.floor(this.b * 255)}, ` + + `${this.a})` + ); + } +} + class Player { position: Vector2; direction: number; @@ -155,7 +202,7 @@ function rayStep(p1: Vector2, p2: Vector2): Vector2 { const y3 = snap(p2.y, d.y); const x3 = (y3 - c) / m; const p3t = new Vector2(x3, y3); - if (p2.distanceTo(p3t) < p2.distanceTo(p3)) { + if (p2.sqrDistanceTo(p3t) < p2.sqrDistanceTo(p3)) { p3 = p3t; } } @@ -188,10 +235,12 @@ function renderMinimap( ctx.lineWidth = 0.06; for (let y = 0; y < gridSize.y; ++y) { for (let x = 0; x < gridSize.x; ++x) { - const color = scene[y][x]; - if (color !== null) { - ctx.fillStyle = color; + const cell = scene[y][x]; + if (cell instanceof Color) { + ctx.fillStyle = cell.toStyle(); ctx.fillRect(x, y, 1, 1); + } else if (cell instanceof HTMLImageElement) { + ctx.drawImage(cell, x, y, 1, 1); } } } @@ -218,7 +267,7 @@ function renderMinimap( ctx.restore(); } -type Scene = Array>; +type Scene = Array>; function insideScene(scene: Scene, p: Vector2): boolean { const size = sceneSize(scene); @@ -226,14 +275,14 @@ function insideScene(scene: Scene, p: Vector2): boolean { } function castRay(scene: Scene, p1: Vector2, p2: Vector2): Vector2 { - for (;;) { + let start = p1; + while (start.sqrDistanceTo(p1) < FAR_CLIPPING_PLANE * FAR_CLIPPING_PLANE) { const c = hittingCell(p1, p2); - if (!insideScene(scene, c) || scene[c.y][c.x] !== null) break; + if (insideScene(scene, c) && scene[c.y][c.x] !== null) break; const p3 = rayStep(p1, p2); p1 = p2; p2 = p3; } - return p2; } @@ -249,18 +298,49 @@ function renderScene( const p = castRay(scene, player.position, r1.lerp(r2, x / SCREEN_WIDTH)); const c = hittingCell(player.position, p); if (insideScene(scene, c)) { - const color = scene[c.y][c.x]; - if (color !== null) { + const cell = scene[c.y][c.x]; + if (cell instanceof Color) { const v = p.sub(player.position); const d = Vector2.fromAngle(player.direction); const stripHeight = ctx.canvas.height / v.dot(d); - ctx.fillStyle = color; + ctx.fillStyle = cell.brightness(1 / v.dot(d)).toStyle(); ctx.fillRect( x * stripWidth, - ctx.canvas.height * 0.5 - stripHeight * 0.5, + (ctx.canvas.height - stripHeight) * 0.5, stripWidth, stripHeight ); + } else if (cell instanceof HTMLImageElement) { + const v = p.sub(player.position); + const d = Vector2.fromAngle(player.direction); + const stripHeight = ctx.canvas.height / v.dot(d); + + let u = 0; + const t = p.sub(c); + if ((Math.abs(t.x) < EPS || Math.abs(t.x - 1) < EPS) && t.y > 0) { + u = t.y; + } else { + u = t.x; + } + + ctx.drawImage( + cell, + Math.floor(u * cell.width), + 0, + 1, + cell.height, + x * stripWidth, + (ctx.canvas.height - stripHeight) * 0.5, + stripWidth, + stripHeight + ); + ctx.fillStyle = new Color(0, 0, 0, 1 - 1 / v.dot(d)).toStyle(); + ctx.fillRect( + x * stripWidth, + (ctx.canvas.height - stripHeight * 1.01) * 0.5, + stripWidth, + stripHeight * 1.01 + ); } } } @@ -281,7 +361,16 @@ function renderGame( renderMinimap(ctx, player, minimapPosition, minimapSize, scene); } -(() => { +async function loadImageData(url: string): Promise { + const image = new Image(); + image.src = url; + return new Promise((resolve, reject) => { + image.onload = () => resolve(image); + image.onerror = reject; + }); +} + +(async () => { const game = document.getElementById("game") as HTMLCanvasElement | null; if (game === null) throw new Error("Can't find game canvas!"); const factor = 80; @@ -291,55 +380,96 @@ function renderGame( const ctx = game.getContext("2d"); if (ctx === null) throw new Error("Not supported!"); + const face = await loadImageData("assets/textures/wall.png").catch(() => + Color.purple() + ); + let scene = [ - [null, null, null, "red", null, null, null, null, null], - [null, null, null, "orange", null, null, null, null, null], - [null, "green", "red", "blue", null, null, null, null, null], + [null, null, null, face, null, null, null, null, null], + [null, null, null, face, null, null, null, null, null], + [null, face, face, face, null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], + [null, null, null, null, null, null, null, null, null], [null, null, null, null, null, null, null, null, null], - [null, "red", "purple", null, null, null, null, null, null], - [null, null, "blue", null, null, null, null, null, null], - [null, null, null, "red", "yellow", null, null, null, null], - [null, null, null, null, "green", null, null, null, null], ]; let player = new Player( sceneSize(scene).mul(new Vector2(0.65, 0.65)), Math.PI * 1.25 ); + let movingForward = false; + let movingBackward = false; + let turningLeft = false; + let turningRight = false; + window.addEventListener("keydown", (e) => { if (!e.repeat) { switch (e.code) { case "KeyW": - { - player.position = player.position.add( - Vector2.fromAngle(player.direction).scale(PLAYER_STEP_LEN) - ); - renderGame(ctx, player, scene); - } + movingForward = true; break; case "KeyS": - { - player.position = player.position.sub( - Vector2.fromAngle(player.direction).scale(PLAYER_STEP_LEN) - ); - renderGame(ctx, player, scene); - } + movingBackward = true; + break; + case "KeyA": + turningLeft = true; break; case "KeyD": - { - player.direction += Math.PI * 0.1; - renderGame(ctx, player, scene); - } + turningRight = true; + break; + } + } + }); + window.addEventListener("keyup", (e) => { + if (!e.repeat) { + switch (e.code) { + case "KeyW": + movingForward = false; + break; + case "KeyS": + movingBackward = false; break; case "KeyA": - { - player.direction -= Math.PI * 0.1; - renderGame(ctx, player, scene); - } + turningLeft = false; + break; + case "KeyD": + turningRight = false; break; } } }); - renderGame(ctx, player, scene); + let prevTimestamp = 0; + const frame = (timestamp: number) => { + const deltaTime = (timestamp - prevTimestamp) / 1000; + prevTimestamp = timestamp; + let velocity = Vector2.zero(); + let angularVelocity = 0.0; + if (movingForward) { + velocity = velocity.add( + Vector2.fromAngle(player.direction).scale(PLAYER_SPEED) + ); + } + if (movingBackward) { + velocity = velocity.sub( + Vector2.fromAngle(player.direction).scale(PLAYER_SPEED) + ); + } + if (turningLeft) { + angularVelocity -= Math.PI; + } + if (turningRight) { + angularVelocity += Math.PI; + } + player.direction = player.direction + angularVelocity * deltaTime; + player.position = player.position.add(velocity.scale(deltaTime)); + renderGame(ctx, player, scene); + window.requestAnimationFrame(frame); + }; + window.requestAnimationFrame((timestamp) => { + prevTimestamp = timestamp; + window.requestAnimationFrame(frame); + }); })(); diff --git a/package.json b/package.json index 32358d6..e9665ce 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "watch": "tsc --watch" + "watch": "node server.js" }, "author": "", "license": "MIT", diff --git a/server.js b/server.js new file mode 100644 index 0000000..72608e5 --- /dev/null +++ b/server.js @@ -0,0 +1,18 @@ +const { spawn } = require("child_process"); + +function cmd(program, args) { + const spawnOptions = { shell: true }; + console.log("CMD:", program, args.flat(), spawnOptions); + const p = spawn(program, args.flat(), spawnOptions); + p.stdout.on("data", (data) => process.stdout.write(data)); + p.stderr.on("data", (data) => process.stderr.write(data)); + p.on("close", (code) => { + if (code !== 0) { + console.error(program, args, "exited with", code); + } + }); + return p; +} + +cmd("tsc", ["-w"]); +cmd("http-server", ["-p", "3000", "-a", "127.0.0.1", "-s", "-c-1"]);