Разработка и ромхакинг > Ромхакинг и программирование
[SMD] Палитра в Genesis
<< < (2/2)
bqio:
Не знаете, что может быть не так? На первом скрине то, что вытаскивается у меня, на втором оригинал.
Марат:
Что здесь не так можно сказать, только увидев код. Возможно, ты читаешь данные не побайтно, о по словам или лонгами и у тебя байты переворачиваются. Так видится по крайней мере
bqio:

--- Цитата: Марат от 11 Март 2023, 06:56:40 ---Что здесь не так можно сказать, только увидев код. Возможно, ты читаешь данные не побайтно, о по словам или лонгами и у тебя байты переворачиваются. Так видится по крайней мере
--- Конец цитаты ---
https://github.com/bqio/langrisser-sprites
Марат:
Не силён в питоне. Но вроде ничего такого в коде нет, что переворачивает байты. Может дамп кривой и в нём байты перевёрнуты. Попробуй открыть vram.bin в тайловом редакторе, если там всё нормально, то значит где-то в коде ошибка.
bqio:

--- Цитата: Марат от 11 Март 2023, 08:53:10 ---Не силён в питоне. Но вроде ничего такого в коде нет, что переворачивает байты. Может дамп кривой и в нём байты перевёрнуты. Попробуй открыть vram.bin в тайловом редакторе, если там всё нормально, то значит где-то в коде ошибка.
--- Конец цитаты ---
Вы оказались правы, оказывается у меня был повреждён vram.bin. Правда каким образом, не понятно. Сдампил через Gens 11 r57shell mod и всё корректно достаётся.  :neznayu:
Sharpnull:
bqio, по коду могу добавить.
CRAM_PATH = join("data", "cram.bin") можно записать как CRAM_PATH = "data/cram.bin", косая черта работает везде (Win, Linux) в отличие от обратной косой (возможно есть нюансы), ещё удобно использовать pathlib вместо os.path: CRAM_PATH = Path("data") / "cram.bin".
Вместо:

--- Код: ---    _tile.write(pk("<B", pixel[0]))
    _tile.write(pk("<B", pixel[1]))
    _tile.write(pk("<B", pixel[2]))
--- Конец кода ---
Проще _tile.write(pk("<BBB", *pixel)) или _tile.write(bytes(pixel)), а bytearray() вместо BytesIO() в данном случае, но по скорости не знаю.
Если записывать в tile_apply_pallete() не [(R,G,B),(R,G,B),...], а [R, G, B, R, G, B, ...], то вместо tile_to_buf() остаётся tile_buf = bytes(tile), в таком случае можно хранить цвета палитры как bytes, тогда в tile_apply_pallete() можно _tile = bytearray(); for pal_idx in tile: _tile += pallete[pal_idx >> 4] + pallete[pal_idx & 0xF]; return _tile, или сделать палитру сразу для двух цветов, чтобы _tile += pallete[pal_idx].
Можно не применять палитру вручную, а сохранять как индексированный PNG, тогда остаётся сделать преобразование индексов 0b12345678 > 0b00001234 0b00005678 и указать палитру.
UPD: Ещё заметил pallete_4bpp_to_rgb(up("<H", fp.read(2))[0]), т. е. в файле у вас палитра неправильная, потому что: hex(unpack("<H", b"\x01\x23")[0]) # = 0x2301.
Я бы всё писал проще в одном файле, для одноразового кода нормально :)
bqio:

--- Цитата: Sharpnull от 11 Март 2023, 14:08:04 ---Я бы всё писал проще в одном файле, для одноразового кода нормально
--- Конец цитаты ---
У меня фобия на распределение кода. Во всём остальном спасибо, посмотрю позже.  :)
Werton:

--- Цитата: Sharpnull от 11 Март 2023, 14:08:04 ---CRAM_PATH = join("data", "cram.bin") можно записать как CRAM_PATH = "data/cram.bin", косая черта работает везде (Win, Linux) в отличие от обратной косой (возможно есть нюансы)
--- Конец цитаты ---
Можно, но не нужно :) на винде не рекомендуется это делать, хоть сам питон это прожёвывает, но сторонние библиотеки могут не поддерживать замену слэша на обратный.
Yoti:

--- Цитата: Sharpnull от 11 Март 2023, 14:08:04 ---косая черта работает везде (Win, Linux)
--- Конец цитаты ---
os.sep то отменили уже?
Sharpnull:

--- Цитата: Yoti от 11 Март 2023, 22:44:19 ---os.sep то отменили уже?

--- Конец цитаты ---
Если вопрос без издёвки, то os.sep работает и для совместимости со старыми версиями Python пригодится, но здесь вопрос удобства, через pathlib можно написать с таким результатом под Win:

--- Код: --->>> from pathlib import Path
>>> p = Path("data") / "1.bin"
>>> p
WindowsPath('data/1.bin')
>>> str(p)
'data\\1.bin'
--- Конец кода ---
Т. е. можно использовать и для пакетов, которые не работают с '/' или не должны, если вызовы Windows API или использование обычных DLL, или т. п. Я пишу для себя под Win, а '\\' - не удобно.
Вообще я не слежу за развитием Python, много чего добавляют.
bqio:
Sharpnull, не подскажите, как можно превратить 8x8 тайлы в 16x16 через Pillow?

https://gist.github.com/bqio/768a7bb9a805c9c45c614b27aef82cf4
Sharpnull:

--- Цитата: bqio от 14 Март 2023, 13:34:01 ---как можно превратить 8x8 тайлы в 16x16 через Pillow?

--- Конец цитаты ---
Не понятно что именно нужно. PIL не работает с тайлами, все преобразования для получения обычной картинки, где пиксели идут слева направо и сверху вниз, нужно делать самому. Скорее всего есть пакеты/код для работы с тайлами, но самому не проблема сделать. Если речь про увеличение картинки 8x8 > 16x16, есть resize(). Если нужно 4 тайла 8x8 расставить слева направо и сверху вниз, пишите обычный код на Python, например во внешнем цикле вычисляйте X, Y верхнего левого угла тайла в конечной картинке (16x16) и от него записывайте тайл. Возможно проще использовать возможность PIL писать в пиксели по X, Y (https://pillow.readthedocs.io/en/stable/reference/PixelAccess.html). Для общего кода можно сделать метод, который принимает тайлы (tileset), размер карты (map) и индексы тайлов (tilemap), для вдохновения можно посмотреть формат в программе Tiled.
UPD: Ещё есть ленивый, но скорее всего медленный вариант. У вас есть в конце кода готовый тайл (image), можно сделать так 4 раза и наложить эти 8x8 тайлы как отдельные картинки на картинку 16x16 через PIL, только указать X, Y угла (https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.paste). Для 16x16 можно использовать в цикле готовые координаты: ((0,0), (8,0), (0,8), (8,8)).
bqio:

--- Цитата: Sharpnull от 14 Март 2023, 17:13:15 ---Не понятно что именно нужно. PIL не работает с тайлами, все преобразования для получения обычной картинки, где пиксели идут слева направо и сверху вниз, нужно делать самому. Скорее всего есть пакеты/код для работы с тайлами, но самому не проблема сделать. Если речь про увеличение картинки 8x8 > 16x16, есть resize(). Если нужно 4 тайла 8x8 расставить слева направо и сверху вниз, пишите обычный код на Python, например во внешнем цикле вычисляйте X, Y верхнего левого угла тайла в конечной картинке (16x16) и от него записывайте тайл. Возможно проще использовать возможность PIL писать в пиксели по X, Y (https://pillow.readthedocs.io/en/stable/reference/PixelAccess.html). Для общего кода можно сделать метод, который принимает тайлы (tileset), размер карты (map) и индексы тайлов (tilemap), для вдохновения можно посмотреть формат в программе Tiled.
UPD: Ещё есть ленивый, но скорее всего медленный вариант. У вас есть в конце кода готовый тайл (image), можно сделать так 4 раза и наложить эти 8x8 тайлы как отдельные картинки на картинку 16x16 через PIL, только указать X, Y угла (https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.paste). Для 16x16 можно использовать в цикле готовые координаты: ((0,0), (8,0), (0,8), (8,8)).
--- Конец цитаты ---

Ну то есть вы вот так имели ввиду, да? Всё получилось, спасибо  :)

https://gist.github.com/bqio/768a7bb9a805c9c45c614b27aef82cf4

Во вложениях результат работы. Но по-моему я всё-таки где-то накосячил в палитре.  :neznayu:
Sharpnull:

--- Цитата: bqio от 15 Март 2023, 06:44:51 ---Ну то есть вы вот так имели ввиду, да?
--- Конец цитаты ---
Да, только цикл вместо повторов по 3 раза строчек кода.

--- Цитата: bqio от 15 Март 2023, 06:44:51 ---Но по-моему я всё-таки где-то накосячил в палитре
--- Конец цитаты ---
Ну так сравните с оригиналом. Кстати, 0-й цвет - прозрачный, поэтому стоит сделать его прозрачным или классической маджентой.
Навигация
Главная страница сообщений
Предыдущая страница

Перейти к полной версии