3

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

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

在此处输入图像描述

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

4

2 回答 2

0

您可以使用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)。

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

如果您想查看此答案的更长版本,请查看此链接。

于 2014-12-14T06:38:54.920 回答
0

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

于 2012-02-15T05:35:34.297 回答