how and when do i invert sprites vertically ? (sprite_attribute & 0x80)
matt
how and when to invert sprite virtically ?
Moderator: Moderators
-
- Posts: 345
- Joined: Fri Jul 29, 2005 3:40 pm
- Location: near chicago
- Contact:
When the sprite is evaluated -- the attributes are fetched first to see if they're to be flipped vertically.
The 'normal' CHR is determined by the subtraction of the current scanline and the sprite Y coord (also used to determine whether or not the sprite is in-range). Ex:
To flip vertically -- simply XOR is_in_range with $7 (8x8 sprites) or $F (8x16 sprites) after the sprite is found to be in range.
The 'normal' CHR is determined by the subtraction of the current scanline and the sprite Y coord (also used to determine whether or not the sprite is in-range). Ex:
Code: Select all
u16 is_in_range = current_scanline - sprite_Y;
if(is_in_range < 8)
{
// sprite is in range
// fetch CHR according to is_in_range
// ie: if is_in_range == 5, CHR comes from $xxx5 and $xxxD
}
In case anyone misses it, Disch is using a trick of unsigned values in the comparison with 8. These are equivalent:
This works because a negative value converted to unsigned becomes a large positive value. It's a good trick to learn.
Code: Select all
unsigned n = current_scanline - sprite_y;
if ( n < 8 )
...
int n = current_scanline - sprite_y;
if ( n >= 0 && n < 8 )
...
There's a detail which I handle inside the own rendering core: the PPU clipping. So, instead of ">= 0" I use ">= ppu_clip_sprites", 0 or 8.
Zepper
RockNES developer
RockNES developer