305. 精灵渲染的翻转支持

为单精灵渲染添加水平和垂直翻转支持。

305 / 356 · tests/chapter_09_sprite_rendering/test_305_sprite_render_flip_support.py

需要更新的文件

emulator/rendering/sprite_renderer.py

为什么需要这一步

精灵属性已经解码出了水平和垂直翻转位。现在单精灵渲染器在选择要绘制哪个 CHR 像素时,应该使用这些位。

精灵属性翻转位

bit 6: horizontal flip
bit 7: vertical flip

重要模型

翻转是在精灵的 8x8 方框内对图像做镜像,不会移动精灵在屏幕上的位置。

render_sprite_8x8_to_framebuffer() 内的建议实现示例:

for tile_y in range(8):
    for tile_x in range(8):
        source_x = 7 - tile_x if attributes.flip_horizontal else tile_x
        source_y = 7 - tile_y if attributes.flip_vertical else tile_y

        color_index = color_indexes[source_y][source_x]

        if color_index == 0:
            continue

        screen_x = sprite.x + tile_x
        screen_y = sprite.y + tile_y

        ...

最小示例

original row:          1 2 3 . . . . .
horizontal flip row:   . . . . . 3 2 1

常见误解

"Horizontal flip should change sprite.x."

不是。目标方框依然保持在 sprite.x/sprite.y 处,只有源像素的查找被镜像。

本步骤不涉及的内容

  • 渲染全部 64 个精灵
  • 精灵在背景后面的优先级
  • sprite 0 hit
  • sprite overflow
  • pygame

运行本课

uv run pytest tests/chapter_09_sprite_rendering/test_305_sprite_render_flip_support.py -v