给调色板图像分配不同的调色板索引

3
我正在使用Python和Pygame编写游戏。因此,图像的风格将类似于NES等旧视频游戏控制台。图形由一个包含2位(4色)图像的单个tileset文件组成,并且我想能够在加载它们时将任意4色调色板分配给这些图像。
我的目标是使用8位(256色)调色板模式,其中我将调色板分为64个4种颜色的子调色板。每次从2位图形文件中加载16x16 tile时,我都想将这些虚拟的4色调色板中的一个分配给它。因此,在原始tile set文件中,调色板索引将为0-3,因为它是2位索引文件。我想将文件中的tiles加载到内存中,并使用函数将调色板索引从0-3重新分配到我选择的任何调色板偏移量,以便在将其blit到屏幕上时,它着色为我选择的4色调色板--就像NES硬件的工作方式一样。这有点棘手,所以也许这张图片会更清晰地解释这个过程:
https://istack.dev59.com/L5wh9.webp 我已经查阅了Pygame和PIL的手册,但没有找到任何可以像这样操作调色板文件的内容。是否有其他库可供参考,或者我没有看到的更简单的解决方案?

我发现如果我在真彩色模式下运行游戏,可以使用Pygame的PixelArray.replace作为解决方法。这可能有效,但如果有更优雅的方法,我仍然想知道如何实现。 - egj
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 的图像调色板,而不是直接替换目标表面的索引。这更加复杂,因为我不知道如何重新着色具有重复索引 RGBA 值的像素。(例如,如果调色板14/2和调色板40/1都是(90,91,200,255),我不知道pygame是否会将所有具有该RGBA值的像素分配给调色板索引57(从Pal14/2),而不会分配给Pal40/1的idx160,还是这两者将保持独立) 如果您想在运行时重新上色图像,则可能出现问题。如果您采取稍微长一点的路线并根据需要更改游戏调色板,然后稍后使用相关的新调色板 blit (或重新 blit) 表面,它应该可以可靠地工作。
希望这对你有用(即使已经过去两年半以上了)!
如果您想查看此答案的更长版本,请查看this link.

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接