【问题标题】:Assigning different palette indices to a paletted image将不同的调色板索引分配给调色板图像
【发布时间】:2014-12-14 14:53:50
【问题描述】:

我正在用 Python 和 Pygame 编写游戏。为此,图形将采用 NES 等旧视频游戏机的风格。因此,图形由带有 2 位(4 色)图像的单个图块集文件组成,我希望在加载这些图像时能够为这些图像分配任意 4 色调色板。

我想要做的是使用 8 位(256 色)调色板模式,我将调色板分为 64 个子调色板,每个子调色板有 4 种颜色。每次我从 2 位图形文件加载 16x16 平铺时,我都想为其分配这些虚拟 4 色调色板之一。因此,在原始图块集文件中,调色板索引将为 0-3,因为它是一个 2 位索引文件。我想将此文件中的图块加载到内存中,并使用一个函数将调色板索引从 0-3 重新分配给我选择的任何调色板偏移量,这样当我将它粘贴到屏幕上时,它会以我选择的 4 色着色调色板——很像 NES 硬件的工作原理。这有点难以解释,所以也许这张图片让它更清楚一点:

我查看了 Pygame 和 PIL 的手册,没有发现任何东西可以让我像这样操作调色板文件。是否有任何其他库可供研究,或者是否有我没有看到的更简单的解决方案?

【问题讨论】:

  • 我发现如果我在真彩色模式下运行我的游戏,我可以使用 Pygame 的 PixelArray.replace 作为解决方法。这可能会起作用,但如果可以更优雅地做到这一点,我仍然想知道如何。

标签: python pygame palette


【解决方案1】:

虽然我个人没有这样做,但在 PyGame 中,我相信您正在寻找的电话是: http://pygame.org/docs/ref/surface.html#Surface.set_palette

【讨论】:

    【解决方案2】:

    您可以使用pygame.Surface.set_palette_at() 执行此操作。在您的情况下,您有 64 个块的四种颜色,因此要重新着色特定块,您可以使用:

    for n, newRGBA in enumerate(fourNewColours):  # where fourNewColours are the RGBA tuples you want to plop into the palette.
        GameSurface.set_palette_at(palette_offset + n, newRGBA)  # where palette_offset is the number of the first palette index you want to replace (adding n to increment your way through the new colours).
    

    这就是您可以替换四种颜色的单个块的方法。将每个调色板推入游戏表面开始可能会更复杂,因为 pygame 似乎近似 blit'd 图像的调色板,而不是直接替换目标表面的索引。更复杂,因为我不知道您将如何使用重复的索引 RGBA 值重新着色像素。 (例如,如果调色板 14/2 和调色板 40/1 都是(90,91,200,255),例如。我不知道 pygame 是否会将具有该 RGBA 值的所有像素分配给调色板索引 57(来自 Pal14/2)和对于 Pal40/1,idx 160 没有,或者如果两者将保持不同。 如果您想即时重新着色图像,这可能会成为一个问题。如果您采用稍长的路线并根据需要更改游戏调色板,然后稍后使用相关的新调色板对表面进行 blit(或重新 blit),它应该可以可靠地工作。

    希望这很有用(尽管已经过了两年半了)!

    如果您想查看此答案的更长版本,请查看this link.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-28
      • 2014-12-29
      • 2012-06-23
      • 2021-12-03
      • 1970-01-01
      • 2022-01-04
      • 2012-09-14
      • 2012-07-02
      相关资源
      最近更新 更多