Назначение разных индексов палитры для изображения с палитрой - PullRequest
3 голосов
/ 03 февраля 2012

Я пишу игру с Python и Pygame.Для этого графика будет в стиле старых игровых приставок, таких как NES.Поэтому графика состоит из одного файла набора мозаичных изображений с 2-битными (4-цветными) изображениями, и я хочу иметь возможность назначать для этих изображений произвольную 4-цветную палитру при загрузке.

Что яхочу использовать режим 8-битной (256-цветовой) палитры, с палитрой, которую я разделил на 64 подпалитры по 4 цвета в каждой.Каждый раз, когда я загружаю плитку 16x16 из 2-битного графического файла, я хочу назначить ему одну из этих виртуальных 4-цветных палитр.Таким образом, в файле набора необработанных плиток индексы палитры будут 0-3, потому что это 2-битный индексированный файл.Я хочу загрузить плитки из этого файла в память и использовать функцию для переназначения индексов палитры от 0-3 до любого смещения палитры, которое я выберу, чтобы при перетаскивании его на экран оно окрашивалось в мой выбор из 4 цветовпалитра - так же, как работает оборудование NES.Это немного сложно для объяснения, поэтому, возможно, эта картина немного яснее:

enter image description here

Я просмотрел руководства Pygame и PIL и не нашел ничего, что позволяло бы мне манипулироватьпалитры файлов, как это.Есть ли какие-нибудь другие библиотеки, на которые стоит обратить внимание, или я не вижу более простого решения?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2014

Вы можете сделать это с помощью pygame.Surface.set_palette_at().В вашем случае у вас есть четыре цвета для шестидесяти четырех блоков, поэтому, чтобы перекрасить конкретный блок, вы можете использовать:

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) инет для idx 160 для Pal40 / 1, или если они останутся разными. Это может стать проблемой, если вы хотите перекрасить изображения на лету. Это должно работать надежно, если вы выберете немного более длинный маршрут и измените палитру игры какнеобходимо, а затем свернуть (или повторно свернуть) поверхности соответствующими новыми палитрами позже.

Надеюсь, что это полезно (даже если прошло более двух с половиной лет)!

Если вы хотитечтобы увидеть более длинную версию этого ответа, проверьте эту ссылку.

0 голосов
/ 15 февраля 2012

Хотя я лично этого не делал, в PyGame я считаю, что вы ищете: http://pygame.org/docs/ref/surface.html#Surface.set_palette

...