Tile collision
Testing points of an object against the level's tile map to decide what stops it, holds it up, or lets it pass.
Tile collision asks the level, not other objects, whether a place is solid. A game looks up the tile under points on an object, such as its feet, head, and sides, and lands it or pushes it back when a point is inside a solid tile. Collisions between objects use hitboxes instead.
- Felix the Cat (1992). A 512 px ring of 16 px tiles; a blocked step is taken back, but a platform's push isn't.1,2,3
Games
| Game | Year | How | Note |
|---|---|---|---|
| Felix the Cat | 1992 | a 512 px ring of 16 px tiles; a blocked step is taken back, but a platform's push isn't |
Every claim about this mechanic, by game (8)
References
- ^Each frame of play, after the mover adds Felix's x speed and push to his x, the fixed bank's
$D05Fchecks him against the screen's edges or the map. With his x's high byte past the bound's, or equal to it with a low byte of$DBor more outside a boss fight (and a few other cases), the game walks him right (the auto-walk) and tests the map. Short of that, an x less than 8 or at least 240 past$B7:$B9sets his x speed to 1 px a frame back inward, and the map isn't read that frame. Otherwise, moving right, it reads the map 8 px ahead of him, normally at y + 1, y − 8, and y + 13 (moving left, 8 px behind), and if a tile there blocks, it subtracts that frame's x speed from his x again. Then$D191moves x 1 px toward 7 or 8 px into its 16 px column.Code“Felix the Cat (USA)”revisedHow we know
In the cartridge (“Felix the Cat (USA)”): fixed bank $D023-$D02B, in Felix's update: JSR $D87E, JSR $D90F (the mover), JSR $D05F; fixed bank $D049-$D0EA: past the bound's page, or in it at x low byte $DB or more unless $040D is 1, $040D + $0411 is 8 (a boss fight), or the stage index is $17, hold Right and accelerate (the auto-walk), then the map test; otherwise x - $B7:$B9 below 8 sets the x speed to $0100, at $F0 or more to $FF00, and returns; fixed bank $D0EB-$D15F: with the x speed at 0, test both sides; positive, the tile at x + 8 (mask $FD); negative, x - 8 (mask $FB); on a hit, subtract the x speed from the fraction and x, then $D191; fixed bank $D191-$D1BD: fraction to $80; x's low nibble 7 or 8 stays, below 7 gains 1, above 8 loses 1; fixed bank $D1BE-$D213: the tile at y + 1; then y - 8 unless $03C3 is 7; then y + 13 unless $03B0 is set; nonzero when one blocks. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-25.
Revised after a check by a second AI model, 2026-10-25.
- ^The map that Felix's tile tests read is 32 columns of 16 px by 24 rows of 16 px in cartridge RAM at
$6000-$63FF, a ring that repeats every 512 px of x. A tile's type is the low nibble of its entry in a table at($CA). Types 1, 14, and 15 block both ways; type 4 blocks only moving left, and type 5 only moving right. A point above the map reads the top row, and one 384 px down or more reads the bottom row, where any nonzero type counts as 1.Code“Felix the Cat (USA)”How we know
In the cartridge (“Felix the Cat (USA)”): fixed bank $F251-$F290: row from y ($07:$06): negative, row 0; below 256, y / 16; 256-383, 16 + (y - 256) / 16; else row 23 with a nonzero type as 1; address $6000 + (x high bit 0) * $200 + (x low / 16) * $20 + row; type = ($CA),tile AND $0F; fixed bank $CF81-$CF90, the blocking bits by type: 00 01 00 00 02 04 00 00 00 00 00 00 00 00 01 01; moving right tests them with $FD, left with $FB. We don't reproduce the bytes.
Checked against the evidence by its author, an AI model, 2026-10-25.
Checked by a second AI model, 2026-10-25.
- ^Felix's push
$041Dcomes from one routine, in PRG bank 12: a platform whose x swings with the frame counter sets it, while Felix rides, to the change in its x that frame, and the object pass clears it again afterward. The mover adds it to Felix's x, and the wall test never takes it back (felix-the-cat/wall-test). In FCEUX's replay of the 1625M movie the push was 1 px either way, and it came only in the main areas of stage indices 1, 2, 7, 9, 10, 12, 18, and 22, never in a boss room.Code“Felix the Cat (USA)” · 1625M, replayed in FCEUXHow we know
In the cartridge (“Felix the Cat (USA)”): bank 12 $9165-$91B2: save the x low byte in $01; x = the base $06F2:$06DC + ($37 / 2, mirrored by $37 bit 6) AND $1F; with $0708 bit 4 set and x moved, $041D = x - $01; fixed bank $E12B-$E155: update slots 6 to 21, then 0 to 5, then zero $0420-$0423 and $041D; fixed bank $D90F-$D93D: the mover adds $06C6 + $041D to Felix's x. We don't reproduce the bytes.
every nonzero write to $041D Checked against the evidence by its author, an AI model, 2026-10-25.
Checked by a second AI model, 2026-10-25.