Автор Тема: SGDK  (Прочитано 78334 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #420 : 30 Январь 2019, 19:50:04 »
но фпс маловато
Там рейкастинг использует неэффективный постоянный шаг, если сделать по уму, то должно быть не меньше 20 FPS. Я просто сразу не осилил и не тратил время. Плюс можно доп. оптимизации сделать, в том числе fix32 на fix16 заменить, но тогда макс. размер уровня 256x256. Конечно на ASM стабильные 30FPS с простым геймплеем возможны.
Е.В. Шишкин, А.В. Боресков - Компьютерная графика - 2001
Читал немного начало, тогда мне тоже показалась хорошей. На русском таких книг в принципе не много и все старые.
--------
ALKOSHA, я забыл сказать одну идею: можно сделать половинки тайлов, тогда градации высоты увеличатся на 2.

Оффлайн ALKOSHA

  • Пользователь
  • Сообщений: 805
  • Люблю донди.
    • ВКонтакте
    • Просмотр профиля
Настройка SGDK
« Ответ #421 : 30 Январь 2019, 19:50:53 »
Линейная матеша тема очень жоская для меня, в рейкастинге я теоретик.
Но в мега-шустрое псевдо-3д на основе тайлов я верую. Тайлы - это стихия сеги (как и любой другой консоли тех лет).
https://youtu.be/XZljQT8k3Wg?t=1265

Добавлено позже:
Да чё там "псевдо"
На тайлах даже полноценное 3д вполне реально, если даже спектрум это дело тянет. Чего уж говорить про сегу.
https://youtu.be/weFH_y1LGBw?t=207

Добавлено позже:
я забыл сказать одну идею: можно сделать половинки тайлов, тогда градации высоты увеличатся на 2.

На ZX и такое встречал в демах, уменьшение размера атрибутов за счёт мультиколора.

Но опять же, Z80-ому для этого дела надо впрягаться по полной, а в сеге на это отведён VDP.
« Последнее редактирование: 30 Январь 2019, 20:02:41 от ALKOSHA »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #422 : 30 Январь 2019, 20:10:56 »
Но в мега-шустрое псевдо-3д на основе тайлов я верую. Тайлы - это стихия сеги (как и любой другой консоли тех лет).
https://youtu.be/XZljQT8k3Wg?t=1265
Вроде, деревья - горизонтальный скроллинг, фон и земля - вертикальный. Гениально. Правда впечатляющих козырей у сеги не много, в Overdrive 2 показано наверно максимальное на что способна приставка.

Оффлайн ALKOSHA

  • Пользователь
  • Сообщений: 805
  • Люблю донди.
    • ВКонтакте
    • Просмотр профиля
Настройка SGDK
« Ответ #423 : 30 Январь 2019, 20:17:12 »
Деревья - скроллинг? Разве?
Там одно дерево относительно другого смещается. То есть на одном из слоёв тайлы обновляются раз за разом, а не скроллятся, вроде как.
Скроллами анимированы фон/земля + имитация наклона камеры + руль мотака построчными скроллами.

А сцена эта ни что иное как калька всё с того же спектрума.
И это 83-ий год, а какой шустрый графон. Тем более делалось для ранних 16кб тачек.
https://youtu.be/snpr8hFIf3U


Добавлено позже:
в Overdrive 2 показано наверно максимальное на что способна приставка.

Да, видел, мощнейшее, особенно зум фракталов заставляет лезть глаза на лоб 0_0. Жаль демка требует дешифратор банков памяти Street Fighter 2 и аж 8 метров флехи.

Ну и полигональное 3д в конце можно было бы развить в полноценную игру. Но никто, конечно, этим заниматься, увы, не станет.
« Последнее редактирование: 30 Январь 2019, 20:36:44 от ALKOSHA »

Оффлайн Skay

  • Пользователь
  • Сообщений: 4121
  • Пол: Мужской
    • Просмотр профиля
Настройка SGDK
« Ответ #424 : 31 Январь 2019, 10:26:39 »
Sharpnull

Оффлайн mgdriver

  • Пользователь
  • Сообщений: 2
    • Просмотр профиля
Настройка SGDK
« Ответ #425 : 12 Март 2019, 17:26:23 »
   Привет всем форумчанам! 
   Помните уровень от первого лица в Toy story (SMD), там где в лабиринте надо было на время найти всех игрушек-инопланетян?  Так вот создатель этой игры на своём ютуб канале показывал исходник этого уровня на ассемблере. Здесь прикрепляю видео файл, если разбить его на кадры, то можно разобрать практически весь исходник.
Код снабжён комментариями, а в конце файла есть также и карта самого уровня в текстовом представлении.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #426 : 12 Март 2019, 17:52:23 »
mgdriver, дали бы ссылку на видео сразу:
Осталось только выучить ASM.

Оффлайн mgdriver

  • Пользователь
  • Сообщений: 2
    • Просмотр профиля
Настройка SGDK
« Ответ #427 : 12 Март 2019, 19:11:27 »
Осталось только выучить ASM.

Это да.  (Ну может кому-то и сгодится этот сурс.)

Оффлайн xenudo

  • Пользователь
  • Сообщений: 5
    • Просмотр профиля
Настройка SGDK
« Ответ #428 : 13 Март 2019, 00:17:33 »
https://yadi.sk/d/FDqrrtTQumvDHw дальше сами: удалить красный цвет с иллюстраций, а потом можно пытаться что то распознать лол. Самых первых и самых последних строк на кадрах нет.

Оффлайн m4x1k

  • Пользователь
  • Сообщений: 36
    • Просмотр профиля
Настройка SGDK
« Ответ #429 : 15 Март 2019, 22:37:18 »
Подскажите, плжалуйста, как в SGDK можно легче всего затемнить/осветлить цвет? К примеру, на заднем фоне есть вывеска, цвет палитры изначально неизвестен, поэтому загружать в цикле заранее готовые палитры не получится. На заднем плане, нужно сделать цикл, чтобы цвет моргал на три-четыре тона ярче, тускнее. От неё же блики на некоторые объекты. То есть не вся палитра должна меняться, а лишь несколько цветов из палитры заднего фона.
Все функции Fade работают по полной палитре и до полного затемнения экрана.

Сейчас сделал задуманное через прерывание Фейда. Более-менее на безрыбье, но темнится вся палитра в слоте. Ищу универсальный способ.

Теоретически можно для каждого цвета в палитре использовать SetColor, но там нужна замудрёная формула, которая будет по 9 битам из нынешнего цвета высчитывать оттенок ниже/выше...

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #430 : 16 Март 2019, 04:08:45 »
m4x1k, алгоритм есть в исходном коде, можно сделать на основе него. VDP_fade() - общая функция, там в fromcol и tocol задаются начальный и конечный индексы из палитр (0-63). Если индексы цветов идут подряд и нужно одновременно затенять/осветлять только одну последовательность, то всё просто.  Если вы не собираетесь менять другие цвета в палитре, то можно пропускать произвольные индексы, для этого в конечную палитру нужно поставить те же начальные значения, тогда они не будут изменяться.

По коду алгоритм преобразования цветов несложный, обычная интерполяция. В VDP_initFading() задаются массивы начального цвета fading_palR/G/B и шаг fading_stepR/G/B. Шаг равен (цвет_конечный - цвет_начальный) / количество_кадров и хранится как s16 с 8 битами дробной части. В VDP_doFadingStep() прибавляется шаг, а в setFadePalette() компоненты цвета округляются, отбрасывается дробная часть и объединяются в конечный цвет.
прерывание Фейда
Что это?

Кстати, не так давно имена функций fade изменились, так что не забывайте обновлять SGDK. И вместо:
#define fix32Mul(val1, val2)        (((val1) * (val2)) >> FIX32_FRAC_BITS)стало
#define fix32Mul(val1, val2)        (((val1) >> (FIX32_FRAC_BITS / 2)) * ((val2) >> (FIX32_FRAC_BITS / 2)))Что менее подвержено переполнению, хотя на одну операцию и больше.

Оффлайн m4x1k

  • Пользователь
  • Сообщений: 36
    • Просмотр профиля
Настройка SGDK
« Ответ #431 : 16 Март 2019, 05:41:08 »
Что это?
VDP_interruptFade, тормозит выполнение функции.

Дело в том, что сам Fade работает немного не так, что хотелось бы. Fade затемняет цвет и может в момент притухания из коричнего, к примеру, тёмнозелёный цвет сделать.
Но всё равно, ответ очень помог, не додумался под себя изменить функцию.

Sharpnull, ответьте, если не сложно, ещё на пару вопросов.

Скажите, пожалуйста, а в sgdk поддержка Sega Cd присутствует, помимо аудиодорожек? Интересует именно увеличение объёма данных в игре. Сейчас на 4мб не разгуляешься. Я ранее читал, что на маппере от SSFII можно РОМ до 32мб сделать, есть в sgdk поддержка подобного?

Каким образом изображения редактируете? Через Фотошоп палитра постоянно выстраивается таким образом, что чёрный цвет оказывается самым дальним. И потом приходится вручную редактировать палитру, дабы выставить его первым. Есть какой-то более удобный способ?

Оффлайн Ogr

  • Пользователь
  • Сообщений: 7489
    • Просмотр профиля
Настройка SGDK
« Ответ #432 : 16 Март 2019, 06:41:52 »
Каким образом изображения редактируете? Через Фотошоп палитра постоянно выстраивается таким образом, что чёрный цвет оказывается самым дальним. И потом приходится вручную редактировать палитру, дабы выставить его первым. Есть какой-то более удобный способ?
в фотошопе перед конвертации в ргб и редактированием сохраняешь палитру, потом при индексации цветов её загружаешь.
« Последнее редактирование: 16 Март 2019, 07:05:28 от Ogr »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #433 : 16 Март 2019, 08:01:02 »
Сейчас на 4мб не разгуляешься. Я ранее читал, что на маппере от SSFII можно РОМ до 32мб сделать, есть в sgdk поддержка подобного?
У SSFII смена банков. Stef (разработчик SGDK), сделал демо BadApple на 8MB без смены банков. Исходный код (bin на 8MB). Там же MetalliC (присутствует на нашем форуме) пишет про поддержку в Mega Everdrive. Проверил эмуляторы: Fusion, Genesis Plus GX, Exodus - не поддерживают; GensKMod, Picodrive - поддерживают. В общем, проблемы одни, здесь ещё что-то про отсутствие поддержки Sega CD и 32X, если > 4MB.
Через Фотошоп палитра постоянно выстраивается таким образом, что чёрный цвет оказывается самым дальним.
В какой момент у вас  это происходит? Например, если открывать png, то палитра остаётся какой была. Ogr дал совет, как поступать, если у вас есть готовая палитра и вы хотите из RGB изображения сделать индексированное.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9393
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Настройка SGDK
« Ответ #434 : 16 Март 2019, 13:08:53 »
В общем, проблемы одни, здесь ещё что-то про отсутствие поддержки Sega CD и 32X, если > 4MB.
всё так, можно сделать картридж больше 4Мбайт, но оно будет работать только на "голых" мегадрайвах, а на SegaCD или 32X - шиш.

Оффлайн m4x1k

  • Пользователь
  • Сообщений: 36
    • Просмотр профиля
Настройка SGDK
« Ответ #435 : 16 Март 2019, 18:11:09 »
В какой момент у вас  это происходит? Например, если открывать png, то палитра остаётся какой была. Ogr дал совет, как поступать, если у вас есть готовая палитра и вы хотите из RGB изображения сделать индексированное.
Происходит с самого начала. Я делаю скриншот с нужного мне ресурса (в моём случае — это эмулятор Neko Project) и у меня уже изначально палитра в таком порядке, где чёрный цвет не первый идёт. Это решается с помощью Save for web в Фотошопе, но я думал, есть более быстрые способы.

По поводу размера, я так понял, нет возможности универсальной на данный момент. Мне размер нужен для большого объёма PCM. Вижу два пути:
1) Я почитал ещё раз про маппер SSFII, тот же Stef говорит, что это маппер самой Сеги, а не особенность одной игры. И что, теоретически, мы все можем использовать его. Теоретически это до 32мб объём данных, где в РОМе можно по мере необходимости подгружать данные по адресам. Одно лишь остаётся проблемой: как эмуляторы детектят саму игру с маппером и будет ли выделяться ли под неё больший объём памяти, или она фиксированно будет видеть игру с 5мб. К примеру, когда только вышел Pier Solar, он позиционировался как первый 64мбитный картридж, на деле же там, насколько я помню, РОМ 2мб, который дублируется в данных несколько раз. Ни о каких 8мб и не пахло.
2) Второй способ упомянутый режим Sega CD, который так же был показан в примере Stef’ом. Благо сейчас, наверное, большинство эмуляторов поддерживает эту функцию. В примере он сказал, что таким образом можно получить доступ не только к музыке, но и файловой системе. Возможно ли как-то будет читать и проигрывать PCM данные с диска с помощью SGDK? :neznayu:

И ещё вопрос: может, кто-то уже сталкивался. Каким образом можно проще всего организовать вывод собственного VWF (разноширинной шрифт) 8x16, 16x16? Сейчас при помощи функции можно выводить моноширинной шрифт 8x8, и самое неудобное — выводится всего два цвета. Может, у кого-то уже есть написанная функция?.. Или есть другой способ вывода? :-\

Спасибо всем за ответы.

А так, мне очень понравился SGDK, я честно лет 10 хотел научиться под Сегу делать хоть что-то, но думал, что это в сто раз сложнее. Оказалось всё очень понятно и доступно даже для новичков.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9393
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Настройка SGDK
« Ответ #436 : 16 Март 2019, 19:41:23 »
1) Я почитал ещё раз про маппер SSFII, тот же Stef говорит, что это маппер самой Сеги, а не особенность одной игры.
что-то ты не так понял. маппер это чипы на картридже, т.е. таки "особенность" игры или игр, а не самой приставки.
как эмуляторы детектят саму игру с маппером и будет ли выделяться ли под неё больший объём памяти, или она фиксированно будет видеть игру с 5мб
маппер типично детектится по коду игры в заголовке ROM-а, памяти выделяется столько сколько надо
К примеру, когда только вышел Pier Solar, он позиционировался как первый 64мбитный картридж, на деле же там, насколько я помню, РОМ 2мб, который дублируется в данных несколько раз. Ни о каких 8мб и не пахло.
где ты вычитал такую глупость ? игра там реально 8 мегабайт

Оффлайн m4x1k

  • Пользователь
  • Сообщений: 36
    • Просмотр профиля
Настройка SGDK
« Ответ #437 : 16 Март 2019, 21:30:14 »
что-то ты не так понял. маппер это чипы на картридже, т.е. таки "особенность" игры или игр, а не самой приставки.маппер типично детектится по коду игры в заголовке ROM-а, памяти выделяется столько сколько надогде ты вычитал такую глупость ? игра там реально 8 мегабайт
Про маппер немного напутал. Говорил это Chilly Willy и он имел ввиду, что это маппер самой Сеги, а не SSFII.

Про Pier Solar, я понятия не имею, как я так мог подумать... Я помню, что когда появились первые дампы, я ковырялся в игре и определённо помню, что у меня ввшло то, что я описал выше. Сейчас я смотрю РОМ, действительно, 8мб. Мистика какая-то. :blush: Либо я кривой дамп смотрел, либо того хуже — демку. У них тоже был свой маппер, или схожий с тем, что у SSFII?

Оффлайн m4x1k

  • Пользователь
  • Сообщений: 36
    • Просмотр профиля
Настройка SGDK
« Ответ #438 : 18 Март 2019, 06:31:33 »
Подскажите, как работать с сырыми данными, которые через Rescomp (BIN) грузишь? Как он записывается?
Я загружаю в него данные (шрифт), затем мне нужно разбить всё это добро на массив по 32 байта (тайл 8 на 8). Как обращаться к этим данным?

Сперва пытался организовать это через TILESET, но так и не смог понять, как присвоить в массив определённый тайл, не загружая весь тайлсет в VRAM.

Помогите советом.

Какая-то хрень получается. Через Tileset делаю всё верно, но выходит ошибка.
Обозначаю ресурс:
TILESET vwf_font "gfx/font.bmp" NONE
Создаю переменную массива.
        u32 myTiles[2][8]=
        {{
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000
        },

        {
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000,
            0x00000000
        }};

Передаю массиву данные из тайлсета:
myTiles[0] = vwf_font.tiles[32/4*1];
Ругается на:
src\main.c|142|error: assignment to expression with array type|
В чём может быть проблема?
---------------
Решил проблему иным путём. Воспользовался memcpy.
« Последнее редактирование: 18 Март 2019, 22:48:19 от m4x1k »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #439 : 19 Март 2019, 09:58:14 »
Каким образом можно проще всего организовать вывод собственного VWF (разноширинной шрифт) 8x16, 16x16? Сейчас при помощи функции можно выводить моноширинной шрифт 8x8, и самое неудобное — выводится всего два цвета. Может, у кого-то уже есть написанная функция?.. Или есть другой способ вывода? :-\
Начинал делать порт одной текстовой игры, сделал вывод текста со сглаживанием через копирование отдельных символов в тайлы. Главная проблема - медленно, полное заполнение экрана текста заметно (заполнял построчно), хотя можно отображать весь экран после заполнения VRAM, главное чтобы видеопамяти хватило. Задача несложная, но есть коварные моменты. Могу скинуть позже, только код не очень.

Оффлайн m4x1k

  • Пользователь
  • Сообщений: 36
    • Просмотр профиля
Настройка SGDK
« Ответ #440 : 19 Март 2019, 15:39:22 »
Начинал делать порт одной текстовой игры, сделал вывод текста со сглаживанием через копирование отдельных символов в тайлы. Главная проблема - медленно, полное заполнение экрана текста заметно (заполнял построчно), хотя можно отображать весь экран после заполнения VRAM, главное чтобы видеопамяти хватило. Задача несложная, но есть коварные моменты. Могу скинуть позже, только код не очень.
Со сглаживанием — это как?
Я начал писать свой вывод, но с удовольствием посмотрю твой выход в данной ситуации. Я делаю через битовое смещение тайла, вроде со всем разобрался, осталось всю математику только написать. :neznayu: В планах хочу сделать функцию, которая будет выводить текст на экран с большим выбором плюшек. Очень удивился, когда узнал, что только в Pier Solar запарились с подобным. Ведь подобное не только экономит место для большего вывода символов на экране, но и экономит место в видеопамяти: не нужно хранить целый шрифт, только те данные, которые будут использованы.

Хотел уточнить по поводу PLAN_WINDOW — какой смысл в нём вообще, если это тот же PLAN_A? У меня на окне почему-то не работает прозрачность — вместо прозрачности выводит цвет заднего фона PLAN_B. И вывод работает тоже как-то коряво. Карта 128х32 и PLAN_WINDOW при этом выводит на себя данные немного иначе, начинает затрагивать область за границей экрана, хотя код выводит только в пределах границ. С PLAN_A работает как надо. 

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #441 : 19 Март 2019, 16:28:52 »
Со сглаживанием — это как?
Больше одного цвета (+фон).
Я делаю через битовое смещение тайла
Попиксельно копировать долго, поэтому тоже копирую сразу несколько пикселей, но возможно не очень эффективно.
Ведь подобное не только экономит место для большего вывода символов на экране, но и экономит место в видеопамяти: не нужно хранить целый шрифт, только те данные, которые будут использованы.
Если текста выводится много, то экономии нет. Усложняется код.
PLAN_WINDOW — какой смысл в нём вообще
Обычно интерфейс выводят. А прозрачности у Window кажется и не должно быть.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #442 : 19 Март 2019, 18:16:30 »
Мой вывод текста без лишнего кода. Шрифт генерировал в BMFont, скриптами раскидывал в ASCII ряд и сохранял в виде кода (myfont.c). Русский текст в text_win1251.bin (кодировка windows-1251). Шрифт не идеальный, тёмный оттенок серого плохо виден и расстояние между символами получается разным. Кернинга нет.





Оффлайн m4x1k

  • Пользователь
  • Сообщений: 36
    • Просмотр профиля
Настройка SGDK
« Ответ #443 : 19 Март 2019, 19:23:02 »
Посмотрел. Почему ты думаешь, что медленно? К примеру, если выводить как в игрушках, на диалоговое окно, где 3 символа в высоту -- будет моментально. Код не маленький. :-\
Спасибо, постараюсь что-нибудь подчерпнуть.

Добавлено позже:
А как в SGDK сделать непрерывное выполнение одной функции из другой? Немного не понимаю самого процесса, возможно, я даже глупость спрашиваю, объясню подробнее.
Есть функция, вызванная из main, в ней план, который в цикле скроллится от координаты 0 до 100. В этом же цикле проверяем равняется ли координата 50, если равна, то запускаем функцию вывода текста. Функция текста в свою очередь выводит символы с паузой в 20мс. И в момент вывода текста стопорится скроллинг плана, пока вся функция вывода текста не завершится, при этом музыка, к примеру, продолжит играть. Как можно хотя бы в теории организовать одновременное выполнение подобных функций? :neznayu:
« Последнее редактирование: 19 Март 2019, 21:05:08 от m4x1k »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #444 : 19 Март 2019, 22:03:54 »
m4x1k, если код не выполняется за один кадр, значит медленно. Смотрел Pier Solar, мне показалось, что там текст тоже не сразу выводится после нажатия кнопки, чтобы не смотреть анимацию вывода текста.
А как в SGDK сделать непрерывное выполнение одной функции из другой?
По-моему вы говорите об общей вещи, а не специфичного для SGDK. 1/60 - 16.(6) мс, если FPS не проседает ниже 60, то можно в каждом кадре складывать по 16 или 16.666 с фиксированной точкой и выводить символ, когда время пришло. Обычный счётчик. В SGDK есть таймеры и прошедшее время можно узнать. В современных движках ещё используют сопрограммы (coroutines).

Оффлайн m4x1k

  • Пользователь
  • Сообщений: 36
    • Просмотр профиля
Настройка SGDK
« Ответ #445 : 19 Март 2019, 23:34:07 »
Возможно, не так описал.

Вкратце:
int main()
{
     //Вызываю первую функцию.
     FUNKTION1();
}
static void FUNKTION1()
{
     while (1)
     {
          В функции задаю скроллинг экрана.
          VDP_setHorizontalScroll(PLAN_B, X--);


          //Если позиция -300, то выводим текст.
          if (X == -300)

          {
                   for (int i = 0; i < 128; i++)
                  {
                         ОБРАБАТЫВАЕМ СИМВОЛ;
                         ВЫВОДИМ СИМВОЛ;
                         ТАЙМЕР 2МС;
                  }

          }
     }

}

Вот такого плана действие. Смысл в том, что пока идёт красный цикл, то основной цикл в ступоре. Мне же нужно, чтобы всё работало равномерно. Похожее действие выполняет функция VDP_fadeIn -- она не ждёт своего завершения, а начинает фейдинг совместно с последующим действием в программе. Я просто не встречался до этого с такой проблемой, но мне кажется, что я совсем глупый вопрос задаю, возможно, он даже не решаем и я не могу делать так, как описано в примере. :neznayu:
------------------
Решил проблему передачей функции значения скроллинга. Если 0, не скроллим, если иное, то продолжаем скроллинг в новой функции. Но проблему это решает только со скроллингом. С анимацией заднего фона такие же проблемы будут.
« Последнее редактирование: 20 Март 2019, 00:46:38 от m4x1k »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #446 : 20 Март 2019, 05:01:44 »
m4x1k, я об этом и говорил. Например из sgdk\sample\sprite:
    while (TRUE) {
        handleInput();

        updatePhysic(); // Внутри updateCamera() -> VDP_setHorizontalScroll(PLAN_A, fix32ToInt(-camposx));
        updateAnim();

        SPR_update();

        VDP_waitVSync();
    }
Анимация фона делается например так:
static u8 counter = 0; // Может быть общим для нескольких анимаций
void updateBGAnim(void)
{
    counter++;
    // Каждый 4-й кадр будет выполняться
    // ... или дробный счётчик
    if (!(counter & 0x3)) {
        // Анимация фона
    }
}

...
while(TRUE) {
    handleInput();

    updatePhysics();
    updateBGAnim();

    VDP_waitVSync();
}
Можно сделать и сложные системы событий. Вопрос, опять же, общий структурный, а не специфичный только для SGDK.
VDP_fade() работает также: VDP_initFading() инициализирует начальные значения, а на каждой итерации (если не async) while (VDP_doFadingStep()); обработка для одного кадра, где смещается цвет (есть свой счётчик шагов), внутри вызывается VDP_waitVSync(), чтобы дождаться VBLANK, следующего кадра.
Кстати, VDP_setHorizontalScroll()/VDP_setVerticalScroll() вроде стоит вызывать сразу после VDP_waitVSync(), может быть разрыв кадра. VDP_fade() тоже делает изменение CRAM (палитры) после VDP_waitVSync().

Оффлайн m4x1k

  • Пользователь
  • Сообщений: 36
    • Просмотр профиля
Настройка SGDK
« Ответ #447 : 20 Март 2019, 09:48:05 »
m4x1k, я об этом и говорил. Например из sgdk\sample\sprite:
    while (TRUE) {
        handleInput();

        updatePhysic(); // Внутри updateCamera() -> VDP_setHorizontalScroll(PLAN_A, fix32ToInt(-camposx));
        updateAnim();

        SPR_update();

        VDP_waitVSync();
    }
Анимация фона делается например так:
static u8 counter = 0; // Может быть общим для нескольких анимаций
void updateBGAnim(void)
{
    counter++;
    // Каждый 4-й кадр будет выполняться
    // ... или дробный счётчик
    if (!(counter & 0x3)) {
        // Анимация фона
    }
}

...
while(TRUE) {
    handleInput();

    updatePhysics();
    updateBGAnim();

    VDP_waitVSync();
}
Можно сделать и сложные системы событий. Вопрос, опять же, общий структурный, а не специфичный только для SGDK.
VDP_fade() работает также: VDP_initFading() инициализирует начальные значения, а на каждой итерации (если не async) while (VDP_doFadingStep()); обработка для одного кадра, где смещается цвет (есть свой счётчик шагов), внутри вызывается VDP_waitVSync(), чтобы дождаться VBLANK, следующего кадра.
Кстати, VDP_setHorizontalScroll()/VDP_setVerticalScroll() вроде стоит вызывать сразу после VDP_waitVSync(), может быть разрыв кадра. VDP_fade() тоже делает изменение CRAM (палитры) после VDP_waitVSync().
Вроде бы дошло, наконец. Для подобного нужно создать отдельные общие функции тех же скроллинга и анимации и уже из других подфункций по надобности вызывать их. Всё правильно понял?

Сегодня буду скроллинг переписывать. Я там его по куче раз вызываю, действительно ведь нораздо легче общую функцию написать было...

Спасибо огромное. :)

Я зарегистрировался неделю назад на spritesminds, но там мне не подтвердили регистрацию. Либо забили, забыли, либо ещё что-то. :neznayu: Так бы там тоже людей можно было подоставать вопросами, а больше и мест-то нет в интернете...

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2560
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Настройка SGDK
« Ответ #448 : 20 Март 2019, 11:05:58 »
так там мертвый сайт. активность есть, но совсем мало. так что много не потерял.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5162
    • Просмотр профиля
Настройка SGDK
« Ответ #449 : 20 Март 2019, 13:04:10 »
m4x1k, попытался зарегистрироваться на spritesmind, нажал один раз Submit убралась часть формы, где нужно ввести Mortal, позже попробовал нажать ещё пару раз на Submit:
Цитата
Information

You have been permanently banned from this board.

Please contact the Board Administrator for more information.

A ban has been issued on your IP address.
Причём форум тоже нельзя читать. Теперь понятно, почему так мало людей делают игры для SMD. Стоит ли говорить, кем нужно быть, чтобы банить по IP-адресу.