2012-02-03 44 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.