| Разработка и ромхакинг > Программирование |
| [SMD] SGDK |
| << < (39/42) > >> |
| SPOT:
Кто подскажет как используя --- Код: ---Map * MAP_create (const MapDefinition *mapDef, VDPPlane plane, u16 baseTile) --- Конец кода --- Назначать приоритет слоя отдельным тайлам на картинке? |
| DON:
в доке компилятора ресурсов сказано, что можно использовать https://github.com/Stephane-D/SGDK/blob/master/bin/rescomp.txt --- Цитата ---Tips: You can use the extra bits of 8 bit indexed image to specify extra information in the tilemap data but then you have to ensure that all pixel from a same tile (block of 8x8 pixels) use the same value otherwise rescomp will generate an error. bit 4-5: palette index (0-3) so it allows to use the 4 available palettes to draw your MAP. bit 6: should be 0 (not used) bit 7: priority information (0=LOW 1=HIGH) --- Конец цитаты --- Ясно? Если что гуглопереведи UPD: Очень кропотливая работа, если использовать те редакторы, которые использует 95% юзеров. То есть создав свою палитру с этими битам-шмитами, сможешь сделать тайлы всех вариантов (только они будут выглядеть странно на ПК из-за служебных битов в палитре.) Поэтому народ пишет свои редакторы тайловых карт, что не сложно. |
| SPOT:
Это я всё видел, мне неясно как на исходной картинке менять приоритет тайла. --- Код: ---bit 7: priority information (0=LOW 1=HIGH) --- Конец кода --- Вот каким инструментом и как это можно сделать? Учитывая, что исходным изображением является картинка уровня. |
| DON:
я там отредактировал. Ну не важно совершенно каким инструментом. у тебя есть палитра 16 цветов, например. оставляешь ее добавляешь на нужных местах в палитре новые цвета с учетом использования этих служебных битов. И рисуешь изображение "новыми цветами" для тех тайлов, где этот приоритет == 1. Рисовать можно любым редактором Photoshop, Gimp, Aseprite, GALE, MOTION ND и т.п. лишь бы палитра была indexed. И что важно, в каждом тайле 8х8 на рисунке цвета должны иметь одни и те же служебные биты. Чтобы ресурс компилер смог правильно тайлу выбрать номер палитры и приоритет. Мне скоро это понадобится самому. Я буду использовать Aseprite, скорее всего. + в 1.3 версии встроят TileEditor/ надеюсь, он тоже подойдет. Судя по скриншотам в интернете, разрабюотчики все используют свои самонаписанные редакторы для таких целей. УПД: А вообще на этот вопрос ответили 2 страницы назад. Там варианты решений с картинками ) + автор написал себе утилитку, которая все делает . https://www.emu-land.net/forum/index.php/topic,70308.720.html Нам такое не подходит. И да, палитру можно держать в спецальном отдельном файле, если что. |
| rep-stosw:
--- Цитата: SPOT от 31 Январь 2022, 09:33:50 ---Вот каким инструментом и как это можно сделать? Учитывая, что исходным изображением является картинка уровня. --- Конец цитаты --- Пришлось самому писать утилиту. Потому что из стандартных решений ничего не подошло. Уровни рисую в Tiled, два слоя - видимые (платформы по приоритетам), третий слой - для физики, плюс размещаю противников. Ниже скрин: T-образная платформа имеет приоритет ниже, чем спрайты. Остальные платформы -приоритет выше, чем у спрайта. |
| ALKOSHA:
Вынес ф-цию в отдельный модуль. В хэдере --- Код: ---#ifndef BACKGND_H_INCLUDED #define BACKGND_H_INCLUDED void update_box(); public void init_back(); public void update_back(); #endif // BACKGND_H_INCLUDED --- Конец кода --- В Си-файле backgnd.c --- Код: ---#include <genesis.h> #include "globalvar.h" #include "gfx.h" #include "sprite.h" public void init_back() { .. } и тд. --- Конец кода --- В каких случаях может выбивать такой эррор? --- Цитата ---src\backgnd.c|14|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'| --- Конец цитаты --- Добавлено позже: убрал "public", собралося. Странно. Ладно... |
| rep-stosw:
--- Цитата: ALKOSHA от 06 Февраль 2022, 18:48:37 ---убрал "public", собралося. Странно. Ладно... --- Конец цитаты --- В Си-шных хедерах слово public никогда не ставится. Это лишнее и приведёт к синтаксической ошибке. Добавлю: к переменным в хедере ставится слово extern. |
| Werton:
--- Цитата: ALKOSHA от 06 Февраль 2022, 18:48:37 ---В Си-файле backgnd.c Код: #include <genesis.h> #include "globalvar.h" #include "gfx.h" #include "sprite.h" public void init_back() { .. } и тд. --- Конец цитаты --- Еще #include "backgnd.h" забыл, ошибка конечно не из-за этого была, но всё же. |
| rep-stosw:
Вышел новый релиз SGDK v. 1.7 : https://github.com/Stephane-D/SGDK/releases/tag/v1.70 Кто-нибудь пробовал перенести свои существующие проекты на эту версию SDK ? У меня почему-то в игре в какой-то момент пропадают спрайты, карта уровня перестаёт прокручиваться, и всё повисает (кроме музыки) с этой версией SDK. Пока принял решение остаться на предыдущей версии (в которой собственно начинал делать свой проект) v. 1.65 , в которой проект идёт стабильно. Сделал "гибрид": компилятор ресурсов и папку bin взял с нового SDK. Сами библиотеки оставил от 1.65. P.S. В плане воспроизведения звуков - в новой версии XGM-движка всё также уныло, приходится передефайнить: --- Код: ---#define HALT_Z80_ON_DMA 0 /*1*/ #define HALT_Z80_ON_IO 0 /*1*/ --- Конец кода --- иначе звуки идут с хрипотцой, если есть одновременно манипуляции со спрайтами/скроллами плоскостей. Либо отказываться от DMA. |
| Werton:
--- Цитата: rep-stosw от 17 Февраль 2022, 02:02:21 ---Кто-нибудь пробовал перенести свои существующие проекты на эту версию SDK ? --- Конец цитаты --- Сейчас попробовал, вроде норм работает. --- Цитата: rep-stosw от 17 Февраль 2022, 02:02:21 ---У меня почему-то в игре в какой-то момент пропадают спрайты, карта уровня перестаёт прокручиваться, и всё повисает (кроме музыки) с этой версией SDK. --- Конец цитаты --- Ну как ты сам говорил :lol: --- Цитата: rep-stosw от 26 Январь 2022, 10:53:46 ---А если у вас НЕ does, то кто-то говнокодер! :lol: --- Конец цитаты --- Проверяй код, где то накосячил, возможно превысил лимиты ram или еще что. Посмотрел, у себя, после всех инициализаций в моем проекте на sgdk1.70 доступной ram примерно на 1 KB меньше чем в 1.65, т.е. фреймворк стал прожорливее, возможно этого килобайта тебе и не хватает. |
| ALKOSHA:
А вы пре-лоадед спрайтс юзаете ? Или на лету вытягиваете из ROM'а? Пытался вникнуть через примеры, чёто сложновато. Добавлено позже: Луууул :lol: |
| rep-stosw:
--- Цитата: ALKOSHA от 12 Март 2022, 22:05:49 ---А вы пре-лоадед спрайтс юзаете ? Или на лету вытягиваете из ROM'а? Пытался вникнуть через примеры, чёто сложновато. --- Конец цитаты --- Я юзал. В примере с Соником. Всё предельно ясно. :D |
| SERGK393:
Всем привет! Я совсем недавно в этой теме, но хотелось бы узнать, можно ли пропустить оригинальные звуки Соника (файлы bin) через SGDK? Вроде они в формате SMPS, но в данном SDK в списке драйверов нет SMPS. Ситуация такая: начал с примера Соника, там есть звук прыжка, переведенный с WAV, но на XGM звучит он очень коряво. Запускал с PCM драйвера - звучит лучше, но он музыку глушит. Файлы smps (бинарники из дизасма соника) не получилось прочитать. Вписывал как BIN, но в итоге шипит, притом неважно, какой файл будет вписан. Пробовал даже перевести из SMPS в MID, а MID в VGM (прямого переводчика не нашел) - mid не формируется нормальный. Пробовал перевести из WAV в MID - более-менее, но в VGM, оказывается, тоже не получилось (находил программы от двух разных разработчиков). Скажите, пожалуйста, возможно ли запустить в игре качественный звук прыжка, или любой другой (скольжение тоже плохо звучит)? Я все еще не изучил как следует, поэтому пока только тыкаюсь как в черный ящик. |
| SeregaZ:
--- Цитата: SERGK393 от 02 Апрель 2022, 02:32:02 ---можно ли пропустить оригинальные звуки Соника (файлы bin) через SGDK? --- Конец цитаты --- неа. нельзя. хотя я точно не знаю... если звук прыжка записан сэмплом в игре Соника - тогда можно. но я подозреваю что он записан FM звуком. спецэффекты - те-же прыжки, или стрельба - в SGDK, точнее его аудиодрайвер XGM - не умеет проигрывать если они FM или PSG. то есть все спецэффекты могут быть только сэмплами. следовательно надо записать оригинальный прыг Соника в вавку, после конвертануть в моно 14khz PCM и только потом загружать. ясное дело качество будет похуже, чем оригинальный FM или PSG звук. по поводу перевода из SMPS в MID и прочих, перечисленных извращений - это конечно тот еще анекдот :) в данном случае будут переводится ноты, но не сэмплы и не инструменты. поэтому смысла от этого никакого нет. и поэтому происходит шипение - потому что формат совсем другой. |
| SERGK393:
Начинаю потихоньку делать эксперименты с Соником в примере, нашел такой затык, после которого думаю, стоит ли дальше делать соника на Си или уж проще освоить хакинг. Скорость анимации здесь одинаковое для одного спрайта, в итоге нет разницы, когда Соник идет медленно, а когда быстро (до бега). Решил добавить анимацию из повторяющихся кадров (в итоге не 6, а 12 кадров), сделал на скорую руку в GIMPе, с расположением были огрехи (что, возможно, одинаковые кадры в анимации могли быть технически разными). В итоге анимация действительно теперь разная по скорости (как бы), но игра в целом стала идти не так плавно, как раньше. Вернул старый спрайт - плавность вернулась. Поэтому вопросы - 12 кадров в анимации - это для всей сеги в целом много? И влияет на работу так же, как здесь? Можно ли использовать анимацию своим способом, через асм, или проще сделать нормальный файл спрайта из повторяющихся кадров и будет работать хорошо? Так как видел, что асм код можно вставлять в Си, то реально ли подключиться к анимации и написать свою функцию в итоге? |
| Segaman:
SERGK393, я решил эту проблему отключением анимации и написанием своего таймера. таймер срабатывает и меняет кадр анимации. все |
| DON:
а зачем свой таймер отдельно? Если у каждого спрайта есть callback на смену кадра анимации. или ты про него и написал? типа кодить ничего не надо - просто там берешь и ставишь нужную величину |
| ALKOSHA:
Чего-то не понимаю, как задать начальный адрес графики под спрайт По-умолчанию он получается 6F80 Пытаюсь втулить SPR_setVRAMTileIndex, ничё не меняется. --- Код: --- u16 ind = BMP_FB1ENDTILEINDEX ; //TILE_USERINDEX; VDP_setPalette(PAL0, cabin.palette->data); VDP_drawImageEx(BG_A, &cabin, TILE_ATTR_FULL(PAL0, FALSE, FALSE, FALSE, ind),0, 0, FALSE, TRUE); ind += cabin.tileset->numTile; SPR_setVRAMTileIndex(&earth,ind ); SPR_init(); VDP_setPalette(PAL2, earth.palette->data); sprites[0] = SPR_addSprite( &earth ,160, 5, TILE_ATTR(PAL2, FALSE, FALSE, FALSE)); SPR_update(); SYS_doVBlankProcess(); --- Конец кода --- |
| Sharpnull:
ALKOSHA, оно вообще не должно компилироваться, вы передаёте earth в bool SPR_setVRAMTileIndex(Sprite* sprite, s16 value) и Sprite* SPR_addSprite(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut), где разный тип 1-го параметра. Вызов SPR_setVRAMTileIndex() должен быть после SPR_addSprite(). |
| ALKOSHA:
Тэээк-с... --- Код: --- Sprite *sprites[80]; ... SPR_init(); VDP_setPalette(PAL2, earth.palette->data); sprites[0] = SPR_addSprite( &earth ,160, 5, TILE_ATTR(PAL2, FALSE, FALSE, FALSE)); SPR_setVRAMTileIndex(sprites,ind); SPR_update(); SYS_doVBlankProcess(); --- Конец кода --- Ничего не поменялось. Оффсет адреса тот же. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |