Skip to main content
Home

Lightweight 2D Tile Manipulation Library, useful for map building, maze generation, dungeon crafting etc.

This package works with Node.js, DenoIt is unknown whether this package works with Cloudflare Workers, Bun, Browsers
It is unknown whether this package works with Cloudflare Workers
This package works with Node.js
This package works with Deno
It is unknown whether this package works with Bun
It is unknown whether this package works with Browsers
JSR Score
70%
Published
a year ago (0.2.2)

Readme

tilelib-2d is a quick and dirty collection of utility classes and models I used to make this Auto Tiling Component. Feel free to use it however you'd like, you'll find it most useful though in 2D Tile Based Map contexts.

Contents

The Package is organized in three groups Models, Commands, and Utilities.

Commands

Commands contains the extendable Command base class used to implement the namesake "command" pattern, which is really just a fancy way of making a function call into an object with a generic .execute() call to run, and a generic .undo(), to undo said command. Why use a command? Read this. They're very useful when you want something done on an input, you want to customize the input source regardless of platform, and you want to possibly take it back in the future.

export abstract class Command {
  // ...some fields to store previous state to undo into.
  execute(): void {}
  undo(): void {}
}

There are a few predefined commands concerning setting tile types on a 2d grid, updating their bitmask based on surrounding tile-types, and a bundled command called "draw" which executes these sub-commands on a user interaction with the tile grid.

Models

Models contain essential classes needed for basic 2D tile grids including the generic 2D array Grid class, TileGrid class, Position class, and of course the Tile class.

their interfaces best describe their usage.

interface GridBase<T> {
  /** Gets the object located at the (X,Y) position of the grid.
   * e.g.
   * ```ts
   * TileGrid.get(new Position(0, 0)) => HoleTile(...)
   * ```
   */
  get(p: Position): T | undefined;
  /** Sets the (X,Y) position of the grid to a specified object
   * e.g.
   * ```ts
   * TileGrid.set(new Position(0, 0), new GroundTile(...));
   * TileGrid.get(new Position(0, 0)) => GroundTile(...);
   * ```
   */
  set(p: Position, value: T): void;
  /** The actual grid which is a 2D array of specified generic type */
  grid(): T[][];
  /** The horizontal length of the grid, including empty spots */
  get width(): number;
  /** The horizontal length of the grid, including empty spots */
  get height(): number;
  /**
   * Determines if the provided (X, Y) position is valid and within the grid. Used for boundary detection
   * e.g.
   * ```ts
   * Grid.width() => 3;
   * Grid.height() => 3;
   * Grid.contains(new Position(5, 5)) => false;
   * Grid.contains(new Position(2, 2)) => true;
   * ```
   */
  contains(p: Position): boolean;
}
interface TileBase {
  /**
   * Whether the tile exists on the ground layer or not.
   * A hole or wall tile would have collision set to true,
   * while a ground tile would have collision set to false.
   * Used to determine whether this tile is considered "adjacent"
   * to another tile while calculating the bitmask.
   */
  collision: boolean;

  /**
   * Binary number representing whether the four surrounding tiles are traversable or not.
   */
  bitmask: number;

  /**
   * The type of tile, currently: `Ground`, `Hole`, `Default`
   */
  tileType: Tiles;
}
interface PositionBase {
  /** Horizontal zero-indexed position in a 2D array grid */
  get x(): number;

  /** Vertical zero-indexed position in a 2D array grid */
  get y(): number;

  /** Position located one decreasing y value above the current position e.g.
   * ```ts
   * new Position(1, 1).north => Position(1, 0)
   * ```
   */
  get north(): Position;

  /** Position located one increasing x value to the right of the current position e.g.
   * ```ts
   * new Position(1, 1).east => Position(2, 1)
   * ```
   */
  get east(): Position;

  /** Position located one increasing y value below the current position e.g.
   * ```ts
   * new Position(1, 1).south => Position(1, 2)
   * ```
   */
  get south(): Position;

  /** Position located one decreasing x value to the left of the current position e.g.
   * ```ts
   * new Position(1, 1).north => Position(0, 1)
   * ```
   */
  get west(): Position;

  /**
   * An array of all the positions surrounding the current position. in North -> East -> South -> West order.
   * e.g.
   * ```ts
   * new Position(1, 1).surrounding => [Position(1, 0), Position(2, 1), Position(1, 2), Position(0, 1)]
   * ```
   */
  get surrounding(): Position[];

  /**
   * Adds the x and y values of another position to the current position and returns a new Position,
   * used for distance calculations or movement.
   * @param other Position to compare to
   */
  add(other: Position): Position;

  /**
   * Subtracts the x and y values of another position from the current position and returns a new Position,
   * used for distance calculations or movement.
   * @param other Position to compare to
   */
  subtract(other: Position): Position;

  /**
   * Compares the x and y values of another position to the current position and returns true if both are equal
   * @param other Position to compare to
   */
  equals(other: Position): boolean;
}

Utilities

Contains the clone utility to generically duplicate a copy of an object, the calcBitmask utility to generate a 4-bit binary bitmask indicating what sides a tile has another non-colliding tile next to it, and calculateEventPosition which converts a mouse coordinate to a grid coordinate Position.

New Ticket: Report package

Please provide a reason for reporting this package. We will review your report and take appropriate action.

Please review the JSR usage policy before submitting a report.

Add Package

deno add jsr:@ktc/tilelib-2d

Import symbol

import * as tilelib__d from "@ktc/tilelib-2d";
or

Import directly with a jsr specifier

import * as tilelib__d from "jsr:@ktc/tilelib-2d";

Add Package

pnpm i jsr:@ktc/tilelib-2d
or (using pnpm 10.8 or older)
pnpm dlx jsr add @ktc/tilelib-2d

Import symbol

import * as tilelib__d from "@ktc/tilelib-2d";

Add Package

yarn add jsr:@ktc/tilelib-2d
or (using Yarn 4.8 or older)
yarn dlx jsr add @ktc/tilelib-2d

Import symbol

import * as tilelib__d from "@ktc/tilelib-2d";

Add Package

vlt install jsr:@ktc/tilelib-2d

Import symbol

import * as tilelib__d from "@ktc/tilelib-2d";

Add Package

npx jsr add @ktc/tilelib-2d

Import symbol

import * as tilelib__d from "@ktc/tilelib-2d";

Add Package

bunx jsr add @ktc/tilelib-2d

Import symbol

import * as tilelib__d from "@ktc/tilelib-2d";