Комментарии 20
Какая-то путаница вокруг компонента формулы X * 1256. Там по идее X * 1 / 256 -> X / 256?
При геренации картинок потерялась дробь в формулах?
а тут не ошибка?
Подключение ПК к денди? оО UART?
Да, UART можно попробовать реализовать программно, но довольно сложно правильные тайминги получить без таймеров. Для начала я бы попробовал использовать МК-посредник, а для денди написать какой-нибудь синхронный протолок обмена простой.
А если будет реализована связь с ПК, можно будет хоть интернет раздавать. А это уже сетевые игры и браузеры.
Можно использовать 16550 чип в разъеме картриджа, чтобы было антуражно (:
У меня была идея, которую я когда-то писал уважаемому @ClusterM- расширить его картридж добавив туда... модуль вафли. Да, этот модуль будет сильнее чем вся консоль, однако из плюсов мы получим стабильное решение. Далее делается "магазин" игр - по сути сверстанный определенным образом сайт (отображаемый только на консоли и в ее интерфейсе), который при помощи этой ESP'хи скачивает ромы (возможно после покупки) в память к себе и позволяет играть на консоли. Если заморочится - можно замутить даже шифрование для авторских РОМов по какому-либо ключу в картридже и облачные сохранения...
Хотя есть варианты с реализаций честного 3D, но итоговая картинка будет размером в четверть экрана (из‑за малого объёма видеопамяти), а если выводить её спрайтами, то ещё меньше (но будет работать значительно быстрее).
Dendy может выводить графику иначе чем спрайтами? На Dendy был порт Elite, выглядевший вполне трехмерным. Интересно, как это был реализовано.
Спасибо, надо будет посмотреть как этот порт выглядит. Мне он раньше не попадался.
Проблема с графикой в том, что на денди она вся состоит из тайлов. Отдельно редактировать каждый пикаель нельзя.
Чтоб выводить графику пикселями, нужно генерировать тайлы с расставленными в нужных местах пикселям. И загружать их в видео память. Но одновременно консоль может хранить только 256 уникальных тайлов. А для всего экрана нужно 1024 тайла.
Есть вариант переключать банки видеопамяти во время вывода каждого кадра 4 раза, но все равно с генерировать 1024 тайла это очень долго. Но если ограничить число точек на экране, то можно использовать и весь экран более-менее быстро.
Я делал набросок 2д движка пиксельного. Развернутым циклом получалось вывести на экран максимум 21 тайл за кадр в режиме 60 герц в монохромном режиме, а цветом 15 тайлов. Один тайл занимает 16 байт. Но это замена всех пикселей, отдельные пиксели редактировать быстрее.
Плавное 3д вращение сделать можно, но для очень простых скелетных фигур. Но более сложные модели я буду тожн пробовать выводить.
Ниже пример работы этого движка в монохроме.
На картридже, вместо обычной ROM, для тайлов была RAM. Там где рисуется 3D - раскладывались уникальные тайлы, и CPU мог в них рисовать. Т.е. получался эдакий нелинейный буфер кадра, куда можно рисовать попиксельно.
https://elite.bbcelite.com/deep_dives/drawing_vector_graphics_using_nes_tiles.html
Я точно так же делал в своих экспериментах с попиксельным рисованием. Генерировал тайлы с нужными включёнными пикселями находу и грузил в видеопамяти.
Уже даже придумал концепцию 3д игры простой) Может получится сделать освещение модели, но проволочная модель точно получится.
И спасибо за ссылку. Посмотрел как авторы Элит реализовали рисование линий. Я почти к тому же самому пришёл, когда выводил линии тайлами, но они организацию памяти немного подругому сделали. Хорошая тема для статьи.
А вы смотрели как это реализовано в играх на NES? Например было бы интересно узнать какие мотоды использовались в несовской Elite, отличались ли они от её версий на других 8-битниках.
Нет, Elitе на денди мне не попадалась. Но для неё скорее всего исходников нет открытых, а дизассемблировать и разбирать весь движок - это огромная работа. Все игры для денди построены на всяких хаках, поэтому там внутри скорее всего много жести.
b7120580.zip[40yr]262 K NES Elite sources
Не благодарите ;)
Немного непонятно, а каст множителей к (ufix24_8) можно ли заменить на (ufix16_8)?
Ufix24_8 - это обычный uint32_t, т.е. беззнаковая переменая на 4 байта. А стандартных типов на 3 байта нет, поэтому просто так не заменить.
Но можно реализовать свой трехбайтный тип и прописать для него всю математику. Это имеет смысл, так как экономит лишние копирования байтов. И 2 байта хватит на целую часть. Так что идея правильная.
Я часто использую меньше 8 бит в дробной части. Да, для преобразований нужны сдвиги, но зато диапазон целой части шире, и для многих практических задач не так важно иметь высокое разрешение в дроби.
Ещё крайне полезная для игр операция atan2, постоянно использую 8-битную реализацию из C64 wiki. Для практических задач тоже хватает такой точности.
Размерность целой и дробной части уже надо от конкретных задач выбирать, тут я согласен. В посте выбрал 8.8 как наиболее стандартный вариант. В конечных проектах с 3D возможно тоже буду играться с размерностью.
В ноябре надеюсь закончить прототип 3D-движка и попробовать повращать модельки. Просто выводить наборы полигонов уже получается, надо сделать матрицу трансформаторы и определение угла наклона полигона (там несложно, как выяснилось). Интересно сколько ФПС получится выжать. И какое количество полигонов даст адекватный ФПС с заливкой и без.
ПС: посмотрел ваши посты, очень круто. У вас сильно круче проекты ретроконсольные :)
Числа с фиксированной запятой для NES/DENDY