Разработка и ромхакинг > Программирование
[SMD] SGDK
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();
--- Конец кода ---
Ничего не поменялось. Оффсет адреса тот же.
Навигация
Перейти к полной версии