zx-kit 0.21.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +274 -21
- package/dist/__tests__/collision.test.d.ts +25 -0
- package/dist/__tests__/collision.test.d.ts.map +1 -0
- package/dist/__tests__/collision.test.js +198 -0
- package/dist/__tests__/collision.test.js.map +1 -0
- package/dist/collision.d.ts +82 -0
- package/dist/collision.d.ts.map +1 -1
- package/dist/collision.js +117 -0
- package/dist/collision.js.map +1 -1
- package/dist/renderer.d.ts +21 -0
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +53 -0
- package/dist/renderer.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,10 +27,11 @@ The goal is simple: **it should look and sound like a Spectrum, but run like a m
|
|
|
27
27
|
- **Canvas renderer** — pixel-perfect scaled rendering, sprite flipping, text drawing, CRT scanline overlay, animated border flashing
|
|
28
28
|
- **Tile map engine** — scrollable maps, O(1) id-index, smart seasonal background swapping, solid-tile collision queries
|
|
29
29
|
- **Free-roaming sprites** — position, velocity, gravity, `flipX` caching, transparent or opaque background
|
|
30
|
-
- **
|
|
30
|
+
- **Three-tier collision** — AABB overlap tests, generic rect-vs-tile wall resolution (any sprite size), and pixel-precise mask overlap with O(pixels) sorted-merge intersection — no allocations per frame
|
|
31
31
|
- **Keyboard input** — configurable key-repeat, single-consume action flags, instant state reset on phase transitions
|
|
32
32
|
- **ZX-style UI widgets** — progress bars with managed lifetime, boxes, frames, panel titles
|
|
33
33
|
- **Typed save / load** — persistent saves via `localStorage` with schema versioning, migrations, slot enumeration, in-memory throttling, and discriminated Result types for every failure mode
|
|
34
|
+
- **Runtime locale switching** — type-safe string-pack selection via `pickLocale()`, so a game can switch language while running — unimaginable on the original Spectrum, natural in the browser
|
|
34
35
|
- **Zero dependencies** — only Web platform APIs: `Canvas`, `Web Audio`, `KeyboardEvent`
|
|
35
36
|
- **Tree-shakeable** — `sideEffects: false`, so unused modules are dropped from your production bundle
|
|
36
37
|
- **TypeScript-first** — strict mode, full `.d.ts` declarations, no `any`
|
|
@@ -539,7 +540,7 @@ requestAnimationFrame(loop)
|
|
|
539
540
|
| [`ui.ts`](#uits--ui-widgets) | Boxes, frames, panel titles, progress bars + instrumentation widgets (dotted grids, segmented bars, fluid tanks, dials, text compass) |
|
|
540
541
|
| [`input.ts`](#inputts--keyboard-input) | Movement with key-repeat, action flags, state reset |
|
|
541
542
|
| [`sprite.ts`](#spritets--free-roaming-sprites) | Sprites: position, velocity, gravity, flip, render |
|
|
542
|
-
| [`collision.ts`](#collisionts--
|
|
543
|
+
| [`collision.ts`](#collisionts--collision-detection) | AABB overlap + rect-based tile resolution, pixel-precise mask overlap and tile checks |
|
|
543
544
|
| [`animation.ts`](#animationts--frame-timer--tween) | Frame-timer for sprite strips, position tween between two points |
|
|
544
545
|
| [`camera.ts`](#camerats--scrolling-camera) | Viewport that follows a target with lerp + deadzone, world-bounds clamping |
|
|
545
546
|
| [`scene.ts`](#scenets--scene-manager) | Stack-based scene manager with onEnter/onExit/onPause/onResume hooks |
|
|
@@ -547,6 +548,7 @@ requestAnimationFrame(loop)
|
|
|
547
548
|
| [`tilemap.ts`](#tilemapts--tile-map-engine) | Scrollable maps, solid tiles, O(1) id-index, background swap |
|
|
548
549
|
| [`palette.ts`](#palettets--color-constants) | 15 Spectrum colors, `SpectrumColor` type, `CELL`, `SCALE` |
|
|
549
550
|
| [`font.ts`](#fontts--rom-bitmap-font) | 96-character ROM font, raw bitmap access |
|
|
551
|
+
| [`i18n.ts`](#i18nts--runtime-locale-selection) | Type-safe runtime locale selection for translated string packs |
|
|
550
552
|
|
|
551
553
|
---
|
|
552
554
|
|
|
@@ -902,6 +904,36 @@ curveDisplay(ctx) // default strength
|
|
|
902
904
|
curveDisplay(ctx, 256, 208, 6) // stronger warp
|
|
903
905
|
```
|
|
904
906
|
|
|
907
|
+
### `createBitmapFromRows(rows): Bitmap`
|
|
908
|
+
|
|
909
|
+
Builds an arbitrary-size `Bitmap` from readable pixel-art rows instead of
|
|
910
|
+
hand-packed bytes. This is useful for sprites larger than 8x8 where hex arrays
|
|
911
|
+
become hard to review.
|
|
912
|
+
|
|
913
|
+
- `X` or `#` = solid pixel
|
|
914
|
+
- `.` or space = transparent pixel
|
|
915
|
+
- every row must have the same width
|
|
916
|
+
- width must be a positive multiple of 8
|
|
917
|
+
|
|
918
|
+
```ts
|
|
919
|
+
const TRUCK = createBitmapFromRows([
|
|
920
|
+
'....XXXXXXXX....',
|
|
921
|
+
'..XXXXXXXXXXXX..',
|
|
922
|
+
'.XXXX......XXXX.',
|
|
923
|
+
'XXXXXXXXXXXXXXXX',
|
|
924
|
+
'XX..XXXXXXXX..XX',
|
|
925
|
+
'XX............XX',
|
|
926
|
+
'..XXX......XXX..',
|
|
927
|
+
'................',
|
|
928
|
+
])
|
|
929
|
+
|
|
930
|
+
drawBitmap(ctx, TRUCK, x, y, C.B_WHITE)
|
|
931
|
+
```
|
|
932
|
+
|
|
933
|
+
The returned object is the same `Bitmap` shape produced by `createBitmap()`, so
|
|
934
|
+
it works with `drawBitmap`, `drawBitmapAttrs`, `mirrorBitmap`, and collision
|
|
935
|
+
helpers such as `bitmapPixelMask`.
|
|
936
|
+
|
|
905
937
|
---
|
|
906
938
|
|
|
907
939
|
## `audio.ts` — Beeper Audio
|
|
@@ -1412,9 +1444,17 @@ renderSprite(ctx, player)
|
|
|
1412
1444
|
|
|
1413
1445
|
---
|
|
1414
1446
|
|
|
1415
|
-
## `collision.ts` —
|
|
1447
|
+
## `collision.ts` — Collision Detection
|
|
1448
|
+
|
|
1449
|
+
Three tiers of collision detection, from broad-phase to pixel-precise:
|
|
1450
|
+
|
|
1451
|
+
| Tier | Functions | Use case |
|
|
1452
|
+
|------|-----------|----------|
|
|
1453
|
+
| **AABB** | `rectsOverlap`, `spritesOverlap`, `spriteRect`, `bitmapRect` | Fast broad-phase hit tests |
|
|
1454
|
+
| **Rect-vs-tile** | `isSolidAt`, `resolveRectX`, `resolveRectY`, `resolveX`, `resolveY` | Wall resolution for any sprite size |
|
|
1455
|
+
| **Pixel-precise** | `bitmapPixelMask`, `masksOverlap`, `pixelSolidCount` | Exact opaque-pixel overlap tests |
|
|
1416
1456
|
|
|
1417
|
-
|
|
1457
|
+
Pick the tier that matches your accuracy need. AABB is O(1) and correct for most cases. Pixel-precise costs O(opaque pixels) but eliminates false positives for non-rectangular sprites.
|
|
1418
1458
|
|
|
1419
1459
|
### `Rect` interface
|
|
1420
1460
|
|
|
@@ -1422,19 +1462,36 @@ Axis-aligned bounding box overlap tests and sprite-vs-tile-map wall resolution.
|
|
|
1422
1462
|
interface Rect { x: number; y: number; w: number; h: number }
|
|
1423
1463
|
```
|
|
1424
1464
|
|
|
1425
|
-
|
|
1465
|
+
An axis-aligned bounding rectangle in game pixels.
|
|
1466
|
+
|
|
1467
|
+
---
|
|
1468
|
+
|
|
1469
|
+
### AABB overlap tests
|
|
1470
|
+
|
|
1471
|
+
#### `spriteRect(sprite): Rect`
|
|
1426
1472
|
|
|
1427
1473
|
Returns the `CELL × CELL` bounding box of a sprite at its current position.
|
|
1428
1474
|
|
|
1429
|
-
|
|
1475
|
+
#### `bitmapRect(bitmap, x, y): Rect`
|
|
1430
1476
|
|
|
1431
|
-
Returns `
|
|
1477
|
+
Returns the bounding box for any `Bitmap` at `(x, y)`. Correct for bitmaps of any size — 16×24, 32×32, 96×128 — not just `CELL × CELL`.
|
|
1478
|
+
|
|
1479
|
+
```ts
|
|
1480
|
+
const heroRect = bitmapRect(HERO_BMP, hero.x, hero.y)
|
|
1481
|
+
const enemyRect = bitmapRect(ENEMY_BMP, enemy.x, enemy.y)
|
|
1482
|
+
if (rectsOverlap(heroRect, enemyRect)) damage(hero)
|
|
1483
|
+
```
|
|
1484
|
+
|
|
1485
|
+
#### `rectsOverlap(a, b): boolean`
|
|
1486
|
+
|
|
1487
|
+
Returns `true` when two rectangles share at least one pixel. Touching edges (zero-area overlap) return `false`.
|
|
1432
1488
|
|
|
1433
1489
|
```ts
|
|
1434
1490
|
rectsOverlap(spriteRect(bullet), spriteRect(enemy)) // hit test
|
|
1491
|
+
rectsOverlap(bitmapRect(HERO_BMP, hx, hy), bitmapRect(SWORD_BMP, sx, sy))
|
|
1435
1492
|
```
|
|
1436
1493
|
|
|
1437
|
-
|
|
1494
|
+
#### `spritesOverlap(a, b): boolean`
|
|
1438
1495
|
|
|
1439
1496
|
Shorthand: `rectsOverlap(spriteRect(a), spriteRect(b))`.
|
|
1440
1497
|
|
|
@@ -1443,13 +1500,46 @@ if (spritesOverlap(player, coin)) collectCoin()
|
|
|
1443
1500
|
if (enemies.some(e => spritesOverlap(player, e))) loseLife()
|
|
1444
1501
|
```
|
|
1445
1502
|
|
|
1446
|
-
|
|
1503
|
+
---
|
|
1504
|
+
|
|
1505
|
+
### Rect-vs-tile resolution
|
|
1506
|
+
|
|
1507
|
+
#### `isSolidAt(map, px, py): boolean`
|
|
1508
|
+
|
|
1509
|
+
Tests whether the game-pixel `(px, py)` falls inside a solid tile. Out-of-bounds pixels return `true` (implicit solid boundary). Converts to tile coords via `Math.floor(px / CELL)`.
|
|
1510
|
+
|
|
1511
|
+
```ts
|
|
1512
|
+
if (isSolidAt(map, player.x, player.y + CELL)) { player.vy = 0 } // on floor
|
|
1513
|
+
```
|
|
1514
|
+
|
|
1515
|
+
#### `resolveRectX(rect, map, newX): { x, hitLeft, hitRight }`
|
|
1516
|
+
|
|
1517
|
+
Generic horizontal resolver for any axis-aligned rectangle. Checks every tile row the rectangle spans — so a 16×24 hero correctly detects walls in the middle rows, not just the top and bottom corners.
|
|
1518
|
+
|
|
1519
|
+
Returns the clamped x and collision flags. On collision, the rectangle is placed flush against the wall.
|
|
1520
|
+
|
|
1521
|
+
```ts
|
|
1522
|
+
const rect = bitmapRect(HERO_BMP, hero.x, hero.y)
|
|
1523
|
+
const r = resolveRectX(rect, map, hero.x + dx)
|
|
1524
|
+
hero.x = r.x
|
|
1525
|
+
if (r.hitLeft || r.hitRight) hero.vx = 0
|
|
1526
|
+
```
|
|
1527
|
+
|
|
1528
|
+
#### `resolveRectY(rect, map, newY): { y, hitTop, hitBottom }`
|
|
1447
1529
|
|
|
1448
|
-
|
|
1530
|
+
Generic vertical resolver for any axis-aligned rectangle. Checks every tile column the rectangle spans — so a wide wagon detects the floor across its full footprint.
|
|
1449
1531
|
|
|
1450
|
-
|
|
1532
|
+
```ts
|
|
1533
|
+
const rect = bitmapRect(HERO_BMP, hero.x, hero.y)
|
|
1534
|
+
const r = resolveRectY(rect, map, hero.y + dy)
|
|
1535
|
+
hero.y = r.y
|
|
1536
|
+
if (r.hitBottom) { hero.vy = 0; onGround = true }
|
|
1537
|
+
if (r.hitTop) { hero.vy = 0 }
|
|
1538
|
+
```
|
|
1451
1539
|
|
|
1452
|
-
|
|
1540
|
+
#### `resolveX(sprite, map, newX): { x, hitLeft, hitRight }`
|
|
1541
|
+
|
|
1542
|
+
Resolves a proposed horizontal move for an 8×8 sprite. Thin wrapper over `resolveRectX` — preserved for the common CELL-sized sprite case.
|
|
1453
1543
|
|
|
1454
1544
|
```ts
|
|
1455
1545
|
const { x, hitLeft, hitRight } = resolveX(player, map, player.x)
|
|
@@ -1457,9 +1547,9 @@ player.x = x
|
|
|
1457
1547
|
if (hitLeft || hitRight) player.vx = 0
|
|
1458
1548
|
```
|
|
1459
1549
|
|
|
1460
|
-
|
|
1550
|
+
#### `resolveY(sprite, map, newY): { y, hitTop, hitBottom }`
|
|
1461
1551
|
|
|
1462
|
-
Resolves a proposed vertical move
|
|
1552
|
+
Resolves a proposed vertical move for an 8×8 sprite. Thin wrapper over `resolveRectY`.
|
|
1463
1553
|
|
|
1464
1554
|
- `hitBottom` — landed on a floor (use for jump ground detection)
|
|
1465
1555
|
- `hitTop` — bumped a ceiling
|
|
@@ -1473,6 +1563,116 @@ if (hitTop) { player.vy = 0 }
|
|
|
1473
1563
|
|
|
1474
1564
|
---
|
|
1475
1565
|
|
|
1566
|
+
### Pixel-precise collision
|
|
1567
|
+
|
|
1568
|
+
AABB and rect-vs-tile use the full bounding box. This is almost always correct — but it fails for non-rectangular sprites in edge cases: a circular character standing on a ledge, a diamond-shaped projectile grazing a corner, a tall hero with narrow feet that shouldn't trigger floor detection when hanging over a gap.
|
|
1569
|
+
|
|
1570
|
+
Pixel-precise collision solves this by working with the actual opaque pixels of a bitmap, not its enclosing rectangle.
|
|
1571
|
+
|
|
1572
|
+
```
|
|
1573
|
+
AABB (16px wide): ████████████████ → fires when any part of the box overlaps
|
|
1574
|
+
a tile, even if the sprite itself clears it
|
|
1575
|
+
pixelSolidCount: ···██····██···· → only the real foot pixels are checked —
|
|
1576
|
+
Dizzy hanging over a platform edge doesn't
|
|
1577
|
+
feel magically glued to empty air
|
|
1578
|
+
```
|
|
1579
|
+
|
|
1580
|
+
#### `PixelMask` interface
|
|
1581
|
+
|
|
1582
|
+
```ts
|
|
1583
|
+
interface PixelMask {
|
|
1584
|
+
readonly width: number
|
|
1585
|
+
readonly height: number
|
|
1586
|
+
readonly rows: readonly (readonly number[])[] // per-row sorted opaque column indices
|
|
1587
|
+
readonly totalPixels: number
|
|
1588
|
+
}
|
|
1589
|
+
```
|
|
1590
|
+
|
|
1591
|
+
Pre-computed per-row opaque pixel data for a `Bitmap`. Build once with `bitmapPixelMask`; reuse every frame. Each `rows[r]` is a sorted array of column indices where that row has a set bit. Empty rows have zero-length arrays — never `undefined`.
|
|
1592
|
+
|
|
1593
|
+
```
|
|
1594
|
+
// Example: 16×16 circular sprite
|
|
1595
|
+
mask.rows[0] → [6, 7, 8, 9] // narrow top
|
|
1596
|
+
mask.rows[7] → [0, 1, 2, ..., 15] // full-width middle
|
|
1597
|
+
mask.rows[11] → [3, 4, 10, 11] // only feet
|
|
1598
|
+
mask.rows[14] → [] // below feet, empty
|
|
1599
|
+
```
|
|
1600
|
+
|
|
1601
|
+
The immutability guarantee matters: the mask is derived from immutable `Bitmap` data. Pre-compute once and store alongside the bitmap definition.
|
|
1602
|
+
|
|
1603
|
+
#### `bitmapPixelMask(bitmap): PixelMask`
|
|
1604
|
+
|
|
1605
|
+
Extracts a pixel mask from a `Bitmap`. Reads each row's bit data (bit 7 = leftmost pixel) and collects column indices of set (opaque) pixels into sorted arrays. Counts `totalPixels` for overlap severity calculations.
|
|
1606
|
+
|
|
1607
|
+
```ts
|
|
1608
|
+
// Pre-compute at module load time — not inside the game loop
|
|
1609
|
+
const HERO_MASK = bitmapPixelMask(HERO_BMP)
|
|
1610
|
+
const ENEMY_MASK = bitmapPixelMask(ENEMY_BMP)
|
|
1611
|
+
const BULLET_MASK = bitmapPixelMask(BULLET_BMP)
|
|
1612
|
+
```
|
|
1613
|
+
|
|
1614
|
+
**Bitmap width must be a multiple of 8.** Bitmaps with width `w` require `w * height / 8` bytes of data — standard `createBitmap` enforces this.
|
|
1615
|
+
|
|
1616
|
+
#### `masksOverlap(a, ax, ay, b, bx, by): number`
|
|
1617
|
+
|
|
1618
|
+
Counts opaque pixels of mask `a` at `(ax, ay)` that overlap with opaque pixels of mask `b` at `(bx, by)`.
|
|
1619
|
+
|
|
1620
|
+
Returns **0** when there is no pixel-level overlap. Any value **> 0** is a pixel-perfect collision. The count itself carries semantic meaning: use it for overlap severity — damage scaling, knock-back strength, or as a threshold to ignore grazing touches.
|
|
1621
|
+
|
|
1622
|
+
Uses sorted-merge intersection per row: O(opaque pixels), no allocations per call. Safe to call every frame for multiple pairs.
|
|
1623
|
+
|
|
1624
|
+
```ts
|
|
1625
|
+
// Simple hit test
|
|
1626
|
+
if (masksOverlap(BULLET_MASK, bullet.x, bullet.y, ENEMY_MASK, enemy.x, enemy.y) > 0) {
|
|
1627
|
+
destroyEnemy()
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
// Severity — require a real overlap, not just a 1-pixel graze
|
|
1631
|
+
const overlap = masksOverlap(SWORD_MASK, sx, sy, HERO_MASK, hx, hy)
|
|
1632
|
+
if (overlap >= 3) {
|
|
1633
|
+
takeDamage(Math.round(overlap / SWORD_MASK.totalPixels * 10))
|
|
1634
|
+
}
|
|
1635
|
+
```
|
|
1636
|
+
|
|
1637
|
+
Masks of different sizes work without any special handling — the overlap window is clipped to the intersection region automatically.
|
|
1638
|
+
|
|
1639
|
+
#### `pixelSolidCount(mask, mx, my, map): number`
|
|
1640
|
+
|
|
1641
|
+
Counts opaque pixels of a mask at `(mx, my)` that sit on solid tiles in a `TileMap`. Pixel-precise replacement for AABB-based ground / wall checks.
|
|
1642
|
+
|
|
1643
|
+
Solves the "character standing on a platform edge" problem: a round sprite with narrow feet can hang over the edge — only the real foot pixels are checked against the tile map, not the full bounding box.
|
|
1644
|
+
|
|
1645
|
+
```ts
|
|
1646
|
+
const HERO_MASK = bitmapPixelMask(HERO_BMP)
|
|
1647
|
+
|
|
1648
|
+
// Check if standing — test 1 px below current foot position
|
|
1649
|
+
const standing = pixelSolidCount(HERO_MASK, hero.x, hero.y + 1, map) > 0
|
|
1650
|
+
|
|
1651
|
+
// Check wall to the right — test 1 px past right edge
|
|
1652
|
+
const wallRight = pixelSolidCount(HERO_MASK, hero.x + 1, hero.y, map) > 0
|
|
1653
|
+
|
|
1654
|
+
// How many foot pixels are actually on solid ground? Use as grip factor
|
|
1655
|
+
const groundContact = pixelSolidCount(HERO_MASK, hero.x, hero.y + 1, map)
|
|
1656
|
+
```
|
|
1657
|
+
|
|
1658
|
+
When `groundContact` is 0, a circle-shaped hero hanging over a tile edge won't trigger `hitBottom` in `resolveRectY` — the pixel-check and AABB-check intentionally disagree, and you pick which one to trust for each gameplay mechanic.
|
|
1659
|
+
|
|
1660
|
+
---
|
|
1661
|
+
|
|
1662
|
+
### Choosing the right tier
|
|
1663
|
+
|
|
1664
|
+
| Situation | Recommended tier |
|
|
1665
|
+
|-----------|-----------------|
|
|
1666
|
+
| Player touches any part of a coin | `spritesOverlap` — AABB is exact when both sprites are `CELL × CELL` |
|
|
1667
|
+
| Large hero (16×24) walks into a wall | `resolveRectX` / `resolveRectY` — checks all tile rows the sprite spans |
|
|
1668
|
+
| Round sprite on a platform edge | `pixelSolidCount` — only real foot pixels count |
|
|
1669
|
+
| Bullet vs. irregular boss sprite | `masksOverlap` — pixel-precise, returns overlap count for damage |
|
|
1670
|
+
| Off-road detection for a truck with a bumpy silhouette | `pixelSolidCount` / custom mask loop — checks each opaque pixel against road boundary |
|
|
1671
|
+
|
|
1672
|
+
For a step-by-step walkthrough of both tiers — including how to combine AABB and pixel-precise in one loop and how to handle non-tile boundaries — see **[docs/collision.md](docs/collision.md)**.
|
|
1673
|
+
|
|
1674
|
+
---
|
|
1675
|
+
|
|
1476
1676
|
## `animation.ts` — Frame Timer & Tween
|
|
1477
1677
|
|
|
1478
1678
|
Two small primitives for time-based animation:
|
|
@@ -2026,6 +2226,57 @@ for (let row = 0; row < 8; row++) {
|
|
|
2026
2226
|
|
|
2027
2227
|
---
|
|
2028
2228
|
|
|
2229
|
+
## `i18n.ts` — Runtime Locale Selection
|
|
2230
|
+
|
|
2231
|
+
A tiny helper for choosing a translated string pack at runtime. The original ZX Spectrum could not realistically swap whole languages while a game was running; zx-kit keeps the Spectrum presentation, but lets browser games offer modern language switching without a framework or dependency.
|
|
2232
|
+
|
|
2233
|
+
### `pickLocale(defaultLocale, locales, code): T`
|
|
2234
|
+
|
|
2235
|
+
Selects a locale object by language code and falls back to the default locale when the code is missing, empty, or unknown. Matching is case-insensitive.
|
|
2236
|
+
|
|
2237
|
+
```ts
|
|
2238
|
+
import { pickLocale } from 'zx-kit'
|
|
2239
|
+
import * as en from './strings'
|
|
2240
|
+
import * as sk from './strings.sk'
|
|
2241
|
+
import * as ru from './strings.ru'
|
|
2242
|
+
|
|
2243
|
+
let languageCode = localStorage.getItem('language') // e.g. 'sk'
|
|
2244
|
+
let L = pickLocale(en, { sk, ru }, languageCode)
|
|
2245
|
+
|
|
2246
|
+
drawText(ctx, L.STR_PRESS_START, 32, 88, C.B_WHITE, C.BLACK)
|
|
2247
|
+
|
|
2248
|
+
function setLanguage(code: string): void {
|
|
2249
|
+
languageCode = code
|
|
2250
|
+
localStorage.setItem('language', code)
|
|
2251
|
+
L = pickLocale(en, { sk, ru }, languageCode)
|
|
2252
|
+
}
|
|
2253
|
+
```
|
|
2254
|
+
|
|
2255
|
+
Every locale must have the same shape as the default locale. Because `pickLocale` is generic over that shape, missing keys and wrong function signatures are caught by TypeScript:
|
|
2256
|
+
|
|
2257
|
+
```ts
|
|
2258
|
+
// strings.ts
|
|
2259
|
+
export const STR_PRESS_START = 'PRESS START'
|
|
2260
|
+
export const STR_DEPTH = (m: number) => `D:${m}M`
|
|
2261
|
+
|
|
2262
|
+
// strings.sk.ts
|
|
2263
|
+
export const STR_PRESS_START = 'STLAC START'
|
|
2264
|
+
export const STR_DEPTH = (m: number) => `H:${m}M`
|
|
2265
|
+
```
|
|
2266
|
+
|
|
2267
|
+
Selection rules:
|
|
2268
|
+
|
|
2269
|
+
| Code | Result |
|
|
2270
|
+
|------|--------|
|
|
2271
|
+
| `null`, `undefined`, `''` | `defaultLocale` |
|
|
2272
|
+
| `'sk'`, `'SK'`, `'Sk'` | `locales.sk` |
|
|
2273
|
+
| unknown code | `defaultLocale` |
|
|
2274
|
+
| `'en'` when `en` is not in `locales` | `defaultLocale` |
|
|
2275
|
+
|
|
2276
|
+
The default language does not need its own `strings.en.ts` file. Keep the source language at `strings.ts`, put only additional translations in the locale map, and call `pickLocale` again whenever the player changes language.
|
|
2277
|
+
|
|
2278
|
+
---
|
|
2279
|
+
|
|
2029
2280
|
## Architecture
|
|
2030
2281
|
|
|
2031
2282
|
### Module structure
|
|
@@ -2039,9 +2290,8 @@ zx-kit/
|
|
|
2039
2290
|
│ ├── index.ts # barrel — re-exports everything
|
|
2040
2291
|
│ ├── palette.ts # SCALE, CELL, C, SpectrumColor
|
|
2041
2292
|
│ ├── font.ts # FONT, getCharRow
|
|
2042
|
-
│ ├── renderer.ts #
|
|
2043
|
-
│ │ #
|
|
2044
|
-
│ │ # drawScanlines, curveDisplay
|
|
2293
|
+
│ ├── renderer.ts # canvas setup, 8×8 sprites, arbitrary-size Bitmap,
|
|
2294
|
+
│ │ # AttrMap colour attributes, text, scanlines, border flash
|
|
2045
2295
|
│ ├── audio.ts # initAudio, resumeAudio, beep, playPattern,
|
|
2046
2296
|
│ │ # getAudioContext, getMasterGain,
|
|
2047
2297
|
│ │ # getMasterVolume, setMasterVolume,
|
|
@@ -2052,13 +2302,16 @@ zx-kit/
|
|
|
2052
2302
|
│ │ # consumePause, consumeDebug, consumeAnyKey,
|
|
2053
2303
|
│ │ # isHeld, resetInput, Direction
|
|
2054
2304
|
│ ├── ui.ts # drawBox, drawFrame, drawPanelTitle,
|
|
2055
|
-
│ │ #
|
|
2056
|
-
│ │ # BorderOptions, DrawProgressBarOptions
|
|
2305
|
+
│ │ # instrumentation widgets, progress bars
|
|
2057
2306
|
│ ├── tilemap.ts # createTileMap, Tile, Viewport, TileMap
|
|
2058
2307
|
│ ├── sprite.ts # createSprite, moveSprite, applyGravity,
|
|
2059
2308
|
│ │ # renderSprite, Sprite
|
|
2060
|
-
│
|
|
2061
|
-
│
|
|
2309
|
+
│ ├── collision.ts # AABB, rect-vs-tile, pixel-precise masks
|
|
2310
|
+
│ ├── animation.ts # frame timers, tweens, blinkers
|
|
2311
|
+
│ ├── camera.ts # scrolling viewport, lerp, deadzone, bounds
|
|
2312
|
+
│ ├── scene.ts # stack-based scene manager
|
|
2313
|
+
│ ├── save.ts # typed localStorage save/load with migrations
|
|
2314
|
+
│ └── i18n.ts # pickLocale runtime locale selection
|
|
2062
2315
|
└── dist/ # compiled output (npm run build)
|
|
2063
2316
|
├── index.js
|
|
2064
2317
|
├── index.d.ts
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pixel-perfect collision — visual ground truth test.
|
|
3
|
+
*
|
|
4
|
+
* Two bitmaps: 8×8 px each, but only a 2×2 px region is lit
|
|
5
|
+
* (rows 0–1, cols 0–1). The effective sprite shape is 2×2 — a size that
|
|
6
|
+
* is intentionally NOT a multiple of the ZX tile size (8 px).
|
|
7
|
+
*
|
|
8
|
+
* col: 01234567
|
|
9
|
+
* row 0: ██...... (0xC0)
|
|
10
|
+
* row 1: ██...... (0xC0)
|
|
11
|
+
* rows 2–7: empty
|
|
12
|
+
*
|
|
13
|
+
* Ground truth: a brute-force Set-of-pixel-coords intersection.
|
|
14
|
+
* Both sprites are projected to absolute (x,y) coordinates, all lit pixels
|
|
15
|
+
* are collected into a flat Set, and any shared coordinate counts as overlap.
|
|
16
|
+
* No formulas, no assumptions — just "which pixels are painted and do any
|
|
17
|
+
* coordinates match?"
|
|
18
|
+
*
|
|
19
|
+
* Every assertion compares masksOverlap against this ground truth, sweeping
|
|
20
|
+
* sprite B toward sprite A one pixel at a time in all four directions and
|
|
21
|
+
* diagonally. A separate block shows that AABB (8×8 bounding-box) fires
|
|
22
|
+
* 6 pixels earlier than pixel-perfect — the gap the ground truth exposes.
|
|
23
|
+
*/
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=collision.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collision.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/collision.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pixel-perfect collision — visual ground truth test.
|
|
3
|
+
*
|
|
4
|
+
* Two bitmaps: 8×8 px each, but only a 2×2 px region is lit
|
|
5
|
+
* (rows 0–1, cols 0–1). The effective sprite shape is 2×2 — a size that
|
|
6
|
+
* is intentionally NOT a multiple of the ZX tile size (8 px).
|
|
7
|
+
*
|
|
8
|
+
* col: 01234567
|
|
9
|
+
* row 0: ██...... (0xC0)
|
|
10
|
+
* row 1: ██...... (0xC0)
|
|
11
|
+
* rows 2–7: empty
|
|
12
|
+
*
|
|
13
|
+
* Ground truth: a brute-force Set-of-pixel-coords intersection.
|
|
14
|
+
* Both sprites are projected to absolute (x,y) coordinates, all lit pixels
|
|
15
|
+
* are collected into a flat Set, and any shared coordinate counts as overlap.
|
|
16
|
+
* No formulas, no assumptions — just "which pixels are painted and do any
|
|
17
|
+
* coordinates match?"
|
|
18
|
+
*
|
|
19
|
+
* Every assertion compares masksOverlap against this ground truth, sweeping
|
|
20
|
+
* sprite B toward sprite A one pixel at a time in all four directions and
|
|
21
|
+
* diagonally. A separate block shows that AABB (8×8 bounding-box) fires
|
|
22
|
+
* 6 pixels earlier than pixel-perfect — the gap the ground truth exposes.
|
|
23
|
+
*/
|
|
24
|
+
import { describe, it, expect } from 'vitest';
|
|
25
|
+
import { bitmapPixelMask, masksOverlap, rectsOverlap } from '../collision.js';
|
|
26
|
+
import { createBitmap } from '../renderer.js';
|
|
27
|
+
// ── Fixture ───────────────────────────────────────────────────────────────────
|
|
28
|
+
// width=8 (minimum for Bitmap: 1 byte per row). height=8.
|
|
29
|
+
// Lit region: rows 0–1, cols 0–1. All other bytes 0x00.
|
|
30
|
+
const BMP = createBitmap(new Uint8Array([
|
|
31
|
+
0xC0, // row 0: bits 7,6 set → cols 0,1
|
|
32
|
+
0xC0, // row 1: bits 7,6 set → cols 0,1
|
|
33
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // rows 2–7: empty
|
|
34
|
+
]), 8, 8);
|
|
35
|
+
const MASK = bitmapPixelMask(BMP);
|
|
36
|
+
// ── Brute-force ground truth ──────────────────────────────────────────────────
|
|
37
|
+
// Project every lit pixel of a mask to world (x,y). Put them in a Set.
|
|
38
|
+
// Check if any pixel of B appears in the Set of A. Completely explicit —
|
|
39
|
+
// no clever algorithm, just coordinate comparison.
|
|
40
|
+
function litPixels(mask, ox, oy) {
|
|
41
|
+
const s = new Set();
|
|
42
|
+
for (let row = 0; row < mask.height; row++) {
|
|
43
|
+
for (const col of mask.rows[row]) {
|
|
44
|
+
s.add(`${ox + col},${oy + row}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return s;
|
|
48
|
+
}
|
|
49
|
+
function bruteForce(maskA, ax, ay, maskB, bx, by) {
|
|
50
|
+
const setA = litPixels(maskA, ax, ay);
|
|
51
|
+
for (let row = 0; row < maskB.height; row++) {
|
|
52
|
+
for (const col of maskB.rows[row]) {
|
|
53
|
+
if (setA.has(`${bx + col},${by + row}`))
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
60
|
+
describe('masksOverlap — 2×2 lit region, visual ground truth', () => {
|
|
61
|
+
// ── Sanity-check the mask ─────────────────────────────────────────────────
|
|
62
|
+
describe('mask shape', () => {
|
|
63
|
+
it('has exactly 4 lit pixels (the 2×2 region)', () => {
|
|
64
|
+
expect(MASK.totalPixels).toBe(4);
|
|
65
|
+
});
|
|
66
|
+
it('rows 0–1 contain columns [0, 1]; rows 2–7 are empty', () => {
|
|
67
|
+
expect(MASK.rows[0]).toEqual([0, 1]);
|
|
68
|
+
expect(MASK.rows[1]).toEqual([0, 1]);
|
|
69
|
+
for (let r = 2; r < MASK.height; r++) {
|
|
70
|
+
expect(MASK.rows[r]).toEqual([]);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
// ── Horizontal sweep ──────────────────────────────────────────────────────
|
|
75
|
+
// A is fixed at (20,20). B sweeps from right (x=30) to left (x=17), same y.
|
|
76
|
+
// A's lit pixels: x∈[20,21], y∈[20,21].
|
|
77
|
+
// First contact: bx=21 — B column 0 (x=21) meets A column 1 (x=21).
|
|
78
|
+
// AABB first contact: bx=27 — 8×8 boxes share one column. Gap = 6 px.
|
|
79
|
+
describe('horizontal sweep: B approaches A from the right', () => {
|
|
80
|
+
const AX = 20, AY = 20;
|
|
81
|
+
it('masksOverlap matches brute-force at every pixel step', () => {
|
|
82
|
+
for (let bx = AX + 10; bx >= AX - 3; bx--) {
|
|
83
|
+
const expected = bruteForce(MASK, AX, AY, MASK, bx, AY);
|
|
84
|
+
const actual = masksOverlap(MASK, AX, AY, MASK, bx, AY) > 0;
|
|
85
|
+
if (actual !== expected) {
|
|
86
|
+
throw new Error(`bx=${bx}: masksOverlap=${actual} but brute-force says ${expected}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
it('no collision at bx = AX+2 — 1-pixel gap between lit edges', () => {
|
|
91
|
+
// A's rightmost lit column is AX+1=21. B's leftmost at bx=AX+2=22. Gap 1 px.
|
|
92
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX + 2, AY)).toBe(0);
|
|
93
|
+
expect(bruteForce(MASK, AX, AY, MASK, AX + 2, AY)).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
it('collision fires at bx = AX+1 — lit edges share column AX+1', () => {
|
|
96
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX + 1, AY)).toBeGreaterThan(0);
|
|
97
|
+
expect(bruteForce(MASK, AX, AY, MASK, AX + 1, AY)).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
it('AABB (8×8 box) fires 6 pixels before pixel-perfect', () => {
|
|
100
|
+
const boxA = { x: AX, y: AY, w: 8, h: 8 };
|
|
101
|
+
// AABB says: first overlap at bx=AX+7 (right edge of A box = left edge of B box)
|
|
102
|
+
expect(rectsOverlap(boxA, { x: AX + 8, y: AY, w: 8, h: 8 })).toBe(false);
|
|
103
|
+
expect(rectsOverlap(boxA, { x: AX + 7, y: AY, w: 8, h: 8 })).toBe(true);
|
|
104
|
+
// Pixel-perfect: no lit pixels near each other at bx=AX+7 — false positive
|
|
105
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX + 7, AY)).toBe(0);
|
|
106
|
+
expect(bruteForce(MASK, AX, AY, MASK, AX + 7, AY)).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
// ── Vertical sweep ────────────────────────────────────────────────────────
|
|
110
|
+
// A fixed at (20,20). B sweeps from below (y=30) upward (y=17), same x.
|
|
111
|
+
// First contact: by=21 — B row 0 (y=21) meets A row 1 (y=21).
|
|
112
|
+
// AABB first contact: by=27. Gap = 6 px.
|
|
113
|
+
describe('vertical sweep: B approaches A from below', () => {
|
|
114
|
+
const AX = 20, AY = 20;
|
|
115
|
+
it('masksOverlap matches brute-force at every pixel step', () => {
|
|
116
|
+
for (let by = AY + 10; by >= AY - 3; by--) {
|
|
117
|
+
const expected = bruteForce(MASK, AX, AY, MASK, AX, by);
|
|
118
|
+
const actual = masksOverlap(MASK, AX, AY, MASK, AX, by) > 0;
|
|
119
|
+
if (actual !== expected) {
|
|
120
|
+
throw new Error(`by=${by}: masksOverlap=${actual} but brute-force says ${expected}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
it('no collision at by = AY+2 — 1-pixel gap between lit rows', () => {
|
|
125
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX, AY + 2)).toBe(0);
|
|
126
|
+
expect(bruteForce(MASK, AX, AY, MASK, AX, AY + 2)).toBe(false);
|
|
127
|
+
});
|
|
128
|
+
it('collision fires at by = AY+1 — lit rows share row AY+1', () => {
|
|
129
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX, AY + 1)).toBeGreaterThan(0);
|
|
130
|
+
expect(bruteForce(MASK, AX, AY, MASK, AX, AY + 1)).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
it('AABB fires 6 pixels before pixel-perfect', () => {
|
|
133
|
+
const boxA = { x: AX, y: AY, w: 8, h: 8 };
|
|
134
|
+
expect(rectsOverlap(boxA, { x: AX, y: AY + 8, w: 8, h: 8 })).toBe(false);
|
|
135
|
+
expect(rectsOverlap(boxA, { x: AX, y: AY + 7, w: 8, h: 8 })).toBe(true);
|
|
136
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX, AY + 7)).toBe(0);
|
|
137
|
+
expect(bruteForce(MASK, AX, AY, MASK, AX, AY + 7)).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
// ── Diagonal sweep ────────────────────────────────────────────────────────
|
|
141
|
+
// A fixed at (20,20). B sweeps along the main diagonal: bx=by=AX+d, d=10→-3.
|
|
142
|
+
// First contact: d=1 — corner pixel (AX+1, AY+1) is shared by both sprites.
|
|
143
|
+
// At d=2: B's nearest pixel is (AX+2, AY+2) — corner of A is (AX+1, AY+1). Gap.
|
|
144
|
+
describe('diagonal sweep: B approaches A from bottom-right', () => {
|
|
145
|
+
const AX = 20, AY = 20;
|
|
146
|
+
it('masksOverlap matches brute-force at every diagonal step', () => {
|
|
147
|
+
for (let d = 10; d >= -3; d--) {
|
|
148
|
+
const bx = AX + d, by = AY + d;
|
|
149
|
+
const expected = bruteForce(MASK, AX, AY, MASK, bx, by);
|
|
150
|
+
const actual = masksOverlap(MASK, AX, AY, MASK, bx, by) > 0;
|
|
151
|
+
if (actual !== expected) {
|
|
152
|
+
throw new Error(`d=${d} (bx=${bx}, by=${by}): masksOverlap=${actual} but brute-force says ${expected}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
it('no collision at d=2 — corner pixels are 1 diagonal step apart', () => {
|
|
157
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX + 2, AY + 2)).toBe(0);
|
|
158
|
+
expect(bruteForce(MASK, AX, AY, MASK, AX + 2, AY + 2)).toBe(false);
|
|
159
|
+
});
|
|
160
|
+
it('collision fires at d=1 — single corner pixel (AX+1, AY+1) coincides', () => {
|
|
161
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX + 1, AY + 1)).toBeGreaterThan(0);
|
|
162
|
+
expect(bruteForce(MASK, AX, AY, MASK, AX + 1, AY + 1)).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
// ── Overlap count ─────────────────────────────────────────────────────────
|
|
166
|
+
// masksOverlap returns a count, not just a boolean. Verify it grows as the
|
|
167
|
+
// sprites move deeper into each other.
|
|
168
|
+
describe('overlap pixel count increases with penetration depth', () => {
|
|
169
|
+
const AX = 20, AY = 20;
|
|
170
|
+
it('1 overlapping pixel at first horizontal contact (bx = AX+1)', () => {
|
|
171
|
+
// Only column AX+1 is shared (both rows): 2 pixels
|
|
172
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX + 1, AY)).toBe(2);
|
|
173
|
+
});
|
|
174
|
+
it('4 overlapping pixels when fully aligned (bx = AX)', () => {
|
|
175
|
+
// Complete overlap of the 2×2 regions
|
|
176
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX, AY)).toBe(4);
|
|
177
|
+
});
|
|
178
|
+
it('single corner pixel at diagonal first contact (d=1)', () => {
|
|
179
|
+
// Only (AX+1, AY+1) is shared
|
|
180
|
+
expect(masksOverlap(MASK, AX, AY, MASK, AX + 1, AY + 1)).toBe(1);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
// ── Symmetry ──────────────────────────────────────────────────────────────
|
|
184
|
+
// masksOverlap(A, B) must equal masksOverlap(B, A) — no directional bias.
|
|
185
|
+
describe('symmetry: collision count is order-independent', () => {
|
|
186
|
+
it('A→B count equals B→A count for all horizontal positions', () => {
|
|
187
|
+
const AX = 20, AY = 20;
|
|
188
|
+
for (let bx = AX + 5; bx >= AX - 3; bx--) {
|
|
189
|
+
const ab = masksOverlap(MASK, AX, AY, MASK, bx, AY);
|
|
190
|
+
const ba = masksOverlap(MASK, bx, AY, MASK, AX, AY);
|
|
191
|
+
if (ab !== ba) {
|
|
192
|
+
throw new Error(`Asymmetry at bx=${bx}: A→B=${ab}, B→A=${ba}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=collision.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collision.test.js","sourceRoot":"","sources":["../../src/__tests__/collision.test.ts"],"names":[],"mappings":"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"}
|
package/dist/collision.d.ts
CHANGED
|
@@ -85,6 +85,88 @@ export declare function resolveRectY(rect: Rect, map: TileMap, newY: number): {
|
|
|
85
85
|
hitTop: boolean;
|
|
86
86
|
hitBottom: boolean;
|
|
87
87
|
};
|
|
88
|
+
/**
|
|
89
|
+
* Pre-computed per-row opaque pixel data for a {@link Bitmap}.
|
|
90
|
+
* Build once with {@link bitmapPixelMask}, reuse every frame.
|
|
91
|
+
*
|
|
92
|
+
* Each row is a sorted array of column indices where the bitmap has a set bit.
|
|
93
|
+
* Empty rows have zero-length arrays — never `undefined`.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```
|
|
97
|
+
* // 16×16 circular sprite:
|
|
98
|
+
* mask.rows[0] → [6, 7, 8, 9] // narrow top
|
|
99
|
+
* mask.rows[7] → [0, 1, 2, ..., 15] // full-width middle
|
|
100
|
+
* mask.rows[11] → [3, 4, 10, 11] // only feet
|
|
101
|
+
* mask.rows[14] → [] // below feet, empty
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export interface PixelMask {
|
|
105
|
+
readonly width: number;
|
|
106
|
+
readonly height: number;
|
|
107
|
+
readonly rows: readonly (readonly number[])[];
|
|
108
|
+
readonly totalPixels: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Extract a pixel mask from a {@link Bitmap}.
|
|
112
|
+
* Reads each row's bit data (bit 7 = leftmost pixel) and collects column
|
|
113
|
+
* indices of set (opaque) pixels into sorted arrays.
|
|
114
|
+
*
|
|
115
|
+
* Pre-compute once per sprite definition — the result is immutable and
|
|
116
|
+
* derived from immutable bitmap data.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```ts
|
|
120
|
+
* const HERO_MASK = bitmapPixelMask(HERO_BMP)
|
|
121
|
+
* // Now use with masksOverlap() or pixelSolidCount()
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export declare function bitmapPixelMask(bitmap: Bitmap): PixelMask;
|
|
125
|
+
/**
|
|
126
|
+
* Count opaque pixels of mask `a` at `(ax, ay)` that overlap with
|
|
127
|
+
* opaque pixels of mask `b` at `(bx, by)`.
|
|
128
|
+
*
|
|
129
|
+
* Returns 0 when no overlap. Any value > 0 means pixel-perfect collision.
|
|
130
|
+
* The count itself is useful for overlap severity — e.g. damage scaling.
|
|
131
|
+
*
|
|
132
|
+
* Uses sorted-merge intersection per row — O(pixels) total, no allocations.
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```ts
|
|
136
|
+
* const BULLET = bitmapPixelMask(BULLET_BMP)
|
|
137
|
+
* const ENEMY = bitmapPixelMask(ENEMY_BMP)
|
|
138
|
+
*
|
|
139
|
+
* if (masksOverlap(BULLET, bx, by, ENEMY, ex, ey) > 0) {
|
|
140
|
+
* destroyEnemy()
|
|
141
|
+
* }
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export declare function masksOverlap(a: PixelMask, ax: number, ay: number, b: PixelMask, bx: number, by: number): number;
|
|
145
|
+
/**
|
|
146
|
+
* Count opaque pixels of a mask at `(mx, my)` that sit on solid tiles
|
|
147
|
+
* in a {@link TileMap}. Pixel-precise replacement for AABB-based checks.
|
|
148
|
+
*
|
|
149
|
+
* Solves the "character standing on a platform edge" problem: a round
|
|
150
|
+
* sprite with narrow feet can hang over the edge — only real foot pixels
|
|
151
|
+
* are checked, not the full bounding box.
|
|
152
|
+
*
|
|
153
|
+
* ```
|
|
154
|
+
* AABB (16px wide): ████████████████ → full-width overlap check
|
|
155
|
+
* pixelSolidCount: ···██····██···· → only feet matter
|
|
156
|
+
* ```
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```ts
|
|
160
|
+
* const HERO_MASK = bitmapPixelMask(HERO_BMP)
|
|
161
|
+
*
|
|
162
|
+
* // Check if standing: test 1px below current position
|
|
163
|
+
* const standing = pixelSolidCount(HERO_MASK, hero.x, hero.y + 1, map) > 0
|
|
164
|
+
*
|
|
165
|
+
* // Check wall to the right
|
|
166
|
+
* const wallRight = pixelSolidCount(HERO_MASK, hero.x + 1, hero.y, map) > 0
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
export declare function pixelSolidCount(mask: PixelMask, mx: number, my: number, map: TileMap): number;
|
|
88
170
|
/**
|
|
89
171
|
* Resolves a proposed horizontal movement for an 8×8 sprite against solid tiles.
|
|
90
172
|
* Thin wrapper over {@link resolveRectX} preserved for backward compatibility.
|
package/dist/collision.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collision.d.ts","sourceRoot":"","sources":["../src/collision.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAE3C;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAKtD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAErE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvE;AAwBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAuBpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAuBpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAEpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAEpD"}
|
|
1
|
+
{"version":3,"file":"collision.d.ts","sourceRoot":"","sources":["../src/collision.ts"],"names":[],"mappings":"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"}
|
package/dist/collision.js
CHANGED
|
@@ -144,6 +144,123 @@ export function resolveRectY(rect, map, newY) {
|
|
|
144
144
|
}
|
|
145
145
|
return { y, hitTop, hitBottom };
|
|
146
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Extract a pixel mask from a {@link Bitmap}.
|
|
149
|
+
* Reads each row's bit data (bit 7 = leftmost pixel) and collects column
|
|
150
|
+
* indices of set (opaque) pixels into sorted arrays.
|
|
151
|
+
*
|
|
152
|
+
* Pre-compute once per sprite definition — the result is immutable and
|
|
153
|
+
* derived from immutable bitmap data.
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```ts
|
|
157
|
+
* const HERO_MASK = bitmapPixelMask(HERO_BMP)
|
|
158
|
+
* // Now use with masksOverlap() or pixelSolidCount()
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
export function bitmapPixelMask(bitmap) {
|
|
162
|
+
const bytesPerRow = bitmap.width / 8;
|
|
163
|
+
const rows = [];
|
|
164
|
+
let total = 0;
|
|
165
|
+
for (let row = 0; row < bitmap.height; row++) {
|
|
166
|
+
const cols = [];
|
|
167
|
+
for (let col = 0; col < bitmap.width; col++) {
|
|
168
|
+
const byteIdx = row * bytesPerRow + Math.floor(col / 8);
|
|
169
|
+
const bitIdx = 7 - (col % 8);
|
|
170
|
+
if (bitmap.data[byteIdx] & (1 << bitIdx))
|
|
171
|
+
cols.push(col);
|
|
172
|
+
}
|
|
173
|
+
rows.push(cols);
|
|
174
|
+
total += cols.length;
|
|
175
|
+
}
|
|
176
|
+
return { width: bitmap.width, height: bitmap.height, rows, totalPixels: total };
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Count opaque pixels of mask `a` at `(ax, ay)` that overlap with
|
|
180
|
+
* opaque pixels of mask `b` at `(bx, by)`.
|
|
181
|
+
*
|
|
182
|
+
* Returns 0 when no overlap. Any value > 0 means pixel-perfect collision.
|
|
183
|
+
* The count itself is useful for overlap severity — e.g. damage scaling.
|
|
184
|
+
*
|
|
185
|
+
* Uses sorted-merge intersection per row — O(pixels) total, no allocations.
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```ts
|
|
189
|
+
* const BULLET = bitmapPixelMask(BULLET_BMP)
|
|
190
|
+
* const ENEMY = bitmapPixelMask(ENEMY_BMP)
|
|
191
|
+
*
|
|
192
|
+
* if (masksOverlap(BULLET, bx, by, ENEMY, ex, ey) > 0) {
|
|
193
|
+
* destroyEnemy()
|
|
194
|
+
* }
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
export function masksOverlap(a, ax, ay, b, bx, by) {
|
|
198
|
+
const top = Math.max(ay, by);
|
|
199
|
+
const bot = Math.min(ay + a.height, by + b.height);
|
|
200
|
+
if (top >= bot)
|
|
201
|
+
return 0;
|
|
202
|
+
if (ax >= bx + b.width || ax + a.width <= bx)
|
|
203
|
+
return 0;
|
|
204
|
+
let count = 0;
|
|
205
|
+
for (let y = top; y < bot; y++) {
|
|
206
|
+
const rowA = a.rows[y - ay];
|
|
207
|
+
const rowB = b.rows[y - by];
|
|
208
|
+
if (rowA.length === 0 || rowB.length === 0)
|
|
209
|
+
continue;
|
|
210
|
+
let i = 0, j = 0;
|
|
211
|
+
while (i < rowA.length && j < rowB.length) {
|
|
212
|
+
const ca = rowA[i] + ax;
|
|
213
|
+
const cb = rowB[j] + bx;
|
|
214
|
+
if (ca === cb) {
|
|
215
|
+
count++;
|
|
216
|
+
i++;
|
|
217
|
+
j++;
|
|
218
|
+
}
|
|
219
|
+
else if (ca < cb)
|
|
220
|
+
i++;
|
|
221
|
+
else
|
|
222
|
+
j++;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return count;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Count opaque pixels of a mask at `(mx, my)` that sit on solid tiles
|
|
229
|
+
* in a {@link TileMap}. Pixel-precise replacement for AABB-based checks.
|
|
230
|
+
*
|
|
231
|
+
* Solves the "character standing on a platform edge" problem: a round
|
|
232
|
+
* sprite with narrow feet can hang over the edge — only real foot pixels
|
|
233
|
+
* are checked, not the full bounding box.
|
|
234
|
+
*
|
|
235
|
+
* ```
|
|
236
|
+
* AABB (16px wide): ████████████████ → full-width overlap check
|
|
237
|
+
* pixelSolidCount: ···██····██···· → only feet matter
|
|
238
|
+
* ```
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```ts
|
|
242
|
+
* const HERO_MASK = bitmapPixelMask(HERO_BMP)
|
|
243
|
+
*
|
|
244
|
+
* // Check if standing: test 1px below current position
|
|
245
|
+
* const standing = pixelSolidCount(HERO_MASK, hero.x, hero.y + 1, map) > 0
|
|
246
|
+
*
|
|
247
|
+
* // Check wall to the right
|
|
248
|
+
* const wallRight = pixelSolidCount(HERO_MASK, hero.x + 1, hero.y, map) > 0
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
export function pixelSolidCount(mask, mx, my, map) {
|
|
252
|
+
let count = 0;
|
|
253
|
+
for (let row = 0; row < mask.height; row++) {
|
|
254
|
+
const worldY = my + row;
|
|
255
|
+
const tileY = Math.floor(worldY / CELL);
|
|
256
|
+
for (const col of mask.rows[row]) {
|
|
257
|
+
if (map.isSolid(Math.floor((mx + col) / CELL), tileY))
|
|
258
|
+
count++;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return count;
|
|
262
|
+
}
|
|
263
|
+
// ─── AABB sprite wrappers (backward-compatible) ─────────────────────────────
|
|
147
264
|
/**
|
|
148
265
|
* Resolves a proposed horizontal movement for an 8×8 sprite against solid tiles.
|
|
149
266
|
* Thin wrapper over {@link resolveRectX} preserved for backward compatibility.
|
package/dist/collision.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collision.js","sourceRoot":"","sources":["../src/collision.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"collision.js","sourceRoot":"","sources":["../src/collision.ts"],"names":[],"mappings":"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"}
|
package/dist/renderer.d.ts
CHANGED
|
@@ -160,6 +160,27 @@ export interface Bitmap {
|
|
|
160
160
|
* ]), 16, 24)
|
|
161
161
|
*/
|
|
162
162
|
export declare function createBitmap(data: Uint8Array, width: number, height: number): Bitmap;
|
|
163
|
+
/**
|
|
164
|
+
* Constructs a {@link Bitmap} from readable pixel rows.
|
|
165
|
+
*
|
|
166
|
+
* Each string represents one bitmap row. `#` and `X` are treated as solid pixels;
|
|
167
|
+
* `.` and space are treated as transparent pixels. All rows must have identical
|
|
168
|
+
* width, and that width must be a positive multiple of 8 so the result is byte-aligned
|
|
169
|
+
* for the normal {@link createBitmap} / {@link drawBitmap} pipeline.
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* const PLAYER = createBitmapFromRows([
|
|
173
|
+
* '...XX...',
|
|
174
|
+
* '..XXXX..',
|
|
175
|
+
* '.XXXXXX.',
|
|
176
|
+
* 'XXXXXXXX',
|
|
177
|
+
* 'XXXXXXXX',
|
|
178
|
+
* '.XXXXXX.',
|
|
179
|
+
* '..X..X..',
|
|
180
|
+
* '.XX..XX.',
|
|
181
|
+
* ])
|
|
182
|
+
*/
|
|
183
|
+
export declare function createBitmapFromRows(rows: readonly string[]): Bitmap;
|
|
163
184
|
/**
|
|
164
185
|
* Draws a {@link Bitmap} of arbitrary width and height at game coordinates `(x, y)`.
|
|
165
186
|
* If `paper` is provided, fills the full bounding rectangle first; otherwise leaves the
|
package/dist/renderer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/renderer.js
CHANGED
|
@@ -222,6 +222,59 @@ export function createBitmap(data, width, height) {
|
|
|
222
222
|
}
|
|
223
223
|
return { data, width, height };
|
|
224
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* Constructs a {@link Bitmap} from readable pixel rows.
|
|
227
|
+
*
|
|
228
|
+
* Each string represents one bitmap row. `#` and `X` are treated as solid pixels;
|
|
229
|
+
* `.` and space are treated as transparent pixels. All rows must have identical
|
|
230
|
+
* width, and that width must be a positive multiple of 8 so the result is byte-aligned
|
|
231
|
+
* for the normal {@link createBitmap} / {@link drawBitmap} pipeline.
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* const PLAYER = createBitmapFromRows([
|
|
235
|
+
* '...XX...',
|
|
236
|
+
* '..XXXX..',
|
|
237
|
+
* '.XXXXXX.',
|
|
238
|
+
* 'XXXXXXXX',
|
|
239
|
+
* 'XXXXXXXX',
|
|
240
|
+
* '.XXXXXX.',
|
|
241
|
+
* '..X..X..',
|
|
242
|
+
* '.XX..XX.',
|
|
243
|
+
* ])
|
|
244
|
+
*/
|
|
245
|
+
export function createBitmapFromRows(rows) {
|
|
246
|
+
if (rows.length === 0) {
|
|
247
|
+
throw new Error('createBitmapFromRows: rows must not be empty');
|
|
248
|
+
}
|
|
249
|
+
const height = rows.length;
|
|
250
|
+
const width = rows[0].length;
|
|
251
|
+
if (width === 0) {
|
|
252
|
+
throw new Error('createBitmapFromRows: row width must be positive');
|
|
253
|
+
}
|
|
254
|
+
if (width % 8 !== 0) {
|
|
255
|
+
throw new Error(`createBitmapFromRows: row width must be a positive multiple of 8, got ${width}`);
|
|
256
|
+
}
|
|
257
|
+
const bytesPerRow = width / 8;
|
|
258
|
+
const data = new Uint8Array(bytesPerRow * height);
|
|
259
|
+
for (let row = 0; row < height; row++) {
|
|
260
|
+
const line = rows[row];
|
|
261
|
+
if (line.length !== width) {
|
|
262
|
+
throw new Error(`createBitmapFromRows: row ${row} length mismatch — expected ${width}, got ${line.length}`);
|
|
263
|
+
}
|
|
264
|
+
for (let col = 0; col < width; col++) {
|
|
265
|
+
const ch = line[col];
|
|
266
|
+
if (ch === '.' || ch === ' ')
|
|
267
|
+
continue;
|
|
268
|
+
if (ch !== '#' && ch !== 'X') {
|
|
269
|
+
throw new Error(`createBitmapFromRows: invalid pixel '${ch}' at row ${row}, col ${col}; ` +
|
|
270
|
+
'use #/X for solid and ./space for transparent');
|
|
271
|
+
}
|
|
272
|
+
const byteIdx = row * bytesPerRow + Math.floor(col / 8);
|
|
273
|
+
data[byteIdx] |= 0x80 >> (col % 8);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return createBitmap(data, width, height);
|
|
277
|
+
}
|
|
225
278
|
/**
|
|
226
279
|
* Draws a {@link Bitmap} of arbitrary width and height at game coordinates `(x, y)`.
|
|
227
280
|
* If `paper` is provided, fills the full bounding rectangle first; otherwise leaves the
|
package/dist/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|