mirror of
https://github.com/imjasonh/nescript
synced 2026-07-08 00:45:38 +00:00
platformer: move HUD from sprite OAM slots to background + sprite-0 split
The status bar now paints into NT row 1 (coin + score digits on the left, heart + lives digit on the right) using the `bg3` sub-palette that matches `sp0` pixel-for-pixel. A single OAM slot-0 anchor sprite sits over the coin tile; its one opaque pixel lines up with the coin's bottom row so sprite-0 hit fires at scanline 15, and a trailing `sprite_0_split(camera_x, 0)` latches the playfield scroll starting at scanline 16. NT rows 0-1 stay pinned while scanlines 16+ scroll with the camera. Score / lives updates are shadow-compared (`last_score`, `last_lives`) so the VRAM ring sees an entry only when the backing state actually changes — most frames append zero bytes. OAM footprint drops from 5 sprites per frame down to 1. Tile pipeline gains a 27th entry — a 7-transparent-row + 1-pixel anchor — so the sprite-0 hit lands on scanline 15 instead of scanline 8 (the latter would smear the HUD glyphs across the split). `gen_platformer_tiles.rs` is updated in lockstep. Ancillary changes: `bg3` retuned from `[yellow, orange, dk_orange]` to `[red, orange, white]` (matching `sp0`); `palette_map` row 0 flips from bg0 to bg3; legend gains `o`, `h`, `0`, `3` so the initial map can preload the static HUD tiles and the committed nametable already reads "coin 00 ... heart 3" on frame 0. `docs/future-work.md` loses the sprite-0 HUD follow-up section (this commit lands it). Goldens + gif refreshed.
This commit is contained in:
parent
91f82c169a
commit
c5b04c2065
9 changed files with 165 additions and 89 deletions
|
|
@ -367,6 +367,30 @@ aaaaaaaa
|
|||
...aa...
|
||||
........",
|
||||
},
|
||||
// Sprite-0 hit anchor — a single opaque pixel at row 7, col 3,
|
||||
// everything else transparent. Sits behind the HUD row's coin
|
||||
// tile as OAM slot 0 in every `on frame`; its one opaque pixel
|
||||
// aligns with column 3 of the coin's row 7 (`...bb...`), so
|
||||
// the PPU sets the sprite-0 hit flag at scanline 15 — the
|
||||
// last scanline of the HUD row. Writing `$2005` the moment
|
||||
// that flag sets means the horizontal scroll flip takes
|
||||
// effect at scanline 16 (the PPU latches horizontal scroll at
|
||||
// the next HBLANK), which pins NT rows 0-1 at scroll=0 and
|
||||
// lets scanlines 16+ render at `camera_x`. A sprite that
|
||||
// hit on its *top* row (e.g. using the coin as sprite 0)
|
||||
// would flip the scroll mid-HUD-row and smear the glyphs.
|
||||
Tile {
|
||||
name: "Sprite 0 anchor",
|
||||
art: "\
|
||||
........
|
||||
........
|
||||
........
|
||||
........
|
||||
........
|
||||
........
|
||||
........
|
||||
...c....",
|
||||
},
|
||||
];
|
||||
|
||||
// ── Named CHR tile indices used by the nametable layout below ──
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue