为调色板图像指定不同的调色板索引

时间:2012-02-03 09:10:01

标签: python pygame palette

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

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

enter image description here

我查看了Pygame和PIL的手册,发现没有什么可以让我像这样操纵调色板文件。有没有其他的库可以查看,或者是否有一个我没有看到的更简单的解决方案?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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,或者两者将保持不同。 如果您想要动态重新着色图像,这可能会成为一个问题。如果你采用稍长的路线并根据需要改变游戏调色板,那么它应该可靠地工作,然后用相关的新调色板快速(或重新加入)表面。

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

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