UNPKG

tiny-essentials

Version:

Collection of small, essential scripts designed to be used across various projects. These simple utilities are crafted for speed, ease of use, and versatility.

238 lines (165 loc) โ€ข 4.82 kB
# ๐Ÿ“ฆ Collision Detection Module This module provides a complete and flexible system for detecting collisions between rectangles (like DOM elements), extracting direction, depth, and center alignment data. --- ## ๐Ÿ“ Type Definitions ### `Dirs` ```ts 'top' | 'bottom' | 'left' | 'right' ``` ๐Ÿ” A direction relative to a rectangle. Represents one of the four cardinal sides. --- ### `CollDirs` ```ts { in: Dirs | 'center' | null; x: Dirs | null; y: Dirs | null; } ``` ๐Ÿšฆ Represents all directional aspects of a collision: * `in`: Dominant entry direction (`null` if no collision, `'center'` if perfectly aligned). * `x`: Collision bias on X axis. * `y`: Collision bias on Y axis. --- ### `NegCollDirs` ```ts { x: Dirs | null; y: Dirs | null; } ``` โŒ Negative collision flags indicating **gap** instead of overlap. --- ### `CollData` ```ts { top: number; bottom: number; left: number; right: number; } ``` ๐Ÿ“ Collision depth (in pixels) from each side of `rect2` into `rect1`. * Positive values = overlap * Negative values = no collision (gap) --- ### `CollCenter` ```ts { x: number; y: number; } ``` ๐ŸŽฏ Offset from the center of `rect1` to the center of `rect2`. --- ### `ObjRect` ```ts { height: number; width: number; top: number; bottom: number; left: number; right: number; } ``` ๐Ÿ“ฆ Generic rectangle object, similar to `DOMRect`. --- ## ๐Ÿ” Collision Checks ### Loose Collision (Partial Overlap Only) | Function | Description | | -------------------------------- | --------------------------------------- | | `areElsCollTop(rect1, rect2)` | `rect1` is **above** `rect2` | | `areElsCollBottom(rect1, rect2)` | `rect1` is **below** `rect2` | | `areElsCollLeft(rect1, rect2)` | `rect1` is **left of** `rect2` | | `areElsCollRight(rect1, rect2)` | `rect1` is **right of** `rect2` | | `areElsColliding(rect1, rect2)` | Returns `true` if **any side overlaps** | --- ### Perfect Collision (Touch or Overlap) | Function | Description | | ------------------------------------ | -------------------------------------------------- | | `areElsCollPerfTop(rect1, rect2)` | `rect1` is **fully above** or touching `rect2` | | `areElsCollPerfBottom(rect1, rect2)` | `rect1` is **fully below** or touching `rect2` | | `areElsCollPerfLeft(rect1, rect2)` | `rect1` is **fully left** or touching `rect2` | | `areElsCollPerfRight(rect1, rect2)` | `rect1` is **fully right** or touching `rect2` | | `areElsPerfColliding(rect1, rect2)` | Returns `true` if there's **any overlap or touch** | --- ### Collision Direction (Single Side Detection) | Function | Returns | | ----------------------------------- | -------------------------------------------------- | | `getElsColliding(rect1, rect2)` | `'left'`, `'right'`, `'top'`, `'bottom'` or `null` | | `getElsPerfColliding(rect1, rect2)` | Same as above, but includes **touch detection** | --- ## ๐Ÿ”ฌ Overlap & Direction ### `getElsCollOverlap(rect1, rect2)` ๐Ÿ“ Returns the depth of overlap between two rectangles: ```js { overlapLeft, overlapRight, overlapTop, overlapBottom } ``` --- ### `getElsCollOverlapPos({ overlapLeft, overlapRight, overlapTop, overlapBottom })` ๐Ÿ“ Determines which axis and direction has the strongest collision. ```js { dirX: 'left' | 'right', dirY: 'top' | 'bottom' } ``` --- ## ๐ŸŽฏ Center Detection ### `getRectCenter(rect)` Returns the **center X and Y coordinates** of a rectangle. --- ### `getElsRelativeCenterOffset(rect1, rect2)` Returns the distance from `rect1`'s center to `rect2`'s center: ```js { x: number, y: number } ``` โœ… Values are `0` when centers are aligned. --- ## ๐Ÿง  Direction & Depth ### `getElsCollDirDepth(rect1, rect2)` Detects: * Which axis has the dominant collision * Overlap depths ```js { inDir: 'left' | 'right' | 'top' | 'bottom' | null, dirX: 'left' | 'right' | null, dirY: 'top' | 'bottom' | null, depthX: number, depthY: number } ``` --- ### `getElsCollDetails(rect1, rect2)` ๐Ÿ” Full analysis of the collision: * Depth of overlap * Direction of entry * Negative axis gaps * Center hit detection ```js { depth: CollData, dirs: CollDirs, isNeg: NegCollDirs } ``` --- ## ๐Ÿงช Example Use ```js const box = element1.getBoundingClientRect(); const wall = element2.getBoundingClientRect(); const result = getElsCollDetails(box, wall); console.log(result.depth); // { top, bottom, left, right } console.log(result.dirs.in); // e.g. 'left' console.log(result.isNeg); // e.g. { x: 'left', y: null } ```