| Разработка и ромхакинг > Ромхакинг и программирование |
| PVSnesLib (библиотека для разработки игр под SNES на языке C) |
| (1/2) > >> |
| worm:
Взбрело мне, значит, в голову пощупать SNES - начал гуглить. Наткнулся на некий аналог SGDK. В настройке прост, все демки собираются без ошибок (редкость для такого искателя новых ощущений, как я). Ссылка на библиотеку Пока все, что у меня получается - это вывести глючную половину картинки на экран и поглумиться над hello, world'ом, вписав туда слово sega :lol: Собственно, если кто шарит, можете рассказать нубу, почему часть картинки забагована. На сеге подобное обусловлено нехваткой вдп или выделенной памяти, но снес - это не сега и по части видео она должна тащить. p.s. доки читал, иначе откуда бы я знал, что снес поддерживает многочисленные видеорежимы и то, что у нее аж 4 слоя графики :D p.p.s юбилейный, 700-й пост. |
| Sharpnull:
--- Цитата: worm от 24 Апрель 2018, 18:55:48 --- На сеге подобное обусловлено нехваткой вдп или выделенной памяти, но снес - это не сега и по части видео она должна тащить. --- Конец цитаты --- У сеги и снес по 64KB VRAM. Скорее всего вы просто съели всю VRAM, потому что видно, что на картинке много цветов, а тайлы не повторяются. Даже в Ultimate Mortal Kombat 3 на SNES такое красивое лого не выводят, а используют более скромное (либо просто из-за размеров). Если выложите исходник, сразу всё станет понятно. |
| worm:
--- Цитата: Sharpnull от 25 Апрель 2018, 01:05:02 ---У сеги и снес по 64KB VRAM. --- Конец цитаты --- Спасибо, что пролили свет на истину. Я всегда думал, что снес - это очень мощная махина, которая превосходит сежку как минимум в 2 раза. :( --- Цитата: Sharpnull от 25 Апрель 2018, 01:05:02 ---Скорее всего вы просто съели всю VRAM --- Конец цитаты --- Выходит, что так. Моему разочерованию нет предела :lol: --- Цитата: Sharpnull от 25 Апрель 2018, 01:05:02 ---Если выложите исходник, сразу всё станет понятно. --- Конец цитаты --- Я использую код демки СДК, вывод изображения по 3-му режиму, вот ее код... --- Код: ---#include <snes.h> extern char patterns,patterns1,patterns1_end; extern char palette; extern char map, map_end; //--------------------------------------------------------------------------------- int main(void) { // Initialize SNES consoleInit(); // Read tiles to VRAM in 2 phases because we are more than 32k bgInitTileSet(0, &patterns, &palette, 0, 0x8000, 256*2, BG_256COLORS, 0x0000); WaitForVBlank(); dmaCopyVram(&patterns1, 0x4000, (&patterns1_end-&patterns1)); // Copy Map to VRAM bgInitMapSet(0, &map, (&map_end - &map),SC_32x32, 0x6000); // Now Put in 256 color mode and disable other BGs except 1st one setMode(BG_MODE3,0);; bgSetDisable(1); setScreenOn(); // Wait for nothing :P while(1) { WaitForVBlank(); } return 0; } --- Конец кода --- Кстати, довольно странный этот СДК - теперь если я пытаюсь прилепить свой 256-цветный bmp, то компилятор выдает --- Код: ---data.asm:5: INCBIN_FILE: Overreading file "pvsneslib.pic". data.asm:5: ERROR: Couldn't parse ".incbin". --- Конец кода --- Ранее такого не наблюдалось - может руки стали еще более кривыми? :lol: |
| Sharpnull:
worm, код такой же значит. Пример с оригинальной картинкой правильно выводился? Я предположил что съедается VRAM, но вообще её должно хватить на отображение картинки, остаётся вариант с форматом картинки. Про ошибку, может нужно сделать make clean? Там как раз удаление этих файлов: @rm -f $(OFILES) $(TARGET).sfc *.pic *.pal *.map Установил SDK, bmp должен быть без сжатия. -------- Всё ещё хуже, этот криворукий SDK чувствителен к формату bmp, нужно как-то специфически подготавливать файл. |
| worm:
--- Цитата: Sharpnull от 25 Апрель 2018, 08:58:45 ---bmp должен быть без сжатия --- Конец цитаты --- Разве у bitmap есть сжатие? Ни одна графическая программа, что я знаю, не показывает параметры сжатия bmp перед output'ом изображения. Как же ее "разжать"? |
| Sharpnull:
worm, проблема не только с сжатием. Но если что, фотошоп при сохранении даёт опцию Compress (RLE). В XnView можно изменять настройку сохранения тоже. Проблема глубже, я беру файл из примера, открывают в фотошопе. Рисую тонкую линию карандашом из цвета, который уже есть в файл. Сохраняю/компилирую, не отображается несколько тайлов внизу. Снова редактирую в фотошопе, теперь рисую большой прямоугольник из того же цвета. Сохраняю, но уже не компилируется. В общем, ему важен набор тайлов. Я сначала думал проблема в метаданных (размер при печати), но это не так. -------- Может это нормальное поведение и нужно просто читать спецификацию :) |
| worm:
--- Цитата: Sharpnull от 25 Апрель 2018, 10:55:15 ---фотошоп при сохранении даёт опцию Compress (RLE) --- Конец цитаты --- Это видел, но она была выключена изначально, что и сбило меня с толку. --- Цитата: Sharpnull от 25 Апрель 2018, 10:55:15 ---В общем, ему важен набор тайлов. --- Конец цитаты --- Иными словами, я вляпался в кое-что нехорошее (образно, конечно, не в адрес СДК - скорее, самоирония) :lol: Сейчас попробую нарисовать картинку из нескольких одинаковых тайлов... upd. нет. нарисовал ему pixel-perfect картинку, все равно недоволен. Ошибка и все тут. Ладно, может со временем прояснится ситуация. Будет здорово, если людей заинтересует эта библиотека и тема разовьется. |
| Sharpnull:
worm, можно не мучиться с bmp, в Makefile изменить pvsneslib.bmp на pvsneslib.png и -fbmp на -fpng здесь: --- Код: ---pvsneslib.pic: pvsneslib.bmp @echo convert bitmap ... $(notdir $@) $(GFXCONV) -pc256 -n -gs8 -pe0 -fbmp -m $< --- Конец кода --- Там сжатие поддерживается, но такой же печальный результат, если картинка неверно сформирована. |
| worm:
--- Цитата: Sharpnull от 25 Апрель 2018, 11:18:01 ---такой же печальный результат, если картинка неверно сформирована. --- Конец цитаты --- Напишу автору библиотеки на гитхаб. Интересно, чем он рисует. |
| Sharpnull:
worm, судя по скрину из https://github.com/alekmaul/pvsneslib/wiki/Sprites он рисует в GraphicsGale. |
| worm:
--- Цитата: Sharpnull от 25 Апрель 2018, 11:29:31 ---worm, судя по скрину из https://github.com/alekmaul/pvsneslib/wiki/Sprites он рисует в GraphicsGale. --- Конец цитаты --- И на ней как раз очень убогая индексация изображений :( Хотя можно в ней переиндексировать уже готовый вариант... upd. и она тоже неподходящий формат выдает. |
| Sharpnull:
worm, я разобрался. В общем, если тайлов (разных) мало в файле, то размер pvsneslib.pic меньше 32KB, а в data.asm идёт разбивка на два каких-то раздела. Если файл меньше 32KB, нужно в data.asm написать такое, по аналогии из Mode1Png: --- Код: ---.include "hdr.asm" .section ".rodata1" superfree patterns: .incbin "pvsneslib.pic" patterns_end: .ends .section ".rodata2" superfree map: .incbin "pvsneslib.map" map_end: palette: .incbin "pvsneslib.pal" .ends --- Конец кода --- И такой код Mode3.c: --- Код: ---#include <snes.h> extern char patterns,patterns_end; extern char palette; extern char map, map_end; //--------------------------------------------------------------------------------- int main(void) { // Initialize SNES consoleInit(); bgInitTileSet(0, &patterns, &palette, 0, (&patterns_end - &patterns), 256*2, BG_256COLORS, 0x0000); // Copy Map to VRAM bgInitMapSet(0, &map, (&map_end - &map),SC_32x32, 0x6000); // Now Put in 256 color mode and disable other BGs except 1st one setMode(BG_MODE3,0);; bgSetDisable(1); setScreenOn(); // Wait for nothing :P while(1) { WaitForVBlank(); } return 0; } --- Конец кода --- Если файл больше 32KB, то оставляете как было, но вместо 6976 в data.asm: --- Код: ---patterns1: .incbin "pvsneslib.pic" skip 32768 read 6976 --- Конец кода --- вставляете: N - 32768, где N - размер файла pvsneslib.pic, который получите после make clean, make. -------- То есть нужно подбирать под каждую картинку размер в data.asm :) -------- По-моему rodata2 и rodata3 можно заменить на rodata1 и rodata2. SGDK всё-таки попроще будет, там не заставляют делать такие непристойности. -------- Пара замечаний по установке PVSnesLib: Если Python 2 уже установлен по пути с пробелами, шебанг не позволяет вставлять такие пути, то можно просто скопировать папку с установленным Python в место без пробелов, например в ту же папку с PVSnesLib. Прописывать msys/bin в PATH необязательно, даже не стоит, потому что у меня возник конфликт с другими SDK. Я просто создал bat-файл где написал: --- Код: ---SET PATH=C:\snesdev\msys\bin C:\Windows\System32\cmd.exe --- Конец кода --- Таким образом устанавливается путь и убираются остальные пути, конечно это работает только в пределах этой консоли. -------- Обновил код для файла с картинкой меньше 32KB, почти как в Mode1Png, только размер палитры (256*2) вводится вручную, и особенности режима Mode3. |
| worm:
И правда - когда пихаешь жирный файл с кучей разных тайлов, компилится без проблем. Спасибо :) Надеюсь, что в будущем, разраб автоматизирует это дело... upd. я так понимаю, что у снес еще меньше VDP, чем у сеги. Одну и ту же картинку выставил на снес и на сеге. 16 и 16 цветов. При том, что я обрезал часть изображения для снес, чтобы подходило под 256x224, снес все равно загрузила ее неполноценно, сега же справилась без проблем. Единственное, чем снес порадовала - палитра. По части палитры сеге со снес действительно не тягаться :) |
| gegmopo3:
Пол картинки занимает больше 32 кб, а DMA за один сканлайн может отправить только 32 кб (0x8000), по тому и картинка не корректна. По мне, так лучше на асме писать, и код твой и оптимизировано, а то после С, он такой хлам не нужный выдает. Если дебажить начинаешь, то охота плакать. VPD такой же, как у сеги, 64кб. Но в сеги в VPD еще таблица спрайтов хранится, а вот в снес ее нет (в врам), так-что на несколько сот байт больше. |
| worm:
--- Цитата: gegmopo3 от 26 Апрель 2018, 18:54:36 ---По мне, так лучше на асме писать --- Конец цитаты --- Это, конечно, в идеале, но С примечателен тем, что универсален и чертовски удобен (в ущерб оптимизации, правда :( ) --- Цитата: gegmopo3 от 26 Апрель 2018, 18:54:36 ---Если дебажить начинаешь, то охота плакать. --- Конец цитаты --- Все верно. Я, к примеру когда свои SGDK ромы вскрываю ради любопытства, начинаю фейспалмить... Новая платформа для изучения - это всегда новый мир неизведанного. Все таки язык С не зря придумали. Да, он генерит ужасный код, полный мусора и костылей, но все же это работает, да и разрабам игр легче - не нужно 100500 асмов учить :lol: |
| Sharpnull:
--- Цитата: worm от 26 Апрель 2018, 19:12:09 ---он генерит ужасный код --- Конец цитаты --- Не он. |
| worm:
--- Цитата: Sharpnull от 26 Апрель 2018, 21:20:46 ---Не он. --- Конец цитаты --- Генерит то он, а вот код для этой генерации уже пишет "прекрасный" программист :lol: |
| Werton:
--- Цитата: worm от 27 Апрель 2018, 00:49:54 ---Генерит то он --- Конец цитаты --- Или все-таки компилятор? |
| worm:
Что-то автор забросил библиотеку свою - печально... :( Все таки то, чего не касался капитализм, в 90% обречено на провал. --- Цитата: Werton от 27 Апрель 2018, 05:58:33 ---Или все-таки компилятор? --- Конец цитаты --- По словам многих моих знакомых программистов, сейчас компиляторы генерят такой крутой код, что не каждый программист так сможет написать. В особенности, хвалят C++. Один мой друг на нем даже игру на сегу писать начал, а был заядлым приверженцем ассемблера. |
| megavolt85:
worm, да компиляторы конечно сейчас на высоте, но зачастую невозможно написать всё на сях или си++, как ни крути но без асмы никак ну и для ретро консолей С++ не лучший выбор, не берусь говорить за все консоли, но CPP компиляторы для megadrive и dreamcast убоги и лучше их не использовать |
| Навигация |
| Главная страница сообщений |
| Следующая страница |