private NesSprite GetSprite(int bankIndex, int spriteIndex, int paletteIndex = -1, bool bg = false, bool flipVertical = false, bool flipHorizontal = false) { if (paletteIndex == -1) { paletteIndex = 1; } var sprite = new NesSprite(); var paletteBase = (!bg ? PPU.PALETTE_SPRITE : PPU.PALETTE) + paletteIndex * 4; var addr = spriteIndex * 16 + bankIndex * 0x1000; var index = 0; for (int j = 0; j < 8; j++) { int value1 = _ppu.ReadPpu(addr); int value2 = _ppu.ReadPpu(addr + 8); for (int x = 0; x < 8; x++) { var palette = ((value2 & 1) << 1) + (value1 & 1); sprite.data[index + (7 - x)] = PpuColors.Colors[_ppu.ReadPpu(paletteBase + palette) % 64]; value1 >>= 1; value2 >>= 1; } index += 8; addr++; } return(sprite); }
private void DrawSprite(NesSprite sprite, int x, int y, int scale = 2) { int index = 0; for (int j = y; j < y + 8; j++) { for (int i = x; i < x + 8; i++) { DrawPixel(i, j, sprite.data[index++]); } } }