Kasumi
New member
I'll risk sounding pedantic for maximum understanding. More or less! But it's pixel, not tile. On the right image, the bottom right TILE of the HUD is not totally transparent, but this doesn't matter because sprite 0 is not overlapping the parts of it that aren't transparent.
Secondarily, it's not the overlap or lack of it that causes the crash.
When an opaque pixel from sprite 0 overlaps an opaque pixel in the background, the PPU (NES' graphics rendering CPU) sets something that CPU can detect. If it never happens, that thing is never set but that doesn't make the CPU stop doing things on its own.
The crash happens if the game is specifically trying to detect that thing in a loop. It's doing a loop similar to, but not exactly this (to make it easier to understand):
There's nothing between loop and that branch to loop that changes the value of variable. So unless something else changes that value of variable, the code is stuck there indefinitely.
The game crashes because it's waiting for a change like that that never happens. (The PPU can never change "variable" because the conditions it would do that under never occur.)
Shorter: It wouldn't crash if a waiting loop wasn't in the code regardless of the overlap, and it wouldn't crash if it had waiting loop, but overlap occurred.
The crash happens because it's waiting, AND the overlap it's waiting for never occurs.
Edit: Dale_Coop: Are the non corner parts of your reproduction color 0?
Secondarily, it's not the overlap or lack of it that causes the crash.
When an opaque pixel from sprite 0 overlaps an opaque pixel in the background, the PPU (NES' graphics rendering CPU) sets something that CPU can detect. If it never happens, that thing is never set but that doesn't make the CPU stop doing things on its own.
The crash happens if the game is specifically trying to detect that thing in a loop. It's doing a loop similar to, but not exactly this (to make it easier to understand):
Code:
lda #$0;Load Zero
sta variable;Store zero to RAM
loop:
lda variable;Load the value of variable
beq loop;If the value of variable was zero, go to loop
The game crashes because it's waiting for a change like that that never happens. (The PPU can never change "variable" because the conditions it would do that under never occur.)
Shorter: It wouldn't crash if a waiting loop wasn't in the code regardless of the overlap, and it wouldn't crash if it had waiting loop, but overlap occurred.
The crash happens because it's waiting, AND the overlap it's waiting for never occurs.
Edit: Dale_Coop: Are the non corner parts of your reproduction color 0?