Имхо на векторе не так уж мало многоцветных игр с моргающими спрайтами.
Имхо на векторе не так уж мало многоцветных игр с моргающими спрайтами.
Но много и хороших годных игр. Я сам вот не знал что вообще был такой компьютер как Вектор оказывается (а он смотрю очень крут для тех времен). Детство с БК-Синклер. И да, спрайты моргали во многих играх. Считалось вполне нормальным в те годы. Челендж мол сделать чтобы не моргали и не потерять полноцветность и скорость. Я не смог так на УКНЦ. Полноцветно только штук 5 спрайтов 16х16 с бэкграундом на 25fps вышло. Но .. многое можно пофиксить геймдизайном же.
Если игра увлекательная и красивая, то если там мельтешит где-то иногда, это не страшно. Даже на NES все время всякая хрень выскакивает в играх там и сям. Геймплей важнее.
Больше игр нет
Привет всем...
Думаю без буфера - спрайты будут мерцать...
Пусть померцают...
???
Там сложнее другое. Я знаю этот набор картинок, это называется 2d pixel dungeon asset pack, увы - самое сложное рисовать картинки для игры самому (тайлы/спрайты), если игру не передирать с чего-то - это дело застрянет на полпути (рисовать 8-бит графоний не все умеют, программерам это сложно до ужасу, рисовал паука в 4-х цветах почти полдня и он получился говеным, после чего руки начали опускаться)
Шедевр портирования на УКНЦ - игра Highway Encounter
Эмуляторы: UKNCBTL, EmuStudio (респект авторам)
parallelno(03.09.2022)
Размышляя о том как организовать рендер с двойной буферизацией родил вот такой псевдокод ниже. Сильно смущают большие накладные расчеты. Можно конечно попробовать заменить tileGfxBuffer на связный список чтобы при отрисовке пропускать незадействованные тайлы, но не уверен что это сильно поможет.
Возможно есть элегантный и быстрый способ оргинизовать тайловый рендер, поделитесь знанием.
- - - Добавлено - - -Код:; ===================================================================== ; data ; a pointer to tileGfx in the tileGfxBuffer currentTileGfxPtr: .word TEMP_ADDR ; a table of tileGfx pointers tileGfxPtrTable: .storage ROOM_TILES_W * ROOM_TILES_H * ADDR_LEN, 0 ; an array of tileGfx tileGfxBuffer: .storage TILE_GFX_MAX * TILE_GFX_LEN, 0 ; struct tileGfx: ; tilePtr - a pointer to a tile in tileGfxPtrTable. if it's 0, that means tileGfx is vacant ; tileGfxData - graphics data. if it's empty, that means this tile needs to be erased from the screen. ; ===================================================================== ; tile rendering routine currentTileGfxPtr = an address of the first tileGfx in tileGfxBuffer that has tilePtr = 0 for every visible sprite for an every sprite tile calculate a tile index N in tileGfxPtrTable if tileGfxPtrTable[N] == 0: tileGfxPtrTable[N] = currentTileGfxPtr currentTileGfxPtr->tilePtr = &tileGfxPtrTable[N] draw a tile w/o a mask into currentTileGfxPtr->tileGfxData currentTileGfxPtr = an address of the next tileGfx in tileGfxBuffer that has tilePtr = 0 else: draw a tile with a mask into currentTileGfxPtr->tileGfxData for every tileGfx in tileGfxBuffer if tileGfx.tilePtr == 0: continue if tileGfx.tileGfxData is not empty: draw tileGfxData on the screen. tileGfx.tileGfxData = empty else: erase tile on the screen. tileGfx->tilePtr = 0 ; set 0 a tileGfx pointer in tileGfxPtrTable tileGfx.tilePtr = 0
Уточню что tileGfx.tileGfxData = empty не означает стирание данных, а только маркировка их как стертых.
Структуру tileGfxData не привожу так как до конца ещё не определился, но там как минимум есть флаг говорящий что данные есть или данных нет.
- - - Добавлено - - -
Поясню как это работает если код выше не очень понятен.
У нас есть таблица адресов на структуры tileGfx.
Эта таблица имеет столько элементов сколько нужно тайлов на экране.
У нас есть массив tileGfxBuffer из элементов tileGfx.
Отрисовка состоит из двух этапов.
Первый это заполнить массив tileGfxBuffer данными спрайтов которые хотим отрисовать.
На втором этапе мы копируем данные из tileGfxBuffer на экран, или стираем с экрана старые спрайты.
Таблица tileGfxPtrTable нужна что быстрее найти элемент tileGfx в массиве tileGfxBuffer в который нужно скопировать данные спрайта.
Если честно, то я не совсем понял идею.
Напиши пожалуйста что скрывается под многоточия и и знаками вопроса.
- - - Добавлено - - -
Два списка выводимых спрайтов для того чтобы не пересекаться с измененными данными обработки всех персонажей?
А что включает в себя таблица действий? Можешь прописать по подробнее, пожалуйста?
- - - Добавлено - - -
Ещё было бы здорово если бы ты описал подробнее из каких элементов состоит карта экрана и структуру набора модифицированных элементов.
Если есть возможность переключать экраны:
Рисуешь тайлы в оба экрана изначально. Затем рисуешь в например первый экран спрайты уж там с маской без маски как угодно. Помечаешь битом в таблице тайлов куски 16х16 скажем которые были затронуты прорисовкой спрайтов. Переключаешь экран туда. Затем восстанавливаешь тайлы которые были помечены и были под спрайтами. Рисуешь аналогично на второй экран, помечаешь затронутые куски, переключаешь экран туда, затем оттуда тоже восстанавливаешь затронутый бэкграунт.. ну ит.д.
Если нет возможности переключать экраны:
Рисуешь то-же самое в куске памяти. Помечаешь какие тайлы затронули нарисованные спрайты уже двумя битами типа 11. Выводишь на экран куски из буфера которые были затронуты (помечены первым или вторым битом). Восстанавливаешь тайлы помеченные первым битом при этом перемещая его во второй. (это будет нужно если спрайт "прыгнет" через тайл чтобы вывести на экран все-же восстановленный тайл бекграунда потом хотя мол туда ничего не рисовалось)
Шедевр портирования на УКНЦ - игра Highway Encounter
Эмуляторы: UKNCBTL, EmuStudio (респект авторам)
У меня нет возможности переключать экраны, поэтому спрошу про твой второй подход.
Скажи пожалуйста а почему помечать какие тайлы затронули битами типа 11 лучше чем в моем варианте? И ещё вопрос, в этом варианте не используется буфер тайлов? Все делается в "куске памяти"? Какая его структура?
А в тайловом буфере ведь все-равно будешь хранить информацию в битах мол тут проходимо, тут непроходимо, тут кислоту кто-то разлил на пол и наступить нельзя, тут дыра в полу и провалишься скажем на нижний уровень если не перепрыгнуть и т.д.
То-есть весь экран будет поделен скажем на 16х16 куски в которых будут # тайлов пола собственно (бекграунда) и плюс еще какая-то битовая информация. Можно сделать что в эту битовую информацию до кучи пишется бит "сюда рисовали спрайт в этот квадратик и его надо вывести на экран и потом восстановить взад тем тайлом который там был до этого и перевести бит изменений во второй" и второй бит "сюда рисовали что-то на прошлом кадре, но сейчас спрайт убежал и восстанавливать ничего не надо, а просто вывести на экран этот кусок 16х16 и обнулить бит".
(с буферизацией будет тормозно ибо скажем спрайт находится посредине и затрагивает 4 тайла вокруг себя - их придется все четыре перерисовывать на экран сначала, а затем прорисовывать в буфер обратно взад уже без спрайтов и это будет оверхед прорисовки, но что поделать, зато нормально выглядеть станет)
Последний раз редактировалось BlaireCas; 03.09.2022 в 13:19.
Шедевр портирования на УКНЦ - игра Highway Encounter
Эмуляторы: UKNCBTL, EmuStudio (респект авторам)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)