2012-02-03 109 views
3

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

我想要做的是使用8位(256色)调色板模式,并将调色板分成64个子调色板,每个调色板分别具有4种颜色。每次我从2位图形文件中加载16x16的图块时,我都想为其分配一个虚拟4色调色板。因此,在原始瓷砖集文件中,调色板索引将为0-3,因为它是一个2位索引文件。我想从这个文件加载瓷砖到内存中,并使用一个函数重新分配调色板索引从0-3到我选择的任何调色板偏移量,这样当我将它投影到屏幕上时,它会以我选择的4色调色板 - 非常类似于NES硬件作品。这变得有点毛茸茸的解释,也许这张照片使得它更清晰一点:

enter image description here

我环顾四周pygame的和PIL的手册,并没有发现任何让我处理这样的调色板文件。是否还有其他库需要研究,或者我没有看到更简单的解决方案?

+0

我发现我可以在Pygame中使用PixelArray.replace作为解决方法,如果我以真彩色模式运行我的游戏。这可能会起作用,但如果可以更优雅地做到这一点,我仍然想知道如何。 – egj 2012-02-03 11:33:28

回答

0

你可以用pygame.Surface.set_palette_at()做到这一点。你的情况,你有四种颜色的64块,所以recolour特定块,你可以使用:

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 images'调色板,而不是直接替换目标表面的索引。更复杂,因为我不知道如何重新着色具有重复索引RGBA值的像素。 (例如,如果调色板14/2和调色板40/1都是(90,91,200,255),例如我不知道pygame是否会将具有该RGBA值的所有像素分配给调色板索引57(来自Pal14/2)和如果你想在飞行中重新着色图像,这可能会成为一个问题,如果你采取略长的路线并改变游戏调色板,它应该可靠地工作根据需要,然后块传送(或重块传送)表面与后来的有关新的调色板。

希望这是有益的(即使它是远远超过两年半后)!

如果你想看到一个此答案的更长版本,请查看this link.