Просмотр полной версии : GameNoname
parallelno
20.07.2022, 20:08
Прочитав пост про новую и очень симпатичную игру из раздела "создание шедевра", одолело непреодолимое желание тоже закрыть так сказать многолетний гештальт и таки сделать что-то законченное для Вектора. :)
Это будет семейное творчество вместе с моими детьми. Не знаю сколько это займет, но уже увлекательно видеть в их глазах удивление когда рассказываю о возможностях Вектора. :)
Буду выкладывать прогресс здесь.
П.с. название временное.
=====================================
Last Update:
Перевел демку игры на русский!
И еще исправил кучку багов и доработал недоработки. :)
Пожалуйста потестируйте! Очень важны ваши отзывы и советы!
Для игры нужно распаковать архив и запустить _run.bat.
Управление:
стрелки - перемещение
пробел - использование
alt - выбор
Если используете эмулятор VV, то выбор ресурса Shift
Игра долго запускается. Дайте ей время пожалуйста.
Напишите сколько у вас заняло прохождение.
ссылки
https://drive.google.com/file/d/1CTbehozeRcWLuwZw_d9syUMQ41qTaSyk/view?usp=drive_link
дубль
https://github.com/parallelno/Vector06c/blob/main/Vector06c_Dev/_Projects/GameNoname/release/demo_rus.1.03.zip
last update:
скачать и положить GameNoname.rom в папку с игрой
https://github.com/parallelno/Vector06c/blob/main/Vector06c_Dev/_Projects/GameNoname/rom/GameNoname.rom
видео где я рассказываю про последие доработки и немног про игру
https://www.youtube.com/watch?v=WMzj-VmqIDg
parallelno
21.07.2022, 00:00
Это был первый тест скорости отрисовки страйтов. За основу был взят код ребят с этого форума. За что им большое спасибо!
https://youtu.be/XzAb0aULsxc
- - - Добавлено - - -
Тестировал RLE сжатие и заодним подготовил тесотвый набор спрайтов для игры. За спрайты спасибо https://itch.io/game-assets/free/tag-pixel-art
https://i.ibb.co/yVDFyf6/photo-2022-07-20-13-57-35.jpg
Подскажите плиз, где лучше хостить картинки для того чтобы постить на форуме
parallelno
21.07.2022, 03:11
Адаптировал палитру. Сделал пробныей таилсет. Сделал тестову комнату в Tailed
https://i.ibb.co/2WxVdqx/photo-2022-07-20-17-03-36.jpg
Сделал конверт графики в тайлы. Вывел первый тайл комнаты
https://i.ibb.co/DtXcCnW/photo-2022-07-20-17-03-45.jpg
Распарсил тайледовый формат и вывел комнату
https://i.ibb.co/rkwRZHL/photo-2022-07-20-17-03-51.jpg
Для побаловатся сделал вывод спрайта. Пока на костылях и без маски
https://youtu.be/io34MTe5Y-8
- - - Добавлено - - -
Это прогресс за несколько дней, поэтому дальше реже будет. :)
crazy_bender/ex-PLACEBO
21.07.2022, 08:31
я правильно понял что будет что то типа рогалика?
CityAceE
21.07.2022, 08:39
Подскажите плиз, где лучше хостить картинки для того чтобы постить на форуме
https://zx-pk.ru/threads/32687-kak-razmestit-kartinku-na-forume.html
parallelno
21.07.2022, 11:13
я правильно понял что будет что то типа рогалика?
Наверное да, :) не очень разбираюсь в rogue like играх. Но что-то интересное мы с детьми по сюжету придумали :) главное довести до ума
Выглядит уже здорово. Хорошо, что ты сразу нашел графику -- это наверное помогает не отвлекаться на второстепенное. Очень интересно смотреть на процесс и увидеть, что получится.
parallelno
21.07.2022, 13:45
Спасибо! Этот таил сет Петя мой сын и я уже использовали в игре для второго сына Илья на день его варенья. :) Поэтому выбор был достаточно простым.
parallelno
25.07.2022, 11:22
Добавил просьтенькое управление и нарисовал несколько спрайтов для бега.
маски для героя пока нет и хвосты не подтираются :)
https://youtu.be/uJ0axZ5__P8
А персонаж будет разворачиваться при перемещении влево?
parallelno
25.07.2022, 19:59
KTSerg, да, планируется.
parallelno
26.07.2022, 11:09
Теперь герой поворачивается куда идет и прибирает за собой на экране :)
https://youtu.be/0XxPP-daAso
parallelno
27.07.2022, 23:53
После того как добавил маску и бленд на экран заметил что сильно упала производительность, начал оптимизивать . Даже неплохо получилось, а потом заметил что VV эмулятор запоминает настройкиу частоты 1.5мгц которую я сделал прошлые разы когда тестировал. Был приятно удивлен скоростью когда веинул обратно 3мгц :)))
parallelno
30.07.2022, 20:32
добавил проверку коллизий спрайта с тайлами.
https://youtu.be/G0Tkz275XE0
parallelno
31.07.2022, 11:27
сделал переход между комнатами
https://youtu.be/5h-2iYQCQI8
s
parallelno
01.08.2022, 10:44
Добавил лестиницы. Добавил скелета. Теперь можно занятся противниками и немного механикой.
https://youtu.be/XakOn9Wf0Ag
- - - Добавлено - - -
Проект кстати открыт если кто-то захочет поизучать, поэкспериментировать или улучшить :)
https://github.com/parallelno/Vector06c.git
сама игра в папке Vector06c_Dev/_Projects/GameNonane/
https://github.com/parallelno/Vector06c.git
сама игра в папке Vector06c_Dev/_Projects/GameNonane/
Так GameNoname или GameNonane? // не придираюсь, просто явно опечатка
Вижу что zx0 уже вроде как прикручен. Стоит сразу подумать о запаковке всей готовой игры, потому что люди на реале "с ленты" грузят.
И тогда естественным образом в коде выделяется часть "инициализация + распаковка".
Что я обычно выношу в эту часть:
- инициализация при холодном старте: распаковка всего, установка начальной палитры, распаковка заставки в экран, переход к ожиданию клавиши и затем в главное меню
- инициализация про рестарте: установка палитры, переход в главное меню
- процедура установки палитры
- процедура распаковки
- прерывание: опрос клавиатуры и джойстика, установка скроллинга и бордюра (бордюр лучше брать из переменной, чтобы им можно было "помигать" когда нужно)
zx2 здесь (https://github.com/parallelno/Vector06c/tree/main/Vector06c_Dev/_Projects/zx2) багнутый, у себя я исправил 21 июля
parallelno вы вполне можете вписаться в предстоящий Cafe Party 2022 в октябре, там и виртуальное участие возможно - будет и дедлайн, и достижение в конце пути:
https://events.retroscene.org/cafe2022#Game_Compo
parallelno
01.08.2022, 11:51
nzeemin, о, спасибо! Правда опечатка. Поправлю.
О запакован помню. Будет но позже.
ivagor, zx2 пока не планирую использовать. За Zx0 кстати большое спасибо!
nzeemin, можно кстати на ты. :) Если успею то будет круто. :) Но если честно, то не люблю участие в конкурсах. Главное доделать. Ну и чтобы процесс доставлял удовольствие:)
- - - Добавлено - - -
nzeemin, по поводу запаковки планы пока такие. Каждая комната с информацией какие тайлы рисуем и данные тайлов сжать с помощью rle. Каждый уровень который включает в себя графику и комнаты сжать zx0 и потом если будет заметный профит сжать всю игру zx0. Но как пойдет посмотрим. :)
люди на реале "с ленты" грузят.
Этому горю неслабо помогает loadfm с автостартом.
parallelno
04.08.2022, 09:01
Добавлен пул монстров для комнаты. Начата работа над обработчиком данных пула. Сейчас он только рендерит монстриков.
https://youtu.be/ocfqSkE58eY
parallelno
08.08.2022, 08:54
починил коллизии. добавил обработку данных мобов для init/update/draw. Добавил тестовый AI скелетам. Добавил их 10 штук на первую карту для стрес теста и последующей оптимизации и исправлении глитчей.
https://youtu.be/0vI6QY9trSo
починил коллизии. добавил обработку данных мобов для init/update/draw. Добавил тестовый AI скелетам. Добавил их 10 штук на первую карту для стрес теста и последующей оптимизации и исправлении глитчей.
https://youtu.be/0vI6QY9trSo
Галимо. Как будешь мерцание спрайтов убирать?
parallelno
10.08.2022, 22:01
Твой коммент выглядит предельно цинично. :D
"Галимо. С уважением, такойтович."
По поводу мерцания. Есть некоторые мысли. Но нужно проверять какой вариант лучше.
Твой коммент выглядит предельно цинично. :D
"Галимо. С уважением, такойтович."
По поводу мерцания. Есть некоторые мысли. Но нужно проверять какой вариант лучше.
Ну ты же критику хочешь :)
Мне не нравятся здесь два момента
1. Сквозь персонажа просвечивает фон
2. Структура уровня подразумевает пересечение персонажей, а у тебя отсутствует сортировка по дистанции и наложение персонажей друг на друга.
Мысли здорово. Не хочешь воспользоваться советами из зала? Ну или мудростью предков.
parallelno
11.08.2022, 00:00
Мысли из зала и мудрости предков всегда приветствуются. :)
Рендер пока зачаточный. Хочется добавить проджектайлы и анимацию на бэкграунде и музыку. Посмотрю как это все укладывается вместе и буду прибирать и оптимизировать.
Про фон. Пока минорная штука. Если будет многих раздражать, то буду что-то делать. Если не хватит ресурсов, то сделаю однородным.
Привет всем...
На Спектруие - мерцание решается достаточно просто...
1. В 48К режиме - сформировываем экран в буфере - печатаем буфер на экран...
2. В 128К режиме - есть 2 экрана. Делаем активным то 1 экран,
то другой...
Для Вектор-06Ц можно попробовать так...
1. 4 экранные плоскости - делил по 2...
2. Формируем экран в плоскости 1-2, либо 3-4...
3. И за счет программирования палитры цветов -
делаем 2 плоскости видимыми, попеременно их меняя...
???
Количество цветов в игре - разумеется снизится до 4...
Привет всем...
...
Для Вектор-06Ц можно попробовать так...
1. 4 экранные плоскости - делил по 2...
2. Формируем экран в плоскости 1-2, либо 3-4...
3. И за счет программирования палитры цветов -
делаем 2 плоскости видимыми, попеременно их меняя...
???
Количество цветов в игре - разумеется снизится до 4...
Одновременно отображаемых 4, а в игре, скорее всего 7 или 8, по 4 цвета на каждую пару плоскостей.
Вопрос только в том, как к такому мерцанию отнесутся современные мониторы/телевизоры/тв-тюнеры/и пр. ... ?
У всех ведь скорее всего есть тяга "улучшить" изображение, усредняя последовательные кадры, а тут будет мерцание черезкадровое, чётные кадры одно изображение, нечётные другое...
Не, мерцать тут ничего не будет. Если две пары плоскостей переключать целиком это как переключать две странички видеопамяти. Если я конечно правильно понял, о чем написал Stl75.
Но по-моему для игры такого типа никакого специального мудрежа не нужно. Ей не нужно поддерживать какой-то фиксированный фреймрейт, а много цветов тут важнее скорости отрисовки. Чтобы обновления были локальными нужен промежуточный буфер, в который рисуются сначала фон, потом с со своими масками предметы и персонажи. И такой буфер целиком уже потом каким нибудь предельно тупым и скорострельным способом выводится в нужное место на экране. На глаз это должно смотреться нормально даже без синхронизации, потому что обновления минимальны. Но вот как именно выбирать регионы для отрисовки - задача интересная. Тривиальное решение -- весь экран, но столько памяти, по крайней мере в кваслесс версии, просто нет. Ну а если и есть, то перекачивать столько памяти зараз выходит очень медленно.
Не, мерцать тут ничего не будет. Если две пары плоскостей переключать целиком это как переключать две странички видеопамяти. Если я конечно правильно понял, о чем написал Stl75.
Но по-моему для игры такого типа никакого специального мудрежа не нужно. Ей не нужно поддерживать какой-то фиксированный фреймрейт, а много цветов тут важнее скорости отрисовки. Чтобы обновления были локальными нужен промежуточный буфер, в который рисуются сначала фон, потом с со своими масками предметы и персонажи. И такой буфер целиком уже потом каким нибудь предельно тупым и скорострельным способом выводится в нужное место на экране. На глаз это должно смотреться нормально даже без синхронизации, потому что обновления минимальны. Но вот как именно выбирать регионы для отрисовки - задача интересная. Тривиальное решение -- весь экран, но столько памяти, по крайней мере в кваслесс версии, просто нет. Ну а если и есть, то перекачивать столько памяти зараз выходит очень медленно.
Можно и так - выводить изображение через буфер...
Только у Вектора-06Ц - видеопамяти 32Кб...
Сколько памяти - сможете выделить на буфер???
если и есть, то перекачивать столько памяти зараз выходит очень медленно
Учитывая статичный фон, проще действительно выделять буфер, куда сперва выводятся затронутые тайлы фона, а сверху уже накладываются спрайты персонажей/врагов.
Если точнее - несколько небольших буферов чуть больше размера спрайтов, чтобы затирать предыдущие фазы движения.
- - - Добавлено - - -
Только у Вектора-06Ц - видеопамяти 32Кб...
При "буферизации" лишь кусков под движущимися спрайтами памяти уйдет в разы меньше, пропорционально кол-ву этих спрайтов на экране.
Сколько памяти - сможете выделить на буфер???
Ну это как parallelno придумает.
1) Простой вариант -- это выбрать окрестность персонажа округленную до знакоместа. 3х3 тайла будет буфер, где главный герой в центре. Остальных непоместившихся персонажей и всякие пули, мечи и стрелы перерисовывать аналогично по очереди. Картинку будет рвать, но не весь экран разом, а локально и каждый раз по разному, так что есть шанс, что почти всегда это будет незаметно. Особенно при том, что тут все крохотное 8х8. Так по-моему легко может случиться, что все перерисовывается по многу раз. Этому легко помочь, помечая в дополнительной битовой карте какие участки уже перерисованы.
2) Как вариант, можно сделать буфер не 3x3 тайла, а шириной в экранную строку.
3) Еще идея -- если хорошо отладить клиппинг всех спрайтов (а это не так уж и сложно), можно сделать процедуру отрисовки одного тайла с наложением всех предметов и персонажей. Тогда тайлы можно перерисовывать в любом порядке, хоть в псевдослучайном. Тогда основная логика будет только помечать тайлы, требующие обновления, а рисовальный цикл будет обходить карту их обновлять. Сначала мне показалось, что это запарно, потому что клиппинг и все такое, но на самом деле это по сути упрощение варианта (1).
На Спектруие - мерцание решается достаточно просто
Для Вектор-06Ц можно попробовать так
Не может быть, неужели на векторе возможна двойная буферизация? Хотя подождите: 1 (http://www.sensi.org/scalar/ware/8/), 2 (http://www.sensi.org/scalar/ware/15/), 3 (http://www.sensi.org/scalar/ware/896/), 4 (http://www.sensi.org/scalar/ware/906/), 5 (http://www.sensi.org/scalar/ware/907/) (это не все примеры, но и тут можно заметить, что вариантов организации больше одного)
Не может быть, неужели на векторе возможна двойная буферизация?
Я первое сообщение понял как то, что Вектор предоставляет большее разнообразие в этом деле. И с этим утвержением я согласен.
Собственно, на Векторе есть несколько игр,
в которых буфер точно в видеопамяти...
Например, Сражение 1, 2...
sragen1.rom,
sragen2.rom...
Цвета видно обрезали...
Например, до 8...
???
Мысли из зала и мудрости предков всегда приветствуются. :)
Рендер пока зачаточный. Хочется добавить проджектайлы и анимацию на бэкграунде и музыку. Посмотрю как это все укладывается вместе и буду прибирать и оптимизировать.
Про фон. Пока минорная штука. Если будет многих раздражать, то буду что-то делать. Если не хватит ресурсов, то сделаю однородным.
Ага. тут уже говорили несколько вариантов.
теперь с обоснованием
1. фон из блоков 8*8, спрайты рисуются в буфере
на экран выводим только те блоки которые изменились.
тоесть имеем две таблицы размером в массив
1 карта тайлов
2 карта изменений
если надо обьясню подробнее
2. вариант для Вектора.
4 битплана по 2 битплана на экран
нарисовав на 2 битпланах ждем фрейм и переключаем палитру так чтобы перерисованные битпланы получили цвет.
parallelno
11.08.2022, 21:25
Спасибо всем за советы и обсуждение!
Немного детайлей об игре.
В игре тайлы 16*16. 16 цветов. Тайл с "землей" рисуется всегда в $8000 плоскость. Спрайты мобов и героя 16*15. Рисуются в три плоскости начиная с $a000.
Мерцание в основном изза двух факторов.
1. Спрайты стираются полным размером спрайта в предыдущей позиции спрайта, затем спрайт рисуется в новой позиции. Это приводит к тому что спрайта не виден полностью или частично. Пока план лечения это стирать только то место где новый спрайт уже не рисуется. т.е. для горизонтального движения стирать только 8*15 полоску и только в тех моментах когда спрайт переместился на следующий байт. т.е не каждый кадр. Это как я надеюсь сильно уменьшит проблему. Если глитчи останутся сильными, буду думать дальше. )
2. При наложении одного спрайта на другой. Это лечитать планирую тем что при наложении спрайтов рисовать их по маске. Или как минимум рисовать монстров без маски, а глав героя по маске сверху.
Из интересного. В игре спрайты рисуются/стираются не каждый кадр. Герой в анимации движения рисуется каждый второй кадр, в анимации Idle рисуется кадый 8 кадр. Если спрайт стартует новую анимацию то счетчик одновляется и спрайт сразу будет отрисован. то есть герой в idle будет отрисован сразу без задержки после того как игрок перестал нажимать на клавиши. Но следующий кадр idle анимации будет нарисован чере 8 кадров.
Скелеты для всех анимаций рисуются каждый 8 кадр. Но как в случае с героем они сразу отрисуют первый кадр новой анимации, затем следующий через 8 кадров. Их скорости медленнее героя и снижение фреймрейта я не замечаю. Более быстрые мобы будут могут рисоваться чаще. Это пер анимейшен параметр конкретного мобика.
Для балансировки нагрузки все мобы стартуют свои анимации со смещением задерки. то есть если на экране 7 мобов + герой, то все они будут рисоваться в свой кадр и нагружать процессор примерно как один моб рисуюшийся каждый кадр.
В целом считается что мобы и герой размером с тайл. но их видимая часть может быть меньше. В памяти храниться и отрисовывается только видимая часть. то есть спрайты в анимации не приязаны к размеру тайла и могут быть от 8 до 24 пикселей по гризонтали.
Про использование экрана как 2 буфера по 4 цвета решил отказаться. Хочется больше цвета.
Про временную буферизацию в памяти думал примерно тоже самое, но пока отложил. Когда что-то будет накладыватся на тайлы отличные от "земли" буду думать. Перерисовывать испорченные тайлы целиком коннечно сильно не хочется так как дорого, поэтому склоняюсь в пользу временного сохранения в память. но там посмотрим.
- - - Добавлено - - -
Подскажите пожалуйста можно ли использовать квазидиск для чтения музыки каждый кадр и подмену экранных плоскостей с квазидиском?
Подскажите пожалуйста можно ли использовать квазидиск для чтения музыки каждый кадр и подмену экранных плоскостей с квазидиском?
Квазидиск для чтения чего угодно можно использовать, музыки тоже. Можно даже для записи музыки ;)
Подмену экранных плоскостей нельзя. Экран всегда рисуется из основной памяти.
Smalovsky
12.08.2022, 02:38
А в квазидиск можно сохранить экран с фоном? Можно же с квазидиска считать участок фона в буфер, наложить на фон в буфере спрайт, и записать этот частичный буфер в нужное место экранного озу.
parallelno
12.08.2022, 02:46
О, кстати это классная идея! Иметь незапорченный фон целиком ускорит процесс восстановления фона на экране.
Сопутствующий вопрос. Сколько времени требуется на подключение к квазидиску на чтение? Где поподробнее почитать про работу с ним?
О, кстати это классная идея! Иметь незапорченный фон целиком ускорит процесс восстановления фона на экране.
Сопутствующий вопрос. Сколько времени требуется на подключение к квазидиску на чтение? Где поподробнее почитать про работу с ним?
Процессор не имеет представления, читает он из основного ОЗУ или из КД, тоже самое и с записью.
У КД есть управляющее слово, которое записывается в порт 10h, этим словом КД включается в нужный режим или отключается (хrа а\ out 10h).
Значения бит управляющего слова расписаны много раз во всех описаниях КД, в журнале ВекторЮзет тоже.
Соответственно, требуется по 20 тактов на включение и выключение КД.
Если КД оактивируется на работу со стеком, то все стековые операции (PUSH, POP) , будут обращаться к КД, а команды обычных записи/чтения (sta, lda, shld, lhld, stax, ldax) будут работать с основной памятью, именно этот режим и используется для переноса данных из КД в основное ОЗУ, и обратно.
parallelno
12.08.2022, 12:23
KTSerg, включение квазидиска 20 тактов, отключение 16? Уточняю чтобы удостовериться что я правильно тебя понял.
Если квазидиск включен на работу как стек и прерывания включены то прерывание запортит как минимум два байта данных квазидиска, правильно?
KTSerg, включение квазидиска 20 тактов, отключение 16? Уточняю чтобы удостовериться что я правильно тебя понял.
Если квазидиск включен на работу как стек и прерывания включены то прерывание запортит как минимум два байта данных квазидиска, правильно?
Да, отключение 16, если через xra a.
Да, любые операции со стеком идут на КД, если он включен, и прерывания нужно отключать, и обмен осуществлять внутри одной подпрограммы (судя по всему). ;)
parallelno
12.08.2022, 12:51
А если не стеком а рандомным доступом, то мапятца банки по 32к в экранные адреса?
А если не стеком а рандомным доступом, то мапятца банки по 32к в экранные адреса?
Лучше всё-таки прочитать документацию.
В режиме подстановки в ОЗУ можно видеть только один из четырёх блоков по 16К = всего 64К из 256К ЭД.
http://sensi.org/scalar/ware/522/
ПРОГРАММИСТУ ОБ ЭЛЕКТРОННОМ ДИСКЕ
Для работы с ЭД программисту необходимо знать, что:
- при работе в ОС "МикроДОС" об'ем ОЗУ ЭД распределяется следующим образом:
234 К ОЗУ пользователя,
16 К "подэкранное" ОЗУ,
4 К контрольные суммы,
2 К каталог.
- доступ к ЭД осуществляется через порт 10h; в этот порт записывается байт,
определяющий режим доступа к ЭД и номер одного из четырех 64-х килобайтных
блоков, к которому разрешается доступ. Структура управляющего байта:
D7 D6 D5 D4 D3 D2 D1 D0
где:
D1,D0 - биты, которые задают номер блока при обращении к ЭД "как ОЗУ",
D3,D2 - биты, которые задают номер блока при обращении к ЭД "как стек",
D4 - указывает на вкл/выкл режима ЭД "как стек",
0 - режим выключен;
1 - режим включен;
D5 - указывает на вкл/выкл режима ЭД "как ОЗУ",
0 - режим выключен;
1 - режим включен;
D7,D6 - не используються.
В режиме "как ОЗУ" (D5=1, D4=0) в адресное пространство A000-DFFFh
процессора БПЭВМ подключается память соответствующего блока ЭД т.е. при
обращении к этим адресам данные будут записываться в ОЗУ ЭД, а не в ОЗУ БПЭВМ.
В режиме "как стек" (D5=0, D4=1) при выполнении команд, обращающихся к
стеку, данные будут выбираться из ОЗУ ЭД, а не БПЭВМ. Таким образом, для
полного использования ОЗУ ЭД необходимо использовать режим "как стек".
Если установлены оба режима (D5=1, D4=1), то при выполнении стековых
операций в адресах A000-DFFFh доступ будет обеспечен к блоку, который задан
разрядами D3, D2.
Номер 64-х килобайтного блока задается инверсно, то есть:
11B - блок 0
10B - блок 1
01B - блок 2
00B - блок 3
Пример: стандартная конфигурация МикроДОС работает в режиме 23h или
00010011B, что означает нулевой блок ЭД работающий в режиме "как ОЗУ".
По материалам фирмы "PC - Invoservise"
Усков И.М.
Чего-то не было в картотеке теста расширений Баркаря, добавил
http://sensi.org/scalar/ware/918/
В списке (https://zx-pk.ru/threads/34534-gamenoname.html?p=1160533&viewfull=1#post1160533) примеров аппаратной двойной буферизации не хватает важного элемента - ROBOTZ (https://zx-pk.ru/threads/19922-robotz!-releases) PPC. У него там и спрайты (т.е. совсем в тему) и сначала был один вариант буферизации, потом другой.
Если КД оактивируется на работу со стеком, то все стековые операции (PUSH, POP) , будут обращаться к КД, а команды обычных записи/чтения (sta, lda, shld, lhld, stax, ldax) будут работать с основной памятью.
Тогда вообще проблем не вижу с восстановлением фона, вернее, с памятью под буферы.
Да и спрайты можно неплохо разнообразить, держа их в квазе. Хорошую вещь на Векторе придумали, оказывается.
Да на Векторе можно не хуже NES замутить, только усилий надо много приложить :)
Извините за оффтоп. Векторовский кваз не так уж плох или даже хорош в сравнении с вариантами расширения озу других советских бытовых ретрокомпов. А в сравнении с тем, что можно и нужно было сделать - мягко говоря слабовато.
А в сравнении с тем, что можно и нужно было сделать - мягко говоря слабовато.
Можно продолжить в более онтопной теме, чтобы не засорять тут. В той же про Баркаря, почему бы нет?
BlaireCas
13.08.2022, 01:32
KTSerg, включение квазидиска 20 тактов, отключение 16? Уточняю чтобы удостовериться что я правильно тебя понял.
Если квазидиск включен на работу как стек и прерывания включены то прерывание запортит как минимум два байта данных квазидиска, правильно?
Поверь тому как ты запаришься с буферизацией вывода. Это очень непростое дело на восьмибитках.
Слушай Джерри, он собаку на этом скушал правда кажется на спекки, но 80-й проц вполне похож.
Сам делал на УКНЦ 8 цветов и типа даже получилось, правда вылезли другие вещи что сделать движок это вовсе не означает сделать игру. Там надо еще рисовать, придумывать сюжет и т.д., и это намного сложнее вывода спрайтов.
Однако рад за попытки. А мигание спрайтов надо убирать, оно и правда косяк. И делать спрайты на трех планах чтобы они просвечивали через четвертый тоже.
Вообщем челендж :)
Из буфериции в буфер делал разделение буфера на знакоместа 8х8 вышло тормозно (правда это УКНЦ там всегда тормоза). Потом взял 16х16 тайлы стало получше, но тоже полезли косяки когда тайл должен залезть "впереди" спрайта. Например ГГ наступает в лужу с кипящей кислотой в тайлах, разумеется спрайт не должен ложиться на булькающую кислоту тайла, а наоборот. Иначе выглядит фигово. Вообщем там много подводных.
Из буферизации делалось как-то так: буфер разделяется на тайлы у которых несколько бит задействовано под состояние.
Один бит это мол сюда нарисовали спрайт на текущем фрейме.
Второй бит это "на прошлом фрейме сюда был нарисован спрайт". (ибо спрайт может тупо пропасть по сюжету или где еще или перейти за тайл вбок скажем там, а прорисовать буфер нужно будет на экране).
Рисуется потом буфер на экран, восстанавливается у себя тоже по кускам в зависимости от флагов. Тот что был на прошлом фрейме тоже рисуется ессно, но не восстанавливается уже ибо на другом фрейме восстановлен.
С тайлами которые впереди или сзади спрайта героя вот уже тупо не хватило битов :)
У меня был старший байт на тайлы на буфер навроде 12345678
- 1 - сейчас прорисовали туда спрайты,
- 2 - прошлый фрейм прорисовывал (тупо сдвигаются с 1 на 2), а это нужно ибо надо все-ж перерисовать на экране тайл даже когда скажем спрайт с него испарился на прошлом фрейме
- 3 - это неосвещенные тайлы по сюжету прорисовывать на экран нельзя
- 4 - это анимированные и последние 2 бита тайла по фреймам инкризят тайл №
- 5 - типа это кислота там помрешь
- 6 - можно выкопать лопатой
- 7-8 один из четырех выборов либо тайл проходим либо там лестница либо ящик/бочка на которую можно запрыгнуть либо он непроходим
Конечно перебор с этими битами и можно-бы было обойтись ветвлениями, но на УКНЦ они очень тормоза.
Зажирало прилично на лабиринт.. Но вообщем разными извращениями все можно вытянуть :)
Если квазидиск включен на работу как стек и прерывания включены то прерывание запортит как минимум два байта данных квазидиска, правильно?
Если мы ещё ничего не считали со стека, то sp указывает на начало спрайта. Если прерывание произойдет, то оно испортит те два байта перед данными спрайта, а это не страшно.
Совершенно та же ситуация
parallelno
13.08.2022, 11:00
Спасибо за советы!
Дописал процедуру и скрипты для вывода анимации спрайта с разной шириной, высотой и оффсетами по xy.
Все монстрики, герой и тестовый проджектал заняли почти 30к. :) Нужно начинать использовать квазидиск.
Показать пока ничего толкового нет так как из визуального были только тесты.
Спасибо всем за советы и обсуждение!
Немного детайлей об игре.
В игре тайлы 16*16. 16 цветов. Тайл с "землей" рисуется всегда в $8000 плоскость. Спрайты мобов и героя 16*15. Рисуются в три плоскости начиная с $a000.
Мерцание в основном изза двух факторов.
Тайлы 16*16 могут быть составлены из 4х элементов 8*8
Все монстрики, герой и тестовый проджектал заняли почти 30к
Это все предсдвиги? Пора начинать жульничать. Настоящие герои подземелий редко ходят меньше, чем на два пикселя :) Хотя похоже, что кваз все равно понадобится, так что почему действительно им не воспользоваться на всю катушку.
Про хранение маски через байт вместе с пикселями видел? Вывод получается удобно типа pop b \ mov a, m \ ana c \ ora b \ mov m, a
BlaireCas
13.08.2022, 12:59
Это все предсдвиги?
С прешифтовыми спрайтами там вообще никакой памяти не хватит если даже делать не все 16 цветов. Через таблицы шифтов делать видимо нужно и да, по 2 пикселя герои очень даже ходят и это вполне нормально :)
Типа байт со смещением = выбор из таблицы. На байт кажется потратится 3 смещения и соответственно таблица будет тоже немаленькая, но имхо оно все-ж лучше чем пришифтованные спрайты хранить.
(а там еще и зеркалирование спрайтов тоже по таблицам видимо заодно будет.. ну впрочем фиг его знает как автор решит)
Кстати еще самые кондовые спрайты можно разворачивать сразу кодом. Это, казалось бы, жир, а толку никакого, но скорость та же, при этом освобождается стек. Можно исполнять прямо из кваза. Можно так сделать для чего-то, чего много и надо быстро, типа тот же мысль-прожетктыль.
lxi b, $7e81 \ mov a, m \ ana c \ ora b \ mov m, a \ dcr l
А если без маски и со стеком, тут вообще можно отжиг устроить
lxi b, $55aa \ push b ; 28 тактов на две строки, а если паттерн повторяется, то и вообще 12 + (8 * число строк).
для тайлов / фона, чего бы и нет
С прешифтовыми спрайтами там вообще никакой памяти не хватит если даже делать не все 16 цветов.
На векторе есть игры с предсвинутыми спрайтами полностью в квазе.
Посчитаем. У parallelno спрайты 16*15*8 цветов. Пусть будут 16*16 (может 15 это ошибка). Тогда кваза хватит на 236 таких спрайтов со всеми сдвигами, это очень даже много для сравнительно небольшой игрушки.
BlaireCas
13.08.2022, 13:14
Тогда кваза хватит на 236 таких спрайтов со всеми сдвигами
Нууу.. 640кб хватит всем :) Разумеется там еще и тайлов кучу надо будет бы хранить. Однако да, соглашусь что с прешифтом конечно быстрее. Но ведь там еще и зеркалирование надо. Типа герой ходит ведь не только вправо, а еще и влево (ну и непись тоже).
С прешифтовыми спрайтами там вообще никакой памяти не хватит если даже делать не все 16 цветов.
Да уж, для полноцветных спрайтов это толсто.
Таблицы на 8080 тоже не подарок, хотя если их все выравнивать по 256, то ничего страшного.
Может быть, смотря как сюжет устроен сюжет, можно устраивать прекалк всех спрайтов для конкретной комнаты. Предположительно не все виды монстров встречаются сразу на одном экране, а предсдвиг только нескольких спрайтов занимает умеренно терпимое при переходе между экранами время.
О! Берем всю ходьбу персонажа - кадр за кадр и сдвиг за сдвигом - и заворачиваем ее в zx7 поток и проигрываем его при нажатии клавиши :) Правда именно такие данные не факт, что хорошо сплющатся.
Тогда кваза хватит на 236 таких спрайтов
Если с маской и запасом по 2 байта на каждый спрайт, то 176.
BlaireCas
13.08.2022, 17:41
Отказаться от 16-ти цветов. Да это как коту покушать дать, а он еще просит, не хватит памяти так.
Если в игре делать еще и текст (а в рогаликах он очень много займет тупо текст, вон ведь когда диззи люди делали - то жаловались что тупо из-за текста игра не влезает в 128к)
Вообще ведь Вектор крут с палитрами и позволяет сделать grayscale на игруху без извращений вида "убери цветность с монитора". И причем намного лучше даже графоний будет смотреться (имхо конечно) с 4-мя градациями серого цвета.
По-моему рано отказываться от красоты в 16 цветов. Развертки можно делать перед показом экрана только те, которые могут понадобиться. Сколько персонажей одновременно можно увидеть на экране? Вряд ли 176.
Текст точно можно жать и распаковывать на лету.
parallelno
13.08.2022, 20:35
Чего-то не было в картотеке теста расширений Баркаря, добавил
http://sensi.org/scalar/ware/918/
Насколько распространена была поддержка расширений Баркаря? У меня был раньше квазидиск, но честно сказать я не в курсе было там что-то от Баркаря или нет. :)
Идея сделать игру для вектора с самой распространенной поддержкой квазидиск
- - - Добавлено - - -
Это все предсдвиги? Пора начинать жульничать. Настоящие герои подземелий редко ходят меньше, чем на два пикселя :) Хотя похоже, что кваз все равно понадобится, так что почему действительно им не воспользоваться на всю катушку.
Да, предздвиги на 2 пикселя.
Про хранение маски через байт вместе с пикселями видел? Вывод получается удобно типа pop b \ mov a, m \ ana c \ ora b \ mov m, a
Способ интересный. Спасибо! Для одноцветного спрайта и может даже потянет когда две плоскости задействованы под спрайт. Нужно покумекать как это адаптировать к моему варианту где спрайт в трех плоскостях. Не хочется дублировать маску три раза для каждой плоскости.
Насколько распространена была поддержка расширений Баркаря? У меня был раньше квазидиск, но честно сказать я не в курсе было там что-то от Баркаря или нет. :)
Идея сделать игру для вектора с самой распространенной поддержкой квазидиск
Для хранения данных игры на КД, нет разницы, стандартный КД или с доработкой Баркаря.
Так как на работу КД в режиме стек - эта доработка ни как не влияет.
А вот если захочется часть кода программы хранить на КД в адресном пространстве экранного ОЗУ, и чтобы программа работала физически находясь на КД (при КД включенном в режиме ОЗУ), вот тогда доработка Баркаря полезнее, так как расширяет используемое на КД адресное пространство с 16КБ до 32КБ (в каждом банке КД).
parallelno
13.08.2022, 20:55
Тайлы 16*16 могут быть составлены из 4х элементов 8*8
Думал об этом, но карты будут занимать больше памяти и буферы тоже. Зато выигрыш конечно в гибкости графики для тайлов карты. Пока остановился на 16*16. Меньше памяти, удобства в подсчетах. Например индексация укладывается в один байт и т.п
- - - Добавлено - - -
Кстати еще самые кондовые спрайты можно разворачивать сразу кодом. Это, казалось бы, жир, а толку никакого, но скорость та же, при этом освобождается стек. Можно исполнять прямо из кваза. Можно так сделать для чего-то, чего много и надо быстро, типа тот же мысль-прожетктыль.
lxi b, $7e81 \ mov a, m \ ana c \ ora b \ mov m, a \ dcr l
А если без маски и со стеком, тут вообще можно отжиг устроить
lxi b, $55aa \ push b ; 28 тактов на две строки, а если паттерн повторяется, то и вообще 12 + (8 * число строк).
для тайлов / фона, чего бы и нет
Интересно! Хочется замутить мелкие частицы. Тоже нужно будет что-то быстро и много мелкого рисовать и востанавливать на экране. Есть мысль тупо инвертить те места и востаравливать тоже инвертированием.
- - - Добавлено - - -
На векторе есть игры с предсвинутыми спрайтами полностью в квазе.
Посчитаем. У parallelno спрайты 16*15*8 цветов. Пусть будут 16*16 (может 15 это ошибка). Тогда кваза хватит на 236 таких спрайтов со всеми сдвигами, это очень даже много для сравнительно небольшой игрушки.
Это не ошибка. :)
- - - Добавлено - - -
Да уж, для полноцветных спрайтов это толсто.
Таблицы на 8080 тоже не подарок, хотя если их все выравнивать по 256, то ничего страшного.
Может быть, смотря как сюжет устроен сюжет, можно устраивать прекалк всех спрайтов для конкретной комнаты. Предположительно не все виды монстров встречаются сразу на одном экране, а предсдвиг только нескольких спрайтов занимает умеренно терпимое при переходе между экранами время.
О! Берем всю ходьбу персонажа - кадр за кадр и сдвиг за сдвигом - и заворачиваем ее в zx7 поток и проигрываем его при нажатии клавиши :) Правда именно такие данные не факт, что хорошо сплющатся.
План победы у меня такой. рисовать сразу из кваза. Если это будет невозможно или долго, то придется делать то что ты написал. Ну или стримить сразу с винчестера :D
- - - Добавлено - - -
Отказаться от 16-ти цветов. Да это как коту покушать дать, а он еще просит, не хватит памяти так.
Если в игре делать еще и текст (а в рогаликах он очень много займет тупо текст, вон ведь когда диззи люди делали - то жаловались что тупо из-за текста игра не влезает в 128к)
Вообще ведь Вектор крут с палитрами и позволяет сделать grayscale на игруху без извращений вида "убери цветность с монитора". И причем намного лучше даже графоний будет смотреться (имхо конечно) с 4-мя градациями серого цвета.
Главный поинт всей моей замуты это использовать графические возможности по максимум.
lxi b, $7e81 \ mov a, m \ ana c \ ora b \ mov m, a \ dcr l
Лучше
mov a,m\ ani 81h\ ori 7Eh\ mov m,a\ dcr l
на байт короче и на 4 такта быстрее. Ну и пара BC свободна для чего-нибудь полезного. Например можно в HL, DE и BC разместить все адреса для трех плоскостей и избавиться от тормозящих переходов между плоскостями.
Smalovsky
13.08.2022, 21:15
parallelno, есть же демка "Чип и Дейл". В ней 16 цветов и восстановление фона. Посмотри, может найдешь в ней что-то полезное.
Совет: слушай всех, но делай так как сам считаешь нужным.
Я вижу, уже начинают отговаривать от полноцветности.
BlaireCas
14.08.2022, 16:23
Я вижу, уже начинают отговаривать от полноцветности
Ну засмущал уже. Беру слова назад. Нужно 16 цветов! (а то и правда какой совецкий домашний комп мог такими цветами похвастаться, союз-неон из-за своей единичности можно не считать)
parallelno
15.08.2022, 12:54
Сжал все спрайты, бинарник сдулся с 31к до 11к. Следующий этап сделать тоже самое для тайлов графики.
Помимо этого написал простой тулчейн для биллинга проекта. Теперь не нужно ждать реэкспорта или сжатия графики если исходники не менялись. Знаю что это велосипед и есть make, но если он нужен под виндой это значит тащить в нее кучу всего ненужного, да и тестирование репы для заинтересовавшихся превратится в дикий квест.
parallelno
15.08.2022, 22:22
Сжал данные для уровней. Бинарник усох до 10к. Но тайловой графики пока немного, поэтому размер ещё сильно вырастет.
Следующий этап научить игру распаковывать все на квазидиск и рисовать с квазидиска тайлы и спрайты.
parallelno, с большим интересом слежу за вашим прогрессом. Желаю не потерять интерес и довести дело до конца.
Про тех, кто будет пытаться за вами собирать ваш проект - можно особо не думать. Как правило, у каждого складывается свой любимый тулчейн. Я чаще всего только поглядываю в код других проектов, собирать их самому смысла особого не вижу.
parallelno
17.08.2022, 04:50
Научил. :) Прикольно. Все рисуется все с квазидиска.
За одним улучшил сборку проекта и немного прибрал.
https://youtu.be/DAywn_Y_OMI
- - - Добавлено - - -
Следующий этап добавить какую нибудь тестовую музыку.
parallelno
27.08.2022, 20:05
добавил музыкальный плеер gigachad16, спасибо за код ivagor и svofski. данные плеера находятся на квазидиске. Это можно видеть на видео когда слева на экране пробегают снизу вверх красные горизонтальные полоски.
Было бы здорово видеть еще синим цветом считывание данных. Класная цветомузыка бы была, ну и польза для отладки. :)
https://youtu.be/Owuw2fyBiC8
parallelno
30.08.2022, 09:20
Сделал отрисовку спрайтов с маской, исправил подмаргивание спрайтов. Только к сожалению маска в ее простой реализации не взлетела так как спрайты рисуются не каждый кадр. Разве что с фоном она поможет, чтобы он не просвечивал, но с остальными спрайтами пока чет не очень. Нужно думать. :)
А в чем суть проблемы с маской?
parallelno
30.08.2022, 12:21
Суть проблемы в том что спрайты рисуются не каждый кадр.
Допустим в первый кадр нужно нарисовать только два первых спрайта. Они будут стёрты на старых позициях. Затем нарисованы в новых с маской.
Во второй кадр нужно нарисовать два следующих спрайта. Они будут стёрты в старых позициях.
Если старые позиции перекрывают предыдущие нарисованные спрайты, то они будут стёрты. Маскирование не сработает. В этом проблема.
Придумал как частично полечить. Буду пробовать.
Идея в том чтобы разбить кадр на 4 вертикальные области. Если спрайты попадают в эту область то они за один кадр рисуются с маской. Отрисовка в этих областях в таком порядке чтобы не пересекаться с лучем.
Если старые позиции перекрывают предыдущие нарисованные спрайты, то они будут стёрты.
Во, понял.
Похоже, что способ разделения спрайтов на кадры не идеальный.
Идеально было бы, понятно, отрисовать всё за кадр. Но это видимо вызывает теринг. А ты проверял, правда получается заметный прям режущий глаз теринг? Все же есть вещи, которые мы 8-битным игрушкам охотно прощаем.
Можно складывать всех пересекающихся (вернее, пересекавшихся на прошлом кадре) врагов в одну кучку, рисовать их строго одним кадром, остальных поровну распределять между другими рисовательными кадрами.
Способ с 4 вертикальными областями боюсь может подвести если враги столпятся вокруг героя и все окажутся в одной из четырех вертикальных областей.
Суть проблемы в том что спрайты рисуются не каждый кадр.
Допустим в первый кадр нужно нарисовать только два первых спрайта. Они будут стёрты на старых позициях. Затем нарисованы в новых с маской.
Во второй кадр нужно нарисовать два следующих спрайта. Они будут стёрты в старых позициях.
Если старые позиции перекрывают предыдущие нарисованные спрайты, то они будут стёрты. Маскирование не сработает. В этом проблема.
Придумал как частично полечить. Буду пробовать.
Идея в том чтобы разбить кадр на 4 вертикальные области. Если спрайты попадают в эту область то они за один кадр рисуются с маской. Отрисовка в этих областях в таком порядке чтобы не пересекаться с лучем.
раз ты спрайты по очереди рисуешь может все таки метод поспрайтовой рисовки?
ну когда выбирается сектор с нахлестом вокруг спрайта и все что там есть рисуется
parallelno
30.08.2022, 19:52
На векторе есть игры с предсвинутыми спрайтами полностью в квазе.
Посчитаем. У parallelno спрайты 16*15*8 цветов. Пусть будут 16*16 (может 15 это ошибка). Тогда кваза хватит на 236 таких спрайтов со всеми сдвигами, это очень даже много для сравнительно небольшой игрушки.
Ага. С памятью под спрайты проблем нет. Сейчас распределение пока такое:
Банк0_0000-7ffff - спрайты героя и половины врагов.
Банк0_8000-ffff - тайлы уровня
Банк1_A000-dfff - текущий клип.
Еще много банок свободных.
Спрайты со сдвигом на 2+маска
- - - Добавлено - - -
Во, понял.
Похоже, что способ разделения спрайтов на кадры не идеальный.
Идеально было бы, понятно, отрисовать всё за кадр. Но это видимо вызывает теринг. А ты проверял, правда получается заметный прям режущий глаз теринг? Все же есть вещи, которые мы 8-битным игрушкам охотно прощаем.
Можно складывать всех пересекающихся (вернее, пересекавшихся на прошлом кадре) врагов в одну кучку, рисовать их строго одним кадром, остальных поровну распределять между другими рисовательными кадрами.
Способ с 4 вертикальными областями боюсь может подвести если враги столпятся вокруг героя и все окажутся в одной из четырех вертикальных областей.
Ага, не идеальное решение. Но если я правильно понимаю твой способ то там может произойти тоже самое.
Кстати способ рисовать спрайты не за один кадр я решил из-за скорости отрисовки. Не хватает у меня времени на всех.
- - - Добавлено - - -
jerri, на отрисовку всего за один кадр у меня не хватает времени кадра. Но возможно стоит покопать в эту сторону если с горизонтальными секторами не взлетит.
Если ты не запрещаешь прерывания, то что значит "не хватает времени на всех"?
jerri, на отрисовку всего за один кадр у меня не хватает времени кадра. Но возможно стоит покопать в эту сторону если с горизонтальными секторами не взлетит.
Сделай скорость 25 фпс и освежай раз в два фрейма
parallelno
30.08.2022, 20:29
svofski, да, я не запрещаю. но я стараюсь уложиться в кадр чтобы пониматься где у меня луч бежит и обходить его. Возможно я не понял твою идею.
- - - Добавлено - - -
Сделай скорость 25 фпс и освежай раз в два фрейма
к сожалению у меня не получается уложится в 25 fps при отрисовке всех спрайтов. сейчас основная масса спрайтов (скелеты) рисуется 12.5fps. кадый спрайт рисуется в 3 плоскости с маской.
к сожалению у меня не получается уложится в 25 fps при отрисовке всех спрайтов. сейчас основная масса спрайтов (скелеты) рисуется 12.5fps.
оу. а тут еще жощще. а скорость как стабилизируешь?
Возможно я не понял твою идею.
Я к тому, что может быть просто рисовать как рисуется и все, не думать пока о мелочах. Нормально обогнать луч тяжело. Ты еще устанешь от этого, а потом переделаешь что-то в игре и все придется заново придумывать.
Meanwhile, такая безумная идея -- что если пожертвовать 8К для слоя маски? На самом деле меньше, потому что не весь экран ведь задействован. Жирно конечно, но открываются дополнительные возможности пятачка
Назовем его слой Ъ. Вначалѣ Ъ пустъ.
Кадр 1.
Затираем группу спрайтов 1 в предыдущей позиции. Затираем только те биты, которые не установлены на соответствующем месте в слое Ъ (в первом кадре это все биты)
Рисуем группу спрайтов 1 в новой позиции и OR-им маску в слой Ъ.
Кадр 2.
Затираем группу спрайтов 2 в предыдущей позиции. Затираем только те биты, которые не установлены на соотв. месте в слое Ъ (тут мы обходим стороной то, что было отрисовано в первом кадре)
Рисуем группу спрайтов 2 в новой позиции и OR-им маску в слой Ъ.
... так продолжается столько, сколько предусмотрено промежуточных фаз ...
Кадр X межфазный. Чистим слой Ъ и все начинается сначала.
parallelno
30.08.2022, 22:07
jerri, скорость привязана к прерываниям. Если апдейт+ draw не уложились в кадр, то в следующий раз апдейт выполнится столько раз сколько прошло прерываний с прошлого раза.
jerri, скорость привязана к прерываниям. Если апдейт+ draw не уложились в кадр, то в следующий раз апдейт выполнится столько раз сколько прошло прерываний с прошлого раза.
ага дельта тайминг. разумно.
Но я обычно вешаю обработку на прерывание.
8к много - столько не нужно.
используй блоки 8*8 для маркировки освежения местности.
parallelno
30.08.2022, 22:34
Я к тому, что может быть просто рисовать как рисуется и все, не думать пока о мелочах. Нормально обогнать луч тяжело. Ты еще устанешь от этого, а потом переделаешь что-то в игре и все придется заново придумывать.
Meanwhile, такая безумная идея -- что если пожертвовать 8К для слоя маски? На самом деле меньше, потому что не весь экран ведь задействован. Жирно конечно, но открываются дополнительные возможности пятачка
Назовем его слой Ъ. Вначалѣ Ъ пустъ.
Кадр 1.
Затираем группу спрайтов 1 в предыдущей позиции. Затираем только те биты, которые не установлены на соответствующем месте в слое Ъ (в первом кадре это все биты)
Рисуем группу спрайтов 1 в новой позиции и OR-им маску в слой Ъ.
Кадр 2.
Затираем группу спрайтов 2 в предыдущей позиции. Затираем только те биты, которые не установлены на соотв. месте в слое Ъ (тут мы обходим стороной то, что было отрисовано в первом кадре)
Рисуем группу спрайтов 2 в новой позиции и OR-им маску в слой Ъ.
... так продолжается столько, сколько предусмотрено промежуточных фаз ...
Кадр X межфазный. Чистим слой Ъ и все начинается сначала.
Интересно. Если я правильно понимаю, то если чистить слой ъ целиком, то спрайты в кадрах 2,3 и остальных межфазных кадрах потеряют возможность быть корректно сбленджеными так как при новой фазе могут быть стёрты. Или я что-то упустил?
- - - Добавлено - - -
ага дельта тайминг. разумно.
Но я обычно вешаю обработку на прерывание.
8к много - столько не нужно.
используй блоки 8*8 для маркировки освежения местности.
В прерывании держать апдейт для меня означает что я не смогу ничего нарисовать когда луч вверху экрана в области бордюра.
Сейчас обработчик выполняется в середине кадра. В начале кадра рисуется то что в нижних позициях, а после апдейта рисуется то что нужно в верхних позициях. Таким образом я избавляюсь от пересечения с лучем.
- - - Добавлено - - -
По поводу моего метода разделения области отрисовки на 4 вертикальные области.
svofski, да, ты прав что спрайты могут скучковаться в одной области. Но для меня будет ок такие случаи имхо. На msx и nes тоже есть подобное ограничение. Спрайты начинают моргать. Если не получится это излечить, то думаю это ок.
Интересно. Если я правильно понимаю, то если чистить слой ъ целиком, то спрайты в кадрах 2,3 и остальных межфазных кадрах потеряют возможность быть корректно сбленджеными так как при новой фазе могут быть стёрты. Или я что-то упустил?
Нет, маска в Ъ блокирует только затирание. У тебя беда в том, что межфазное затирание может затереть предыдущую фазу. Эта маска как раз не дает этого сделать.
Затиралка маскирует затирание по маске из Ъ.
Рисовалка делает ИЛИ своей маски в Ъ. В остальном она рисуется как раньше. Блендится со всем предыдущим.
Может быть правда можно обойтись просто пометкой блоков 8х8, как говорит jerri, но чего-то я пока не соображу как.
parallelno
31.08.2022, 00:34
Нет, маска в Ъ блокирует только затирание. У тебя беда в том, что межфазное затирание может затереть предыдущую фазу. Эта маска как раз не дает этого сделать.
Затиралка маскирует затирание по маске из Ъ.
Рисовалка делает ИЛИ своей маски в Ъ. В остальном она рисуется как раньше. Блендится со всем предыдущим.
Может быть правда можно обойтись просто пометкой блоков 8х8, как говорит jerri, но чего-то я пока не соображу как.
Про первые межфазные кадры понятно что маска будет блокировать. Но как она поможет в первом кадре новой фазы если она будет очищена? Вот это я не пойму.
- - - Добавлено - - -
В методе Jerry меня смущает оверхед на установку/восстановление стека, и других параметров спрайта каждый раз для маленького блока 8*8. Но возможно это как-то тоже можно избежать.
- - - Добавлено - - -
svofski, твой способ это я так понимаю некое подобие стенсил буфера для стирания спрайтов. в идеале он должен хранить отрисованные в него маски всех присутствующих на экране спрайтов. Но как его готовить корректно (удалять из него то что уже не на экране) не каждый кадр я что-то не вижу.
- - - Добавлено - - -
в теории этот стенсил буфер можно готовить каждый кадр для всех спрайтов которые не нужно перерисовать в текущем кадре. Затем для спрайта который нужно отрисовать в текущем кадре удаляется с экрана его старая версия по маске стенсила чтобы не испортить те спрайты которые не нужно перерисовать. Затем на экран рисуется этот спрайт с маской чтобы не запортить уже нарисованные спрайты. Если в текущем кадре нужно обновить ещё один спрайт, то нужно в стенсил буфер нарисовать маску спрайта который на предыдущем шаге отрисовал на экран.
- - - Добавлено - - -
Можно попробовать для начала стирать спрайты не блоком как сейчас, а по маске спрайта. С учётом того что спрайты двигаются на 2 пикселя, то по идее глюки где не восстановиливается изображение после стерания будет небольшим.
Но как она поможет в первом кадре новой фазы если она будет очищена?
В первом кадре новой фазы она будет пустая, потому что в первом кадре новой фазы ей нечего защищать.
Слово стенсил подходит. Чистить его надо будет не каждый кадр, а после отрисовки всех спрайтов. Допустим у тебя все разбито на 4 кадра:
Начали. Отрисовали кадр 1, 2, 3, 4 (все это время маска там копится, не давая затиралке из кадра 2 затереть то, что было нарисовано в кадре 1). Очистили. Отрисовали кадр 1, 2, 3, 4. Очистили. итд
Первому кадру не надо стирать с маской, потому что там гарантировано пусто, а последнему незачем рисовать в маску, потому что она будет стерта сразу после отрисовки. На этом можно сэкономить.
parallelno
31.08.2022, 03:08
svofski, приведу пример который меня смущает. У нас два спрайта один перекрывает второй частично. Первый был нарисован в первой межфазе. Второй в последней межфазе.
Теперь мы очищаем стенсил маску.
Начинается новая фаза. Как стереть старый первый спрайт не поломав второй если у нас нет информации в стенсиле где он нарисован?
Да, так пожалуй не выйдет. Первая интерфаза затрет последнюю.
parallelno
31.08.2022, 11:09
Сделал как описал выше. То есть просто стирать по маске в старых позициях, потом рисовать по маске в новых. С разбиением на два вертикальных участка получилось почти избавиться от моргания когда луч догоняет отрисовку. Но что-то оно все равно не очень хорошо получилось, поэтому записывать видео пока не стал.
Завтра с утра ещё покумекаю.
Стирание по маске и рисование по маске одного спрайта выходит конечно очень накладно. Возможно можно ускорить для случаев когда спрайты не перекрывают друг друга, но как это определить быстро пока идей немного.
- - - Добавлено - - -
Можно ещё упростить отрисовку с если не вытирать по маске (ana), а только делать ora. Будет пошустрее. Плюс такого подхода не нужно хранить маску через байт с цветом. Экономия памяти под спрайты и вытирать по маске будет чуть быстрее.
Стирание по маске и рисование по маске одного спрайта выходит конечно очень накладно. Возможно можно ускорить для случаев когда спрайты не перекрывают друг друга, но как это определить быстро пока идей немного.
N спрайтов.
Есть карта тайлов, что-то типа 32х20. Вначале там все -1 (или какой-то еще признак отсутствия спрайта в клетке).
Дополнительно таблица флагов: непересекается[N] - вначале все true, оптимизим.
цикл i по всем спрайтам
Берешь спрайт i. Определяешь какие клетки он занимает и -
Если во всех клетках спрайта i пусто:
записываешь в них индекс спрайта i.
иначе, если там не пусто:
непересекается[i] = false
из каждой клетки под спрайтом i берешь число m (они могут быть разные), записываешь в таблицу флагов непересекается[m] = false
Когда фон чёрный, быстрее всего, конечно, выводить и стирать xor-ом. Другое дело, устроят ли артефакты при пересечении спрайтов...
parallelno
31.08.2022, 18:25
b2m, у меня данные спрайтов лежат на квазидиске. В момент отрисовки я их обязательно должен прочитать в регистровую пару bc. При таком способе xor тоже быстрее? Мне видится что нет, но может я что-то упускаю.
А как xor тут вообще поможет? Он работает только если четное число раз ксорим сами с собой одно и то же. Даже если бы тут был черный фон, ксоры между разными спрайтами все перексорят к чортям.
1) 1 й спрайт xor 2, 2) 1 xor 2 xor 3, 3) 1 xor 2 xor 3 xor 4
1 xor 2 xor 3 xor 4 xor 4=1 xor 2 xor 3 - вернулись к шагу 2)
1 xor 2 xor 3 xor 3=1 xor 2 - вернулись к шагу 1)
Но в местах наложения нескольких спрайтов на экране каша.
Самое крутое ксоренье мне запомнилось из clrs b2m'a. Я на самом деле до сих пор не понял, как это было сделано =)
В общем четное количество ксоров чего угодно расксорятся потом обратно. Но в промежутке-то на их месте получается полный фарш. А с цветами так и совсем печалька.
parallelno
31.08.2022, 19:45
svofski, если я все правильно понимаю то xor это инверсия по маске, поэтому и проворачивается фарш обратно при двойном xor. :) Только нужно держать цвет инвертированным.
О, понял. Действительно будет быстрее, так как маскирование при отрисовке нового спрайта не нужно делать. А старый спрайт стирать с той же скоростью.
- - - Добавлено - - -
Размышляя о том куда копать дальше понял что преследуя изначальную задумку загнал себя в тупик.
Изначально я придумал что у каждого спрайта есть счётчик показывающий в какие кадры его нужно рисовать, а в какие нет. Это цикличный байт типа 00010001 для монстра и 01010101 для героя. В каждый кадр этот счётчик скролился в право и если 1 попадал во флаг переноса, то мы рисуем.
Это дало возможность рисовать спрайты с разным fps, но привело к тому что непонятно как их корректно блендить. Плюс нет двойной буферизации. Это я решил излечить меняя порядок отрисовки. В итоге как и говорил
svofski, это сложно контролировать. То есть это работает если на экране с 6-8 спрайтов, но не работает с 2.
Дальше я планировал добавить другие штуки Аля пули и т.п. что ещё больше усложнит убегание от луча. Плюс ко всему этому ещё то что этот подход хоть техническии и не запрещает прерывания, но все же полагается на них чтобы работало убегание от луча. В итоге я экономлю перформанс на разном fps для спрайтов, но трачу его на синхронизацию с прерываниями и иду по пути очень сложного и не стабильного рендера. В общем все взвесил и решил что попробую сделать с двойной буферизацией, если будет ещё медленнее или хуже, то просто забью на бленд спрайтов и буду рисовать без маски и с запасом чтобы новый спрайт стирал свою старую копию на экране.
metamorpho
31.08.2022, 20:40
parallelno, а это обязательно, чтобы движущиеся объекты проходили "насквозь" друг друга ?
Если я правильно понял обсуждаемую проблему то есть вариант сделать - что два движущихся объекта столкнувшись расходятся в разные стороны, т.о. нет перекрытия спрайтов. Так сделано во многих играх. Такой подход упростит задачу.
блин 30 лет технологий и снова сочиняем велосипеды, самокаты и прочие велобеги.
1 синхронизация по прерываниям.
1.1
50 раз в секунду выполняются прерывания.
выбираем кратность и например со скоростью 1 через 2 выполняем обработку всех персонажей на экране.
результат обаботки записываем в один из двух списков выводимых спрайтов
1.2
во внешнем рендере выбираем один из двух списков и отрисовываем все спрайты по списку выбранным способом
плюсы - стабильная скорость персонажей, стабильная скорость героя.
Теперь об отрисовке
На примере игры Jack the Nipper 2
вывод спрайтов с маской поверх фоновой графики и других спрайтов
также возможен спрайт за предметами Фореграунда
Титульный экран
77735
состоит если присмотреться из блоков 32*32 которые состоят из элементов 8*8
77736
карта экрана представляет собой массив элементов
и дополнительную таблицу действий где указываются элементы которые нужно восстановить на экране или элементы которые нужно отрисовать из набора модифицированных элементов
при отрисовке персонажей создается модифицированный набор элементов куда копируются элементы фона поверх которых накладываются спрайты.
на экран выводятся либо модифицированные элементы, либо фоновые которые надо восстановить
77737
parallelno
31.08.2022, 21:47
metamorpho, ага, спасибо. Но хотелось бы иметь возможность пересечения спрайтов.
- - - Добавлено - - -
jerri, спасибо за почву для размышления.
Изобретение велосипедов эта один из элементов вдохновения для меня, так что все ок! :)
При таком способе xor тоже быстрее? Мне видится что нет, но может я что-то упускаю.
Нет, что OR, что XOR, работают одинаково быстро. Я к тому, что при использовании XOR при выводе спрайтов не нужно заботиться о пересечении спрайтов. К тому-же, используется одна и та-же процедура, как для вывода, так и для стирания (главное стирать в тех-же координатах).
Привет всем...
Обычно мерцание спрайтов - буфером устраняется...
Но тут видать - вариант особый...
Для особого варианта - можно сделать так...
1. Делаем карту экранов.
То есть - каждый экран делим на области.
Экран задействован не весь, поэтому делим через массив...
2. Смещаем персонажей - не по номерам,
а по областям экрана, в которых они находятся...
3. Между областями экрана по периметру -
делаем буферные области, которые обсчитываются
по-другому, чтобы устранить мерцание спрайтов
между областями экрана...
???
BlaireCas
02.09.2022, 19:28
А вот в exolon кстати как сделано? Там тупой xor вроде если смотреть на спрайты. Ну тайлы да, иной раз сверху перекрывают (иной раз нет). И плохо не выглядит и быстро, зачетно.
Правда в нем нет background-a ...
- - - Добавлено - - -
видать - вариант особый...
Буфера скушают много памяти, 16 цветов ведь. Если полностью буферизировать. Там и так на прешифт спрайтов потратится ого..
Jerri собственно всё расписал как делается с буферизацией и раскладкой по кускам буферов обновлять/не обновлять/обновлять, но потом. Но имхо спек-то побыстрее да и он "одноцветный"
Раз уж все высказывают свои предпочтения -- я больше за полноцвет. Просто потому что на Векторе мало полноцветных игр. Ради этого я готов потерпеть немножко мерцание и артифаченье.
Имхо на векторе не так уж мало многоцветных игр с моргающими спрайтами.
BlaireCas
02.09.2022, 20:13
Имхо на векторе не так уж мало многоцветных игр с моргающими спрайтами.
Но много и хороших годных игр. Я сам вот не знал что вообще был такой компьютер как Вектор оказывается (а он смотрю очень крут для тех времен). Детство с БК-Синклер. И да, спрайты моргали во многих играх. Считалось вполне нормальным в те годы. Челендж мол сделать чтобы не моргали и не потерять полноцветность и скорость. Я не смог так на УКНЦ. Полноцветно только штук 5 спрайтов 16х16 с бэкграундом на 25fps вышло. Но .. многое можно пофиксить геймдизайном же.
Если игра увлекательная и красивая, то если там мельтешит где-то иногда, это не страшно. Даже на NES все время всякая хрень выскакивает в играх там и сям. Геймплей важнее.
Привет всем...
Думаю без буфера - спрайты будут мерцать...
Пусть померцают...
???
BlaireCas
03.09.2022, 02:31
Пусть померцают...
Там сложнее другое. Я знаю этот набор картинок, это называется 2d pixel dungeon asset pack, увы - самое сложное рисовать картинки для игры самому (тайлы/спрайты), если игру не передирать с чего-то - это дело застрянет на полпути (рисовать 8-бит графоний не все умеют, программерам это сложно до ужасу, рисовал паука в 4-х цветах почти полдня и он получился говеным, после чего руки начали опускаться)
parallelno
03.09.2022, 08:27
Размышляя о том как организовать рендер с двойной буферизацией родил вот такой псевдокод ниже. Сильно смущают большие накладные расчеты. Можно конечно попробовать заменить 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 в который нужно скопировать данные спрайта.
parallelno
03.09.2022, 12:17
Привет всем...
Обычно мерцание спрайтов - буфером устраняется...
Но тут видать - вариант особый...
Для особого варианта - можно сделать так...
1. Делаем карту экранов.
То есть - каждый экран делим на области.
Экран задействован не весь, поэтому делим через массив...
2. Смещаем персонажей - не по номерам,
а по областям экрана, в которых они находятся...
3. Между областями экрана по периметру -
делаем буферные области, которые обсчитываются
по-другому, чтобы устранить мерцание спрайтов
между областями экрана...
???
Если честно, то я не совсем понял идею.
Напиши пожалуйста что скрывается под многоточия и и знаками вопроса. :)
- - - Добавлено - - -
блин 30 лет технологий и снова сочиняем велосипеды, самокаты и прочие велобеги.
1 синхронизация по прерываниям.
1.1
50 раз в секунду выполняются прерывания.
выбираем кратность и например со скоростью 1 через 2 выполняем обработку всех персонажей на экране.
результат обаботки записываем в один из двух списков выводимых спрайтов
1.2
во внешнем рендере выбираем один из двух списков и отрисовываем все спрайты по списку выбранным способом
плюсы - стабильная скорость персонажей, стабильная скорость героя.
Теперь об отрисовке
На примере игры Jack the Nipper 2
вывод спрайтов с маской поверх фоновой графики и других спрайтов
также возможен спрайт за предметами Фореграунда
Титульный экран
77735
состоит если присмотреться из блоков 32*32 которые состоят из элементов 8*8
77736
карта экрана представляет собой массив элементов
и дополнительную таблицу действий где указываются элементы которые нужно восстановить на экране или элементы которые нужно отрисовать из набора модифицированных элементов
при отрисовке персонажей создается модифицированный набор элементов куда копируются элементы фона поверх которых накладываются спрайты.
на экран выводятся либо модифицированные элементы, либо фоновые которые надо восстановить
77737
Два списка выводимых спрайтов для того чтобы не пересекаться с измененными данными обработки всех персонажей?
А что включает в себя таблица действий? Можешь прописать по подробнее, пожалуйста? :)
- - - Добавлено - - -
Ещё было бы здорово если бы ты описал подробнее из каких элементов состоит карта экрана и структуру набора модифицированных элементов.
BlaireCas
03.09.2022, 12:24
Если есть возможность переключать экраны:
Рисуешь тайлы в оба экрана изначально. Затем рисуешь в например первый экран спрайты уж там с маской без маски как угодно. Помечаешь битом в таблице тайлов куски 16х16 скажем которые были затронуты прорисовкой спрайтов. Переключаешь экран туда. Затем восстанавливаешь тайлы которые были помечены и были под спрайтами. Рисуешь аналогично на второй экран, помечаешь затронутые куски, переключаешь экран туда, затем оттуда тоже восстанавливаешь затронутый бэкграунт.. ну ит.д.
Если нет возможности переключать экраны:
Рисуешь то-же самое в куске памяти. Помечаешь какие тайлы затронули нарисованные спрайты уже двумя битами типа 11. Выводишь на экран куски из буфера которые были затронуты (помечены первым или вторым битом). Восстанавливаешь тайлы помеченные первым битом при этом перемещая его во второй. (это будет нужно если спрайт "прыгнет" через тайл чтобы вывести на экран все-же восстановленный тайл бекграунда потом хотя мол туда ничего не рисовалось)
parallelno
03.09.2022, 12:37
Если есть возможность переключать экраны:
Рисуешь тайлы в оба экрана изначально. Затем рисуешь в например первый экран спрайты уж там с маской без маски как угодно. Помечаешь битом в таблице тайлов куски 16х16 скажем которые были затронуты прорисовкой спрайтов. Переключаешь экран туда. Затем восстанавливаешь тайлы которые были помечены и были под спрайтами. Рисуешь аналогично на второй экран, помечаешь затронутые куски, переключаешь экран туда, затем оттуда тоже восстанавливаешь затронутый бэкграунт.. ну ит.д.
Если нет возможности переключать экраны:
Рисуешь то-же самое в куске памяти. Помечаешь какие тайлы затронули нарисованные спрайты уже двумя битами типа 11. Выводишь на экран куски из буфера которые были затронуты (помечены первым или вторым битом). Восстанавливаешь тайлы помеченные первым битом при этом перемещая его во второй. (это будет нужно если спрайт "прыгнет" через тайл чтобы вывести на экран все-же восстановленный тайл бекграунда потом хотя мол туда ничего не рисовалось)
У меня нет возможности переключать экраны, поэтому спрошу про твой второй подход.
Скажи пожалуйста а почему помечать какие тайлы затронули битами типа 11 лучше чем в моем варианте? И ещё вопрос, в этом варианте не используется буфер тайлов? Все делается в "куске памяти"? Какая его структура?
BlaireCas
03.09.2022, 13:09
А в тайловом буфере ведь все-равно будешь хранить информацию в битах мол тут проходимо, тут непроходимо, тут кислоту кто-то разлил на пол и наступить нельзя, тут дыра в полу и провалишься скажем на нижний уровень если не перепрыгнуть и т.д.
То-есть весь экран будет поделен скажем на 16х16 куски в которых будут # тайлов пола собственно (бекграунда) и плюс еще какая-то битовая информация. Можно сделать что в эту битовую информацию до кучи пишется бит "сюда рисовали спрайт в этот квадратик и его надо вывести на экран и потом восстановить взад тем тайлом который там был до этого и перевести бит изменений во второй" и второй бит "сюда рисовали что-то на прошлом кадре, но сейчас спрайт убежал и восстанавливать ничего не надо, а просто вывести на экран этот кусок 16х16 и обнулить бит".
(с буферизацией будет тормозно ибо скажем спрайт находится посредине и затрагивает 4 тайла вокруг себя - их придется все четыре перерисовывать на экран сначала, а затем прорисовывать в буфер обратно взад уже без спрайтов и это будет оверхед прорисовки, но что поделать, зато нормально выглядеть станет)
parallelno
03.09.2022, 13:35
BlaireCas, понял. Спасибо! Ты используешь этот подход про который ты написал про 16x16 тайля в своей игре Descent?
- - - Добавлено - - -
А как ты находишь тайлы которые нужно вывести на экран?
- - - Добавлено - - -
Я имею ввиду после того как ты нарисовал их в бэк буфыер.
- - - Добавлено - - -
А как на укнц задаётся цвет на пиксель?
- - - Добавлено - - -
Всем кто делиться своими ценными советами. Большое спасибо!
Пожалуйста не забывайте что спрайты в моей игре имеют 8 цветов (три экранные плоскости отрисовки)
BlaireCas
03.09.2022, 13:41
А как на укнц задаётся цвет на пиксель?
Три цветных буфера используется. Синий зеленый красный собственно. Тройная прорисовка в буфера получается (очень накладно увы).
При самом выводе их на экран там свои проблемы на том компьютере (тормоза).
Размерами 256х224 то-есть 32х28 знакомест или 16х14 тайлов по 16х16 (почему тайлы по 16 - ну там 16-ти битный типа комп, он сразу word может фигануть, на 80-м проце видимо 8х8 самое оно будет)
Когда прохожусь по таблице спрайтов которые надо вывести на экран - я модифицирую биты в тайловой табличке исходя из координат спрайта. Мол сюда рисовался спрайт на этом кадре (это может быть и один тайл и два и четыре).
Ну и так все спрайты прорисовываются в буфер и модифицируется битовая таблица тех тайлов буфера которые были затронуты прорисовкой спрайтов.
Затем прохожусь по битовой табличке этой тайловой и если вижу бит что сюда мол спрайт пририсовался (первый бит установлен), то вывожу на экран этот кусок 16х16 из всех буферов разумеется, затем восстанавливаю этот кусок тем тайлом который там указан для бекграунда.
Зачем нужен второй бит (рисовали сюда на прошлом кадре) - нууу :) чтобы "куски предыдущих спрайтов" не маячили на экране, там если попробуешь так делать то сразу поймешь.
Еще самый простой способ чтобы спрайт "заходил за экран" это сделать эти буфера побольше отображаемой области на экране. А на экран выводить без внешних кусков.
parallelno
03.09.2022, 13:54
Три цветных буфера используется. Синий зеленый красный собственно. Тройная прорисовка в буфера получается (очень накладно увы).
Размерами 256х224 то-есть 32х28 знакомест или 16х14 тайлов по 16х16.
Когда прохожусь по таблице спрайтов которые надо вывести на экран - я модифицирую биты в тайловой табличке исходя из координат спрайта. Мол сюда рисовался спрайт на этом кадре (это может быть и один тайл и два и четыре).
Ну и так все спрайты прорисовываются в буфер и модифицируется битовая таблица тех тайлов буфера которые были затронуты прорисовкой спрайтов.
Затем прохожусь по битовой табличке этой тайловой и если вижу бит что сюда мол спрайт пририсовался (первый бит установлен), то вывожу на экран этот кусок 16х16 из всех буферов разумеется, затем восстанавливаю этот кусок тем тайлом который там указан для бекграунда.
Зачем нужен второй бит (рисовали сюда на прошлом кадре) - нууу :) чтобы "куски предыдущих спрайтов" не маячили на экране, там если попробуешь так делать то сразу поймешь.
Еще самый простой способ чтобы спрайт "заходил за экран" это сделать эти буфера побольше отображаемой области на экране. А на экран выводить без внешних кусков.
Ты проходишь по всей битовой таблице? Каждый экранный тайл?
- - - Добавлено - - -
В укнц 8 одновременных цветов?
- - - Добавлено - - -
У меня ещё пара вопросов. Насколько понятен алгоритм который я описал? На сколько хорошо ты знаешь архитектуру вектора?
BlaireCas
03.09.2022, 14:08
Ты проходишь по всей битовой таблице? Каждый экранный тайл?
Ну да, не выводить ведь все буфера на экран, это будет 3fps тогда игра и то в лучшем случае. Почему мол клево бы было если можно переключать экраны.
На сколько хорошо ты знаешь архитектуру вектора?
Вообще не знаю, я просто увидел что оказывается в СССР был такой компьютер и он очень многообещающий был. Мол и звук там приличный и графика и еще мол 256кб памяти подключить. Ого! Вот и интересно стало. Ну и опять-же просто люблю когда кто-то делает игры на старую технику.
- - - Добавлено - - -
В укнц 8 одновременных цветов?
Там все сложнее, можно и 128 если "нормальная укнц". Но это уже за гранью. Считается что 8 и все (в одной строке экрана).
Два списка выводимых спрайтов для того чтобы не пересекаться с измененными данными обработки всех персонажей?
да по одному из списков рисуешь спрайты
по второму в этот момент идет отрисовка
это для того чтобы сцена отрисовывалась всегда правильно.
А что включает в себя таблица действий? Можешь прописать по подробнее, пожалуйста? :)
здесь просто :
находим 0 - проходим мимо
находим 1 - заносим 0 - берем из массива элементов и рисуем на экран элемент фона
находим 2+ заносим 1 и из массива модифицированных элементов рисуем элемент за номером 2+
Ещё было бы здорово если бы ты описал подробнее из каких элементов состоит карта экрана и структуру набора модифицированных элементов.
ну например
77746
это таблица элементов для игры
из этих элементов собираются блоки
77747
из блоков собираются экраны
но все равно карта состоит из элементов 8*8 и все манипуляции происходят с базовыми элементами
карта модифицированных элементов состоит из обычных элементов поверх которых наложены спрайты.
например ты рисуешь спрайт размером 3*2
таблица действий выглядит так
0 0 0 0 0 0 0
0 0 1 1 1 0 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0
1- там где в прошлом цикле этот спрайт уже был отрисован
для начала высчитываем и вносим в таблицу номера элементов
пусть наш спрайт сдвинулся вправо
таблица теперь выглядит так
0 0 0 0 0 0 0
0 0 1 2 4 6 0
0 0 1 3 5 7 0
0 0 0 0 0 0 0
почему по вертикали - при генерации элементов 8*8 и использовании прескролленых спрайтов их удобнее хранить вертикально
теперь поверх накладываем еще один спрайт например 2*2
0 0 0 0 0 0 0
0 0 1 2 4 6 0
0 0 1 3 8 10 0
0 0 0 0 9 11 0
здесь можно увидеть что при создании новых элементов мы использовали не только фоновые но и уже модифицированные элементы
следом идет освежение экрана
0 0 0 0 0 0 0
0 0 0 1 1 1 0
0 0 0 1 1 1 0
0 0 0 0 1 1 0
в процессе которого на экране будут произведены изменения в нужных местах.
вопросы?
Если честно, то я не совсем понял идею.
Напиши пожалуйста что скрывается под многоточия и и знаками вопроса. :)
Привет...
Составляем на экраны - массивы...
Например, так...
CCCCCCCCC
111C22222
111B22222
CCCBCCBBB
CCCCCC333
CCCCCC333
1, 2, 3 - области, которые обновляем...
C - пустые области, где персонажи бегать не могут...
B - буферные области. Переход из одной области в другую...
За прерывание - обновляем персонажи в одной области - 1, 2, 3...
C - не обновляем...
B - переходы между областями, как то надо посчитать...
Привет...
Составляем на экраны - массивы...
Например, так...
это твои фантазии или в какой-то конкретной игре подсмотрел такое ?
parallelno
03.09.2022, 21:34
BlaireCas, я правильно понимаю что буфер который ты используешь размером с игровое поле на экране?
- - - Добавлено - - -
jerri, я правильно понимаю что в карта модифицированных элементов размером с игровую область на экране?
BlaireCas
03.09.2022, 21:44
BlaireCas, я правильно понимаю что буфер который ты используешь размером с игровое поле на экране?
Если нужно сделать простой заход за пределы игрового поля - буфер будет больше на некоторую величину в каждую сторону. А так он ну с отображаемую область экрана и попрет. Всякие переходы между экранами можно геймдизайном обставить без захода "за экран".
Jerri кстати хорошо вон расписал. Правда я чет не очень понял идею зачем инкрементировать постоянно прорисовку. Мне пары бит хватило. А так цельный байт чтоли тратить на признак у тайла чет слишком будет жирно. Но возможно просто так намного быстрее на 8080 получается чем выставлять биты прорисовки тут я х.з.
jerri, я правильно понимаю что в карта модифицированных элементов размером с игровую область на экране?
да два массива размером по 768 или 1024 байта
- - - Добавлено - - -
Jerri кстати хорошо вон расписал. Правда я чет не очень понял идею зачем инкрементировать постоянно прорисовку. Мне пары бит хватило. А так цельный байт чтоли тратить на признак у тайла чет слишком будет жирно. Но возможно просто так намного быстрее на 8080 получается чем выставлять биты прорисовки тут я х.з.
там не признак тайла, а тайл с модификацией.
в первом массиве карта тайлов фона
во втором массиве карта тайлов и действий
parallelno
04.09.2022, 01:04
jerri, то есть первый буфер который 768 байт содержит байт в котором запакованы данные об индексе тайла во втором буфере и признак действия с тайлом (стереть, нарисовать). Индекс от 0 до 31.
А в момент отрисовки ты по всему первому буферу в 768 байт пробегаешь или как то хитрее например пропускаешь пустые строки?
- - - Добавлено - - -
BlaireCas, подход интересный, но требует очень много памяти. Нужно подумать
- - - Добавлено - - -
Stl75, мне нравится этот подход так как он позволяет рисовать спрайт целым куском во многих случаях. Это сильно уменьшает накладные расходы, но я тоже не могу придумать оптимальный алгоритм для отрисовки пересекающихся областей. То есть нужно считать колижен всех объектов которые рисуются на экране. Но возможно это как-то можно будет использовать и для игровой логики тоже, тогда это будет более оправданно.
- - - Добавлено - - -
Если найти быстрый способ определения задевает ли спрайт кого-то ещё или нет, то можно скрестить этот метод с тайловым выводом. То есть рисовать спрайт сразу на экране если он не задевает никого, и рисовать спрайт тайловым методом если задевает.
BlaireCas
04.09.2022, 01:33
Кстати тут наверное уже думалось про то что главного героя и скелетов можно тупо сделать на одном цветовом плане белым цветом который будет перекрывать остальные цвета (да увы будет потеряна вся крутая цветность компа, но блин - дофига игр где одноцветные спрайты и они смотрятся нормально и по 8-ми битному, а то с этими 16-ю цветами полный швах со скоростью будет)
jerri, то есть первый буфер который 768 байт содержит байт в котором запакованы данные об индексе тайла во втором буфере и признак действия с тайлом (стереть, нарисовать). Индекс от 0 до 31.
в первом буфере номера тайлов фона
во втором буфере номер модифицированного тайла 2-255 либо ничего либо 1 команда восстановления фона
А в момент отрисовки ты по всему первому буферу в 768 байт пробегаешь или как то хитрее например пропускаешь пустые строки?
по всему
drop_screen0
or (hl)
call nz,drop_tile
inc l
jp nz,drop_screen0
inc h
ret
Stl75, мне нравится этот подход так как он позволяет рисовать спрайт целым куском во многих случаях. Это сильно уменьшает накладные расходы, но я тоже не могу придумать оптимальный алгоритм для отрисовки пересекающихся областей. То есть нужно считать колижен всех объектов которые рисуются на экране. Но возможно это как-то можно будет использовать и для игровой логики тоже, тогда это будет более оправданно.
Привет всем...
Подумал про обработку буферных областей...
Например...
11111BBB2222
В таком варианте - для буферных областей есть такие варианты -
1. Персонаж из области 1 выходит в B - 1-B,
2. Персонаж в B - B,
3. Персонаж из B - переходит в область 2 - B-2...
Случай 1 - обрабатываем совместно с областью 1,
когда область 1 - обновляем...
Случай 3 - совместно с областью 2...
Если персонажи в 1 и 3 пересекаются с буферными -
обновляем эти буферные персонажи...
Случай 2 - оставшиеся буферные персонажи обновляем отдельно...
???
BlaireCas
05.09.2022, 15:27
Подумал про обработку буферных областей...
Персонажи когда рисуются в буфер - типа ставишь 2 например
000000
002200
000000
Рисуешь на экран:
проходишь по массиву, всё что больше 0 {
буфер -> экран
все что больше 1 надо после отрисовки на экран восстановить буфер тем тайлом который там есть
уменьшить на 1
}
Персонаж пошел вправо:
000000
001220
000000
Отрисовались на экран все 1,2, восстановились в буфере те где 2, ну и уменьшаем на 1
Персонаж остановился
000000
000220
000000
Персонаж телепортировался влево (внезапно) - тут восстановит экран там где он был до этого
000000
220110
000000
А еще вообще если без буфера - то можно сделать ведь чтобы персонажи не пересекались друг с другом. Ну мол скелеты чтобы не наезжали на другие скелеты и на игрока. Глядишь и буферизация не нужна станет.
parallelno
16.09.2022, 09:52
Попробовал писать таловый рендер, на пол пути бросил изза того что получался чудовишный оверхед на обработку такого рендера. В итоге сделал back buffer на квазидиске.
Пусть пока нет скелеликов, но проделана тонна работы. Персонаж теперь стирается и рисуется в квазидиске. Затем переносится на основной экран. Прерывания не запрещаются. Перенос части библиотеки спрайтов на квазидиск было увлекальным занятием. :) Функции спрайтов теперь обрабатываются как библиотека с внешними метками. Это буквально дополнительный проект, который компилируется, архивируется, потом линкуется с основной программой. Потом библиотека разархивируется рантайм и копируется на квази-диск. Все функции вызываются оттуда. Это дает допольнительных 8K и будет очень полезно в дальейшем когда настанет время разворачивать циклы. :) Часть из них уже развернута, но все еще есть что анролить.
https://youtu.be/XVyTK_Ygnko
Размах использования кваза впечатляет. Интересно будет увидеть как это работает с полом и скелетиками.
Пусть пока нет скелеликов
Скелёлики :)
BlaireCas
16.09.2022, 19:21
но проделана тонна работы
Ну.. никто никуда не спешит. Люди год пишут игрушки и недописывают (я например и не только). Но вообще с музыкой смотрится очень даже весело. Но постойте? Это что - так ВИ53 может звучать?
Это что - так ВИ53 может звучать?
Нет, это AY, но ви53 тоже будь здоров умеет -- это в соседней ветке (https://zx-pk.ru/threads/34149-emulyatsiya-ay-s-ispolzovaniem-vi53).
parallelno
19.09.2022, 21:03
Дописал код для back buffer. Скелёлики вернулись :) Вроде не моргают. Другой позитивный эффект, раньше они рисовались в 12.25fps, теперь в ~25fps. то есть сейчас все рисуется в 24fps, в дальнейшем конечно станет меньше. :) Но я все равно доволен результатом
https://youtu.be/aQzsnWXytzM
- - - Добавлено - - -
Можно заметить над головами героя и скелетов появляются мусорные пиксели. Где-то бага и прирывание портит данные на квазидиске. Нужно лечить :)
Дописал код для back buffer. Скелёлики вернулись Вроде не моргают. Другой позитивный эффект, раньше они рисовались в 12.25fps, теперь в ~25fps. то есть сейчас все рисуется в 24fps, в дальнейшем конечно станет меньше. Но я все равно доволен результатом
Привет всем...
Уже хорошо смотрится...
parallelno
08.10.2022, 00:21
Stl75, Спасибо!
Можно заметить над головами героя и скелетов появляются мусорные пиксели. Где-то бага и прирывание портит данные на квазидиске. Нужно лечить
Починил этот баг. Обновил систему анимации. Раньше смена кадров хотьбы зависела от позиции, теперь это зависит по времени. Это привело к обновлению анимационного формата. Теперь монстры и герои не мельтешат ножками. :) Так же герой теперь перемещается по пиксельно. Данные немного разбухли но пока терпимо. Ром весит 18.2KB
https://youtu.be/ZQPsXvlsqTs
parallelno
13.10.2022, 06:17
Немного новостей. Работая над атакой героя, решил что было бы хорошо добавить побольше тайлов и всех оставшихся мостриков с анимациями и посмотреть а сколько игра занимает сейчас.
Получилось ~28К. Что уже приближается к максимуму для моей игры. так как я распаковываю данные в экранную память, затем перемещаю в квазидиск. Думал думал что же делать и решил что можно последний блоб данных который вылезет за 32К не сжимать и перемещать как есть в квазидиск, тем самым освобождать видео память для распаковки оставшихся кусков. Это дало примерно 8К что очень неплохо, но не супер. итого сводобной памяти стало 11К. затем пришла идея не хранить preshifted спрайты к rom игры, а расчитывать их в игре на этапе инициализации. Потестил, это дало +~9К что уже звучит неплохо. Затем еще покумекав доработал zx0 чтобы он сразу на квазидиск распаковывал. Тем самым последний блоб тоже можно сжать. Это высвободило еще памяти, плюс ром ьеперь можеть быть 64К. В итоге сейчас rom со всеми монстрами, анимациями и тайлами занимает примерно 16K, и 48K свободно что звучит сейчас как анлим для меня. :D
Распределение памяти сейчас такое.
https://pic.maxiol.com/images2/1665630709.3326747235.gamenonamememmap.jpg
генерация preshifted спрайтов все еще в процессе, поэтому пока только скриншот :)
https://pic.maxiol.com/images2/1665631499.3326747235.gamenoname01.jpg
https://pic.maxiol.com/images2/1665631756.3326747235.gamenoname02.jpg
parallelno, а комнаты, т.е. лабиринт уже весь сделан? это же тоже сколько-то займёт, пусть и не так много как графика?
Мне нравится деталь как края лабиринта рассеиваются во тьму. Мелочь, но очень приятно.
parallelno
13.10.2022, 19:43
nzeemin, комнат пока 3. Планируется несколько десятков. Да, это займет сколько то памяти. Да и проджектал пока один и анимаций смертей нету. Уверен что снова придется кумекать где бы ужаться :D
- - - Updated - - -
svofski, спасибо. Сейчас вижу что нужен какой-то паттерн, а то смотрится мусорно.
parallelno
19.10.2022, 11:11
Опять немного новостей про проект.
Доделал прешифтинг спрайтов до состояния "не оптимально но без ошибок". Запуск игры теперь с ощутимой задержкой в 3-4 секунды. Ром немного разбух до 17.2к из-за "лишь бы работало" кода. :)
Перенес код гигачада на квазидиск в тот же банк где сама музыка. Это дало аж 60 байт! :)
Видео не прилагаю так как визуально ничего не поменялось.
В игре используется бэк буфер в три экранных области. Отрисовка спрайтов туда не подвержена теарингу, так как это не основной экран. Спрайты обычно 24*15 пикселей, но их ширина и высота могут быть разными, но не шире 24 пикселя. Первая мысль была рисовать их по столбцам, так как 15 байт подряд более длинный сиквенс чем при отрисовке горизонтальными линиями в 3*3 байт. Но у меня не получилось сделать код быстрее чем тот что вы обсуждали здесь на форуме. Буду очень благодарен если кто-то осилит этот челендж и найдет более оптимальное решение.
Ещё хочу сказать что организация самого бэкбуфера может быть любая, главное чтобы перенос спрайта из него на основной экран был быстрым.
- - - Updated - - -
Забыл добавить что перенос спрайта из бэкбуфера в квазидиске на основной экран сделан по столбцам. Переносить спрайт горизонтальными линиями у меня получилось медленнее. Если кто-то попробует найти более быстрый вариант, буду безмерно благодарен. :)
перенос спрайта из квазидиска на основной экран сделан по столбцам. Переносить спрайт горизонтальными линиями у меня получилось медленнее.
Если выводить в три плоскости подряд (по 3 байта) и змейкой, то нет разницы в скорости, хоть по столбцам, хоть по строкам (но по строкам менее заметен тиринг без аппаратной двойной буферизации).
parallelno
19.10.2022, 12:06
ivagor, я имел ввиду что переносить спрайт из бэкбуфера на квазидиске в основной экран сделан по столбцам так как pop читает данные вдоль столбцов.
Формат бэкбуфера не обязательно должен совпадать с форматом экрана.
parallelno
19.10.2022, 20:15
Формат бэкбуфера не обязательно должен совпадать с форматом экрана.
Ага. Кажется я указывал это несколькими сообщениями выше. :)
- - - Updated - - -
ivagor, если у тебя получится найти быстрый способ переноса спрайта из бэкбуфера построчно, то будет супер.
Если выводить в три плоскости подряд (по 3 байта) и змейкой, то нет разницы в скорости, хоть по столбцам, хоть по строкам
Это я про вывод отдельных тайлов, которые можно расположить в памяти блоками. Для копирования из графического бэкбуфера такого результата, к сожалению, вряд ли получится достичь, по столбцам будет быстрее в связи с меньшим количеством прерываний линейности копирования. Вопрос в соотношении таких критериев как скорость вывода и заметность тиринга.
parallelno
20.10.2022, 05:46
Не знаю насколько точно emu80 и v06x соответствуют реальному вектору. Думаю что очень близко. Но теаринга я не наблюдаю.
Не знаю насколько точно emu80 и v06x соответствуют реальному вектору. Думаю что очень близко. Но теаринга я не наблюдаю.
С точки зрения теринга соответствуют очень хорошо.
Есть еще особенность вывода на писишный монитор, у него свой рефреш как правило некратный 50, поэтому какое-то артифаченье и неплавность возможны даже когда источник сигнала 50Гц. Самый лучший результат, который у меня получалось достичь с не-реалом, был с v06x на raspberry pi 3 с композитным выходом, подключенным к ЭЛТ. Композитный выход raspi 3 можно настроить в "псевдо-прогрессивную" развертку и 50Гц. Некоторые вещи, которые кажутся не идеально плавными в эмуляторах, могут быть на самом деле плавными на реале и ЭЛТ. Или даже они могут дергаться на реале с LCD, просто потому что LCD внутри делает конвертацию. Но по-моему это не те эффекты, которые можно заметить в такой игре. Это больше когда что-нибудь быстро летает, или скроллится.
parallelno
21.10.2022, 07:47
Было бы здорово если кто-нибудь потестил ром игры на реальном векторе. Заранее спасибо!
Ром можно скачать пройдя по ссылке https://github.com/parallelno/Vector06c/blob/main/Vector06c_Dev/_Projects/GameNoname/rom/GameNoname.rom
и кликнув скачать
Еще небольшой апдейт. Закончил preshifting фичу. Пришлось немного повозится чтобы перенести ее код на квазидиск. У меня данные которые перенесятся на квазидиск объединяются в сегменты по 32K, затем сжимаются. чтобы сделать прешифтинг нужно положить 32K сегмент в квазидиск в адреса $8000 и выше, чтобы он был доступен для испольняемого кода, но так как сегмент занимает почти все 32к, то для кода в адресах $8000 и выше уже не остается места. Пришлось переписать сборку проекта так чтобы можно было автоматически сплитить 32K сегменты на произвольные чанки и упаковывать отдельно. Затем в игре я распаковываю каждый чанк, прешифтю данные спрайтов, переношу на нужное место в квазидиске. Код на квазидиске лежит в адресах $8000-9FFF. Адреса с $A000-FFFF используются для backbuffer. Поэтому пока игра инициализирует свои данные, эти 24K очень пригодились для прешифтинга.
Прикладываю видео для того чтобы оценить задержку перед старторм уровня. Примерно 4 сек. но это только для скелета и героя. Интересно будет подумать потом как размазать этот процес по времени чтобы это небыло скучным ожиданием для игрока.
https://youtu.be/rRHAd5Y1Jn4
Прешифт можно сильно ускорить, например так:
;один раз читаем
mov e,m
inx h или dcx h
mov d,m
inx h или dcx h
mov a,m
;сдвигаем
xchg
dad h\ ral
xchg
lxi b,...
dad b ;перешли к месту хранения сдвинутого варианта
mov m,a
dcx h или inx h
mov m,d
dcx h или inx h
mov m,e
;потом еще сдвигаем и записываем и т.д.
Одно чтение на 7 записей.
parallelno
21.10.2022, 11:13
ivagor, о, класс. Про dad отличная идея!
- - - Updated - - -
Если сдвигать сразу на несколько пикселей, то получается выгоднее чем просто rar или ral
- - - Updated - - -
Код конечно разбухнет, но попробовать стоит. :)
- - - Updated - - -
По поводу одно чтение, 7 записей к сожалению не подходит в моем случае так как ширина прешифтленных спрайтов у меня может быть разная.
- - - Updated - - -
Хотя в некоторых случаях понадобится смещение в право. Но для этого можно оставить старый код.
По поводу одно чтение, 7 записей к сожалению не подходит в моем случае так как ширина прешифтленных спрайтов у меня может быть разная.
Это я не понимаю. Есть спрайт, у него некоторая ширина, нужно сгенерировать 7 сдвинутых версий. Если проблема в ширине>3 байт, то по крайней мере до 5 байт можно использовать подобный подход, но придется переделать и эффективность уменьшится.
- - - Добавлено - - -
Хотя в некоторых случаях понадобится смещение в право.
Это я тоже не понимаю. Прешифт выборочный, не для всех спрайтов генерируются сдвиги на 7 позиций? Ну или например на 3 позиции с шагом 2, это без разницы.
- - - Добавлено - - -
по крайней мере до 5 байт можно использовать подобный подход, но придется переделать и эффективность уменьшится.
А лучше до 4
parallelno
21.10.2022, 12:22
для того чтобы понять почему так, представь что видимая ширина монстрика может быть допустим 10 пикселей. Поэтому для нескольких предсмещенных спрайтов достаточно ширины спрайта 16, а для остальных 24 пикселя. Поэтому ширина плавает и зависит от арта.
Для спрайтов с видимой шириной меньше 16 пикселей для завершающих сдвигов пересылаем H->L, A->H, оставляем dad h, убираем ral (а можно и не пересылать и не убирать, по минимуму достаточно откорректировать только записи). Как это мешает подходу "1 чтение 7 записей" и зачем нужен сдвиг вправо я так и не понял.
Было бы здорово если кто-нибудь потестил ром игры на реальном векторе. ...
Что именно нужно на реале проверить?
Запускается. Мерцаний спрайтов не видно.
К сожалению ни каких звуковых карт не подключено, бегает в тишине.
Немного не понял с управлением. Иногда создается впечатление, что за углы лабиринта цепляется, и пока не отпустишь клавиши, персонаж "бежит" на месте. Отпускаешь клавиши, нажимаешь снова, и дальше побежал.
Возможно так задумано, но после перехода в новую комнату, также "бежит" на месте, пока клавишу курсора не отпустишь.
А в принципе, очень шустро новая комната формируется, и объектов на экране одновременно бегает не мало.
parallelno
21.10.2022, 19:06
Как это мешает подходу "1 чтение 7 записей"
Я не писал мешает. Я написал что не подходит в моем случае. :) Потому что видимая ширина может быть любой. Плюс хранение спрайта змейкой. Плюс смещение вправо. Много бойлед кода получается в моем случае.
зачем нужен сдвиг вправо я так и не понял.
Например монстрик на картинке ниже во втором кадре считая слева внутри своего 16 пиксельного спрайта сдвинут вправо на 2 пикселя.
https://pic.maxiol.com/images2/1666367795.3326747235.burnerpreshiftedsp.jpg
...я так и не понял.
Если тебе что-то еще непонятно, то пожалуйста спрашивай. Только пожалуйста не передергивай мои слова. Я считаю что сделать можно все что угодно, дело в целесообразности. Именно для моего случая лично мне видится твой подход нецелесообразным. Для тебя он выглядит целесообразным. Это ок. :)
Про "1 чтение 7 записей" я в итоге понял так, что скорость прешифта не является главным критерием. Нет проблем, автор сам определяет направления оптимизации.
Про "2 вправо" - 2 вправо=6 влево. При наличии всех остальных (или не всех, а например с шагом 2) сдвигов можно сдвигать в любую сторону. И в этом случае наличие команды dad h дает преимущества при сдвиге влево. Нужны ли эти преимущества - опять же решать автору.
Про "мешает" и "не подходит". Передергивания тут нет, ни буквального (это была не цитата) ни по смыслу. У меня есть право излагать мысли так, как я их думаю (оставаясь в рамках вежливости и правил форума). А я думаю так, что если "не подходит", значит что-то "мешает" тому чтобы подошло.
parallelno
22.10.2022, 00:46
ivagor, я бы сказал что скорость скроллинга парой команд dad/ral не является для меня главным критерием их использования.
По поводу мешает или не подходит. Что тебе мешает написать код прешифтинга полностью так чтобы он работал в моей игре? Буду безмерно благодарен. :)
- - - Updated - - -
А вообще, я чет утомился обсуждать это. Пользы вижу ноль. :)
parallelno
13.11.2022, 10:15
Небольшой апдейт. Начал добавлять анимацию атаки и выяснилось что система прешифтинга не работает для спрайтов с шириной 8. Пришлось знатно повозится чтобы переделать и исправить баги. Но зато теперь код стал понятенее. Доработал систему обработки мобов. Теперь трейл это тоже моб с логикой. Сам решает когда дестроиться и дальнейшем будет обрабатывать колии и сендить дамаг. Для синхронизации трейла с герояем добавил состояние моба "невидимый". Радует что вырисовывается вполне класическая система обработки игровых объектов. Это позволит проще и быстрее наростить новых монстров, оружие. :)
https://youtu.be/oMrtnKQ0KJ4
parallelno
14.11.2022, 23:46
Еще один небольшой, но очень важный для меня апдейт. добавил востановление бэкграунда за спрайтами. Пока неоптимизированно, но я уже счастлив! Это же прям полноцветная (почти) игра (почти) для вектора! :D
https://youtu.be/d840SC6_F3I
Смотрится совсем по-взрослому. Пока не хватает собственно игры ;)
parallelno
15.11.2022, 21:18
svofski, очень не хватает. Мои дети уже не понимают что я там так долго вожусь и где все их задумки. :) Это прям какое-то экзистенциальное наслаждение выцарапывать лишние такты. :D
Еще один небольшой, но очень важный для меня апдейт. добавил востановление бэкграунда за спрайтами. Пока неоптимизированно, но я уже счастлив! Это же прям полноцветная (почти) игра (почти) для вектора! :D
https://youtu.be/d840SC6_F3I
не хватает сортировки по У
Это прям какое-то экзистенциальное наслаждение выцарапывать лишние такты
Да, но это тяжело совмещать с разработкой более высокого уровня. Но если у тебя есть представление о том, что должно получиться в итоге, не проблема.
parallelno
16.11.2022, 20:29
Да, но это тяжело совмещать с разработкой более высокого уровня. Но если у тебя есть представление о том, что должно получиться в итоге, не проблема.
Ага, приходится постоянно бить себя по рукам и писать в коде TODO. :) Какое-то представление что должно получится вроде имеется. Идею игры обдумал с детьми еще на этапе бенчмарков. Представление об игровых движках тоже какое-то есть. Но если честно то уровень изврата чтобы выцарапывать скорость я себе не представлял. :D
Но если честно то уровень изврата чтобы выцарапывать скорость я себе не представлял.
Ну так вот, Вектор он такой, суровый. Вроде бы все просто, а как что-то сделать чтобы красиво и не тормозно, это убиться. И чаще всего у людей сил на не убиться не остается =)
parallelno
18.11.2022, 11:27
Еще апдейт. Пофиксил и оптимизировал востановление бэка, коллизию с тайлами. Добавил обработку колизий герой-монстр. Добавил обработку демеджа, добавил простенький UI для отображения жизни героя.
https://youtu.be/Y8T0PQdOFoc
jerri, придумал как сэкономить на сортировке по высоте. Можно чтонить быстрое но не обязательно эффективное использовать. Типа сортировку пузырком и делать один проход по списку оъектов за апдейт. За несколько апдейтов будет все отсортировано. Так как частота перемещивания спрайтов по высоте не высока, то поидее должно работать.
И еще хочу попробовать чекать колизии монстров с героем каждый второй апдейт. По идее тоже будет чуть быстрее. И делать это с учётом сортировки по высоте.
parallelno
30.11.2022, 23:03
Очередной апдейт. :)
Перелопатил билд систему. Теперь добавлять новых мостров и разпределять данные по страницам квазидиска стало легко как никогда. :) Это позволило положить спрайты героя для левого и правого направления в разные страницы, так как в один сегмент (~32K) они уже не влезают.
билд скрипт теперь готовит статистику. Можно видеть где что и сколько памяти осталось. Показана ниже:
; ram-disk data layout
; bank0 addr$0000 [400 free] - sprites: ['heroR', 'skeleton', 'scythe', 'hero_attack01']
; bank0 addr$8000 [32768 free] - empty:
; bank1 addr$0000 [7672 free] - sprites: ['knight', 'burner', 'vampire']
; bank1 addr$8000 [0 free] - $8000-$9FFF tiledata buffer (collision, copyToScr, etc), $A000-$FFFF back buffer2 (to restore a background in the back buffer)
; bank2 addr$0000 [18046 free] - sprites: ['heroL']
; bank2 addr$8000 [19856 free] - music: ['song01', 'gigachad16PlayerRD']
; bank3 addr$0000 [26532 free] - levels: ['level01']
; bank3 addr$8000 [6136 free] - $8000-$9FFF code library. $A000-$FFFF back buffer
rom size: 23372 bytes ($5b4c)
Добавил новых монстров для лучшего понимания потребления памяти и времени на прешифт. Иногда монстрики делают лунную походку Майкла Джексона. Это ок, мозги у них пока такие же простые как у скелета. :)
Добавил новых тайлов для лучшего понимания потребления памяти.
Улучшил анимацию атаки героя.
https://youtu.be/q2yfeQIEZvA
parallelno
10.12.2022, 10:02
Обновил AI скелета и его косы. Скелет теперь умеет следить за героем, у него появилось радиус зрения, он умеет выжидать добычу, атаковать и отдыхать после охоты. Коса может отскакивать от препятствий и дамажить героя. :)
https://youtu.be/KROu95GmJd8
parallelno
12.12.2022, 22:15
Исправил скрипт для экспорта анимаций. Теперь коса вращается правильно и ноги у монстриков перебирают все кадры.
Обновил логику огонька и добавил ему новых спрайтов для атаки.
https://youtu.be/F9r7XN57tSw
parallelno
07.02.2023, 10:44
Добавлен арт и логика рыцаря. Он становится в защитную стойку если видит противника. Добавлен новый прожектайл вампира. Немного ускорено и пофикшено
https://youtu.be/cBjr93d_8hk
parallelno
16.02.2023, 05:08
переработал все скрипты для экспортера данных. теперь можно сохранять анимации в верхние сегменты банков квазидиска. сделал статистику того что сохраняется в квазидиск чуть более детальную. можно видеть сколько занимает памяти каждый ассет и сколько пустого места осталось.
переработал формат спавн данных. теперь уровень может иметь больше комнат. Добавил анимарованные объекты на заднем фоне, факел и флаг. Они очень экономно рисуются, прямо на экран минуя бэк буфер, апдейтятся по одному за кадр, а не все сразу как мобы и пули. рисуются только когда есть переход на следующий кадр анимации.
Для примера внизу статистика по памяти квазидиска ту что выдают скрипты после билда проекта.
; ram-disk data layout
; bank0 addr0 [ 1054 free] description:
; hero_r_sprites [14466], skeleton_sprites [10140], scythe_sprites [1626], hero_attack01_sprites [5226],
; bank0 addr8000 [32304 free] description:
; backs_sprites [464],
; bank1 addr0 [ 5554 free] description:
; knight_sprites [16398], burner_sprites [9600], bomb_slow_sprites [960],
; bank1 addr8000 [ 0 free] description: $8000-$9FFF tiledata buffer (collision, copyToScr, etc), $A000-$FFFF back buffer2 (to restore a background in the back buffer)
; bank2 addr0 [10162 free] description:
; hero_l_sprites [14466], vampire_sprites [7884],
; bank2 addr8000 [19856 free] description: Music player and songs
; song01 [12542], gigachad_player_rd [370],
; bank3 addr0 [26212 free] description:
; level01 [6300],
; bank3 addr8000 [ 6136 free] description: $8000-$9FFF code library. $A000-$FFFF back buffer
; sprite_rd [173], draw_sprite_rd [544], utils_rd [87], sprite_preshift_rd [1538],
; [101278 total free]
https://youtu.be/mVaOHm-sK1Q
parallelno
20.02.2023, 11:19
немного переработан формат данных тайла. Это позволит запихнуть больше вариантов тайлов. Добавлен спавн рейт монстров. Если монстров поколашматить в комнате, то при возвращении в эту комнату будет беньше монстров. обновлена графика тайлов. Герой после получения урона становится на некоторые время неуязвимым. Как только он атакует, он возвращается в нормальное состояние.
https://youtu.be/-vuDJewo738
parallelno
22.02.2023, 09:39
больше экспериментов с графикой :)
https://youtu.be/mYgKsGy_MEE
Мерцание гг в период неуязвимости кажется немного медлительным для такого насыщенного действия. А вообще очень вкусно, хочется уже поиграть :)
parallelno
21.03.2023, 20:19
Про мерцания понял, принял.
Подскажите пожалуйста как лучше (по производительности) реализовать звуковые эффекты в игре где уже используется AY. В идеале проигрывать одноканальные звуки длительностью до одной секунды. Играть достаточно только один звуковой эффект одновременно.
parallelno
23.03.2023, 20:08
Написал простенький двух канальный плеер, и сталкнулся с проблемой поиска/создания звуковых эффектов. Подстажите плиз где обычно создаются звуковые эффекты для ретро платформ. Может быть есть какие-то бесплатные тулзы которые позполяют контертировать готовые семплы? Или можеь быть есть где-то паки с готовыми звуками для игр для AY чипа?
- - - Добавлено - - -
Вобщем если кто-то тоже ищет, то нашелся редактор эффеков с готовыми примерами.
https://github.com/Threetwosevensixseven/ayfxedit-improved
parallelno
24.03.2023, 07:17
есть так же web версия этого редактора с чуть меньшим функционалом
https://zx.remysharp.com/audio/#src=MjA4LDMy
Про мерцания понял, принял.
Подскажите пожалуйста как лучше (по производительности) реализовать звуковые эффекты в игре где уже используется AY. В идеале проигрывать одноканальные звуки длительностью до одной секунды. Играть достаточно только один звуковой эффект одновременно.
Привет...
Кстати, классная игра...
Честно говоря, музыкальный редактор на Векторе не видел...
На Спектруме для AY - есть множество редакторов -
Sound Tracker, Pro Tracker, ASM - Sound Master...
Самый простой наверное, вариант...
Взять демку для Вектора, в которой музыка со Спектрума...
Например, Просто Мария - и вытащить из нее плеер...
А музыку написать в любом редакторе для AY...
А так, Vortex' ом можно музыку для AY компилировать...
https://vtrd.in/pcutilz/VT2_6_22.zip
parallelno
24.03.2023, 19:38
Stl75, спасибо! Музыка и плеер в игре уже есть, спасибо svofski! Спецэффектами тоже разобрался спасибо авторам ссылок сверху. Но все равно спасибо за интерес к проекту!
Ребят, я тут задумался будет ли кому то из вас интересно посмотреть видео обзор о том из чего состоит проект, сборка, какие решения, форматы, и тулзы использованы для сборки проекта?
Просто хочется что-бы комуто кто решит тоже понастольгировать было легче начать.
Про твой подвиг можно уже не один обзор снять, а целый сериал сделать. Конечно интересно.
Интересно, но сначала бы еще саму игру посмотреть.
Поддерживаю ivagor-a, но по себе знаю, что если не делать путевых заметок, потом бывает уже ничего не вспомнить да и не очень хочется.
parallelno
27.03.2023, 08:14
Пытаюсь сделать настраиваюмую громкость музыки на AY чипе. Выключил звук во всех каналах задав гротмкость каналам 0 (8, 9, 10), но оставил включенной битик для огибающей. Думал что звука не будет, но звук остался. Играем огибающая. То есть громкость огибащей нельзя настроить, только можно выключить? Подскажите пожалуйста.
То есть громкость огибащей нельзя настроить, только можно выключить?
Да, огибающая использует весь диапазон ЦАПа.
parallelno
31.03.2023, 03:35
апдейт. добавлены звуки. пока только для атаки вимпира и хит героя. добвлены предметы которые можно разрушать, бочки, коробки. Добавлены уникальные предметы такие как ключи. Добавлены двери, юзая ключи, можно их открывать. Добавлены ресурсы такие как монетки, бутылки. В процессе добавления непроходимые предметы такие как сундуки. Некоторые рантайм буфферы перенесены в конец памяти и динамически создаются чтобы уменьшить размер рома. Буферы выровнены в памяти чтобы был быстрее доступ. Добавлено много обработчиков для обработки подберания, использования всех этих предметов. оптимизированны и уницифированны процедуры для коллизии и обработки данных тайлов. Это позволило отказаться от 8К буфера для данных тайлов на квазидиске. Плюс в копилку памяти. ram-disk data layout пока показываеь эту память как занятую.
Табличка распределения памяти на квазидиске:
; ram-disk data layout
; bank0 addr0 [ 1054 free] description:
; hero_r_sprites [14466], skeleton_sprites [10140], scythe_sprites [1626], hero_sword_sprites [5226],
; bank0 addr8000 [28253 free] description:
; level01_data [789], backs_sprites [496], decals_sprites [3230],
; bank1 addr0 [ 5554 free] description:
; knight_sprites [16398], burner_sprites [9600], bomb_sprites [960],
; bank1 addr8000 [ 0 free] description: $8000-$9FFF tiledata buffer (collision, copyToScr, etc), $A000-$FFFF back buffer2 (to restore a background in the back buffer)
; bank2 addr0 [10162 free] description:
; hero_l_sprites [14466], vampire_sprites [7884],
; bank2 addr8000 [19521 free] description: Music player and songs
; song01 [12542], sound_rd [705],
; bank3 addr0 [25880 free] description:
; level01_gfx [6632],
; bank3 addr8000 [ 5996 free] description: $8000-$9FFF code library. $A000-$FFFF back buffer
; sprite_rd [173], draw_sprite_rd [340], draw_sprite_hit_rd [318], draw_sprite_invis_rd [26], utils_rd [87], sprite_preshift_rd [1538],
; [96420 total free]
https://youtu.be/oVTMN_sKn0c
- - - Добавлено - - -
А еще допилил напильником подсветку ASM синтаксиса в VS Code. Стало совсем хорошо :)
https://i.ibb.co/bJg5mks/asm-syntax-highlighting.jpg
По видео кажется, что ну просто невозможно подкрасться к монстру без потери HP -- ты все время сначала на него наступаешь, потом только уже машешь мечом. Это ты еще не научился играть, или какие-то детали механики игровой пока недоделаны?
То есть громкость огибащей нельзя настроить, только можно выключить? Подскажите пожалуйста.
Огибающая замещает собой регулировку громкости. То есть, громкость берётся либо из регистра громкости соответствующего канала, либо из генератора огибающей.
parallelno
31.03.2023, 18:40
По видео кажется, что ну просто невозможно подкрасться к монстру без потери HP -- ты все время сначала на него наступаешь, потом только уже машешь мечом. Это ты еще не научился играть, или какие-то детали механики игровой пока недоделаны?
Согласен, очень некомфортно играть. Промахиваюсь и постоянно попадаю под раздачу. Хочется увеличить радиус атаки и сделать ее побыстрее.
Огибающая замещает собой регулировку громкости. То есть, громкость берётся либо из регистра громкости соответствующего канала, либо из генератора огибающей.
понял, спасибо. Удивительно как народ с помощью такой ограниченной технологии делал и делает отличные чиптюн треки.
А вот кто в курсе, я заметил что на NES звук как-то побогаче чтоли, нет такого популярной бульшающей гармоники как любят использовать в AY. В чем принцыпиальная разница между звуковым чипом на NES и AY-3-8910? Можно ли как-то перенести/адаптировать композиции?
Написал простенький двух канальный плеер, и сталкнулся с проблемой поиска/создания звуковых эффектов. Подстажите плиз где обычно создаются звуковые эффекты для ретро платформ. Может быть есть какие-то бесплатные тулзы которые позполяют контертировать готовые семплы? Или можеь быть есть где-то паки с готовыми звуками для игр для AY чипа?
Возможно, это не то, вопрос про AY. Я для роботов сделал SFX на 8253, AY оставил для музыки.
К Вектору можно на самом деле подключить Sound Tracker и R-Sound, но, думаю это редкий случай в RL. Хотя мне сдаётся, ivagor по-моему такое делал для меня на DE1.
На таймере всего либо 3 уровня громкости, либо 3 канала. Просто набил сэмплы используя макро-средства m80. Получился некий ad-hoc язык.
Каждый сэмпл имеет заголовок,
Пример сэмпла №32 из роботов: запуск лифта
; Elevator start
IFNDEF _PATLIB
ASEG
.PHASE 0
INCLUDE A:HDRSFX.INC
INCLUDE B:SFX.INC
EndIF
PATHDR <CH32_0,CH32_1>
CH32_0: DB 0
Attack 20,15000,1,-30
Vibrato 15,14000,15000,1,1,-600,-40
Vibrato 30,4000,4000,1,1,-70,-25
Vibrato 30,1300,3000,1,1,20,100
Vibrato 25,2400,5000,1,1,200,180
EndCh
CH32_1: DB 1
Vibrato 10,15000,14500,1,1,-100,-50
Pause 144
Vibrato 25,2400,5000,1,1,200,60
EndCh
Отдельные ноты тоже можно вставлять. Скажем, открывание двери выглядит так (тут 3 канала):
; Door 3 open SFX
IFNDEF _PATLIB
ASEG
.PHASE 0
INCLUDE A:HDRSFX.INC
INCLUDE B:SFX.INC
EndIF
PATHDR <CH13_0,CH13_1,CH13_2>
CH13_0: DB 0
Vibrato 8,Hz050,Hz100,2,1,1500
Vibrato 14,Hz050,Hz100,2,3,-1500,1000
EndCh
CH13_1: DB 1
pause 2
Vibrato 50,80,3500,1,1,20,500
EndCh
CH13_2: DB 2
pause 6
note 3219,2
note 6438,2
pause 7
note 4551,5
pause 8
note 3219,1
note 1609,1
note 3219,1
pause 8
note 5734,6
pause 10
note 6438,3
pause 3
note 4551,3
pause 11
Vibrato 4,9102,4551,1,1
EndCh
PATHDR вначале описывает, сколько сэмплу нужно каналов. Драйвер использует каналы динамически. Сколько есть свободных (если предыдущий patch играет), столько и запустит на проигрывание. Отдельный сэмпл можно скомпилить и проиграть утилитой playsfx (в аттаче).
Все сэмплы компилятся в файл sfxlib (sfxlib.mac в аттаче) и кидаются в один из банков квазидиска. При загрузке файла, роботы настраивают слинкованные смещения начала сэмплов в sfxlib добавляя смещения по которым лежат сэмплы. Драйверу просто асинхронно говорится по прерыванию типа играй сэмпл 32, и он играет на свободных каналах тем же кодом что playsfx.
Это-упрощённо. Там есть свои гитики. И это-не AY.
мне нравится идея использовать AY и ВИ53 вместе. По-моему они могут прекрасно друг друга дополнять.
AY и ВИ53 вместе. По-моему они могут прекрасно друг друга дополнять
Если для эффектов+музыки или наоборот, то да, но из музыки вдвоем ничего хорошего не получится. Для музыки подошел бы разве что дуэт с первоначальным вариантом R-Sound, где тактовая 1.5 МГц бралась из вектора, но он совсем не получил распространения.
Что, такой разъезд страшный, что даже побасить ви53 не выйдет?
Может бас и прокатит (высокочастотные - точно нет), надо пробовать и слушать. Но нужна первоначальная настройка, частота AY м.б. и 1.75 и 1.78, возможно были еще варианты.
parallelno
03.04.2023, 04:50
PPC, Идея использования каналов как громкость превосходная! Спасибо! Я отказался от AY для эффектов так как музыка сильно кораптится.
parallelno
05.04.2023, 21:48
Очередной апдейт. Добавлены сундуки, теперь они сохраняют свое состояние открытия, добавлены VFX. немного прибран и оптимизирован код. обновлена и поправлены ram-disk data layout статистика. Теперь 8K которые высвободились после удаления tiledata screen buffer используются и корректно отображаются в статистике.
https://youtu.be/ViaEkJmOhms
parallelno
07.04.2023, 10:06
сделал шрифт. Получилось имхо очень неплохо. %) сам собой доволен :D
https://i.ibb.co/DQ6xzsw/game-noname-font.png
PS.
svofski, кстати ускорил моргание. Спасибо за совет.
И еще отталкивание героя сделал когда в него урон приходит. Играть стало сложнее, но фидбек дает хорошой. Нужно потом все это безобразие тюнить ну и косяки править. Видео не прикладываю так как изменения небольшие.
Собственный шрифт это приятно. В остальном решил оставить свое мнение о нем при себе :)
Improver
07.04.2023, 12:34
сделал шрифт.Не моноширинный и с кернингом? Круто... Подозреваю, что надписи выводятся готовыми картинками, так? ;)
parallelno
07.04.2023, 17:36
svofski, не не. Не присибейничай. Для того и выкладываю чтобы услышать мнения.
Improver, ага. Решил заморочится и сделать не моноширинный. Текст не картинками, фонтом. Кернинговых пар конечно не будет. Но смещение буквы и спейсинг попиксельный.
Непривычное смешение маюскула и минускула немного надламывает моск. Типа как когда видишь болгарицу с k в кириллическом тексте. Даже если теkст по-русски, читать его без спотыkача kаk-то тяжело становится. Iт worкs тнe oтнer way around тoo. Но это так, вряд ли у тебя будет ну очень много текста. А если будет, ты его лучше отдельной книгой издай :)
parallelno
07.04.2023, 21:19
svofski, не думал о таких деталях. Спасибо, было интересно погуглить. Подумаю что можно сделать. Протестирую, если тяжело читать будет, то что-нибудь поправлю.
parallelno
09.04.2023, 20:02
Интегрировал шрифт в игру. Была небольшая бага не связанная со шрифтом, поэтому пришлось повозиться. :)
https://i.ibb.co/72SCVNX/font-in-the-game.jpg
CodeMaster
09.04.2023, 22:45
А бета-тестирование на http://sensi.org/scalar не предполагается?
parallelno
10.04.2023, 03:37
CodeMaster. Игры как таковой ещё нету, но тестирование всегда хорошо! Особенно приветствуется на реальном векторе.
Ром лежит тут и регулярно обновляется
https://github.com/parallelno/Vector06c/tree/main/Vector06c_Dev/_Projects/GameNoname/rom
CodeMaster
10.04.2023, 12:59
Ром лежит тут и регулярно обновляется
Реального Вектора у меня нет, эмулятор тоже не очень хочется ставить, а "пощупать" игру хотелось бы. Я конечно дождусь релиза и там-то точно зальют на http://sensi.org/scalar, но уже устал ждать ;-)
Онлайн эмулятор есть тут https://svofski.github.io/vector06js/ и всего-то делов затащить в него .rom, но что-то GameNoname такое делает, что в онлайн-версии не работает.
Хмм не иначе Баркарь?
Upd: точно, он. Баркаря добавил, игра загружаться стала, но все равно как-то нестабильно. В десктопном эмуляторе я таких глюков не вижу, все работает хорошо.
По поводу игры -- прикольно, уже много чего можно делать. Чтобы начать получать удовольствие остро не хватает хорошего управления. Сейчас пробел останавливает движение и это воспринимается странно. Еще вверх-вниз герой не поворачивается и мечом соответственно тоже вроде бы не бьет.
CodeMaster
10.04.2023, 22:05
Чтобы начать получать удовольствие остро не хватает хорошего управления.
Игра грузится в эмуль, но управления я вообще не нашёл - ни на одну клавишу не реагирует :-/
Игра грузится в эмуль, но управления я вообще не нашёл - ни на одну клавишу не реагирует :-/
Это фокус просто не пришел, надо кликнуть в сам эмулятор, можно правой кнопкой чтобы ничего другого он не сделал.
CodeMaster
10.04.2023, 23:33
Это фокус просто не пришел
Ну, как не пришёл? Я его вообще в полноэкранном открывал.
можно правой кнопкой чтобы ничего другого он не сделал.
После этого появляется контекстное меню браузера.
Нет, что-то эмуль не эмулит. Скачал из картотеки Тетрис 2 1995 - тоже нет управления, а кишинёвский Тетрис 1988-го работает норм.
parallelno
11.04.2023, 03:22
svofski, понял принял. Буду думать насчёт управления. Не хотелось тратится на спрайты перемещения вверх и вниз, поэтому сделал баундинг бокс атаки побольше чтобы цепляла то что внизу и вверху перса. Но видимо не решает проблему. Попробую что-нибудь придумать. Сейчас спрайты героя занимают примерно 32к. Придется ещё видимо столько же заюзать. Но попробую уменьшить количество кадров с 4 до 2х. Сейчас чел движется по пиксельно, пробовал делать как у монстров - через 2 пикселя, но на диагональных движениях перс дребезжать. Попробую ещё поразбираться. Спасибо за отзыв!
- - - Updated - - -
А бета-тестирование на http://sensi.org/scalar не предполагается?
Как только будет что-то играбельное, обязательно выложу везде где смогу:)
Сейчас спрайты героя занимают примерно 32к
Да, неслабо так. Я бы тогда сначала подумал об управлении -- может быть если бы он не спотыкался об каждый взмах собственной сабли, все это не воспринималось бы так странно.
parallelno
12.04.2023, 07:30
начал тестирование добаления новых уровней. Получился триллер - Гринч против Шоколадных Снеговиков! :D
https://youtu.be/16fZqEnePPw
Black Cat / Era CG
12.04.2023, 12:50
Это грязевики!
Шоколадный снеговик звучит как эвфемизм.
Вроде в теме не было ссылки на видео (https://www.youtube.com/watch?v=nt9MKNw4NBE) с реала
Все отлично, только музыка по мозгам бьёт. Сама музыка хорошая, если её слушать отдельно, но для игры (особенно долгой) это будет раздражать. На мой взгляд слух нужно что-то более спокойное, высокие звуки сделать потише если это возможно. ударные тоже либо сделать по короче либо темп уменьшить мелодии.
parallelno
18.04.2023, 21:05
Все отлично, только музыка по мозгам бьёт. Сама музыка хорошая, если её слушать отдельно, но для игры (особенно долгой) это будет раздражать. На мой взгляд слух нужно что-то более спокойное, высокие звуки сделать потише если это возможно. ударные тоже либо сделать по короче либо темп уменьшить мелодии.
Спасибо, понял принял. Музыка в игре заимствованая. Есть идея заказать у профессионалов этого дела что-то более подходящее.
parallelno
25.05.2023, 22:43
Очередное обновдение.
Добавлена поддержка тайловых картинок, верхний бар сделан с помощью этого. Добавлена графика фреймов и временная заставка сгенерированная AI. На мой вкус получилось красиво и настолько бессмысленно, что хочется оставить как есть. :) Жизни и FPS отображаются теперь в десятичнызх числах. Добавлен визуальный сиквенс "смерти" героя.
https://i.ibb.co/JvQGsQF/title.png (https://ibb.co/ZBmFMm1)
https://youtu.be/S63prXDL6SY
parallelno
01.06.2023, 21:23
Какие вы думаете настройки хорошо бы добавить в игру? Насколько важна поддержка джойстика? Необходимо ли давать возможность переопределять клавиш клавиатуры и джойстика?
Napoleon1
01.06.2023, 22:52
А в игре предполагается какой-нибудь сюжет? Объясняющий мотивацию персонажа - кто он и что тут вообще делает. Типа как в играх серии Диззи.
Было бы здОрово.
Совсем круто была бы возможность находить другое оружие м прочие модификаторы. Например что-то стреляющее, чтобы разнообразить геймплей. Ну и какие-нибудь уровневые боссы для той же цели.
parallelno
02.06.2023, 03:17
Napoleon1, да, в игре предполагается сюжет и будет рассказано об этом. Надеюсь и остальное получится впихнуть хотя бы чуть чуть. Память тает на глазах. :)
Black Cat / Era CG
02.06.2023, 07:04
Насколько важна поддержка джойстика? Необходимо ли давать возможность переопределять клавиш клавиатуры и джойстика?Конечно. Все надо по идее. Хотя я буду на эмуляторе играть, но все равно.
parallelno
02.06.2023, 10:09
Понял, спасибо. Нужно будет поразбиратся со джойстиками.
Очередное обновление. Улучшены система игровых реквестов, и инициализация уровней. Добавлена система диалогов и новый арт для них. Добавлено главное меню и кредитсы. Настройки, таблица рекордов еще в процессе.
https://youtu.be/Q7Lx18JVUHM
Хотя я буду на эмуляторе играть, но все равно.
В эмуляторах тоже работают джойстики. Джойстик надо.
Понял, спасибо. Нужно будет поразбиратся со джойстиками.
Конечно джойстики нужны. Вот соответствующая тема: https://zx-pk.ru/threads/29374-dzhojstiki-na-vektore-06ts.html
Много экранов будет в игре?
parallelno
02.06.2023, 18:31
Конечно джойстики нужны. Вот соответствующая тема: https://zx-pk.ru/threads/29374-dzhojstiki-na-vektore-06ts.html
Много экранов будет в игре?
О! Спасибище огромное!!! Буду разбираться.
По поводу экранов. Игры поддерживает до 64 экрана для каждого уровня. Планирую делать два уровня. Один полноценный, второй нет. Но сколько всего влезет в память я точно не знаю. По моим прикидкам 64 экрана для всех уровней суммарно должно влезть.
У меня предполагается шесть игровых клавишь. лево, право, вверх, вниз, удар, выбор. Я думал использовать стрелки для направлений, пробел для удара и клавишу 1 для выбора.
Еще хочу использовать какуюто популярную но случайно не нажимаемою клавишу для возможности возврата в меню. Как например на PC клавишах Esc. Как думаете какую выбрать для этих целей? Ее я не хочу давать пользователю переопределять.
Подскажите какие настройки управления вы бы хотели в игре? Какие типы джойстиков вы бы хотели в игре?
Хотели бы вы переопределять клавиши клавиатуры? Хочется ли вам переопределять клавиши для джойстиков?
Improver
02.06.2023, 19:16
Еще хочу использовать какуюто популярную но случайно не нажимаемою клавишу для возможности возврата в меню. Как например на PC клавишах Esc. Как думаете какую выбрать для этих целей? Ее я не хочу давать пользователю переопределять.Может БЛК-СБР? Во многих играх так можно было быстро выйти из игры в меню... :)
Может БЛК-СБР?
Лучше АР2, авторы эмуляторов дружно согласны, что это аналог Esc на современной клавиатуре.
Improver
02.06.2023, 21:32
Можно и АР2, но и F12, как аналог БЛК-СБР в эмуляторах, тоже нормально будет...
parallelno
03.06.2023, 00:44
Спасибо за советы!!!
parallelno
31.07.2023, 04:26
Эпично чинил баг с управлением. После того как починил то что перс не продолжал движение после остановки, заметил что он перестал атаковать если он идет по диаганали влево-вверх. Почитал доки, попытался починить, перепробовал множество вариантов в течение пары дней. Не помогло. Загрузил игру xzone из каталога. Там та же проблема. Взял клаву у сына, все заработало. Баг оказался в клавеатуре :))
parallelno
04.08.2023, 09:13
небольшой апдейт чтобы тема не загнивала :)
Закончил окно настроек. Правда джойстик не проверял. К сожалению те которые есть в наличие не работают в эмуляторе. Если кто может потестить, буду премного благодарен!
Одновил анимацию атаки мечем. Сделал больше как просили, увеличил боундинг бокс чтобы соответствовало спрайту. Увеличил скорость атаки в два раза. Должно быть поприятнее играть.
Исправил багу с тем что персонаж не продолжал движение после атаки.
Обновил аницию хотьбы героя.
Попытался привести палитры уровней в соотвествие с друг другом. Теперь персонаж и объекты на уровне0 не так вырвиглазно выглядят. :)
Обновил тайлы рамки для текста.
Обновил тайлы уровня 0. Сделал первый более нормальную комнату (экран).
Побегал, порабовался. Можно привлекать детей к наполнению уровней пока каникулы не закончились :)
https://youtu.be/eGV6ioB2Ta8
Napoleon1
06.08.2023, 10:02
Красиво, конечно. Но вот изменения цвета точек персонажа на разных фонах - нельзя это как-то пофиксить?
parallelno
06.08.2023, 12:11
Красиво, конечно. Но вот изменения цвета точек персонажа на разных фонах - нельзя это как-то пофиксить?
Спасибо! Можно, но это будет стоить чего-то. Либо количество цветов в игре уменьшать либо скорость отрисовки уменьшится.
parallelno
18.08.2023, 08:09
Очередное обновление. Добавлены внутриигровые диалоги. Ограничение пока один диалог на экран. Добавил новую комнату и немного отрихновал старую для тестирования диалогов. Попереименовывал метки в коде чтобы выглядело униформно. Поправил немного багов. Тексты диалогов тестовые, чтобы не спойлерить. :)
https://youtu.be/c6H2vsrgLd4
Очередное обновление. Добавлены внутриигровые диалоги. Ограничение пока один диалог на экран. Добавил новую комнату и немного отрихновал старую для тестирования диалогов.
...
А после закрытия окна диалогов, уже собранные сундуки снова появляются?
parallelno
18.08.2023, 10:01
KTSerg, те сундуки, они как бы не совсем сундуки. :) это ящики, хотя выглядят действительно похоже. В игре есть разрушаемые объекты. К ним же относятся бочки и возможно что-то ещё добавится. Такие объекты предполагаются в большом количестве на уровне. Они не влияют на прохождение и являются как бы филлерами окружения. Чтобы не хранить много данных о том какие конкретные разрушаемые объекты разрушены я сохраняю только процент разрушенных объектов на конкретном экране. После того как диалог закрылся или герой вернулся на тот же экран, то появляются разрушаемые объекты в соответствии с эти процентом. То есть иногда будут появляться разрушаемые объекты которые уже были разрушены. Это сделано для экономии памяти. К концу проекта если останется память и желание это исправить, то постараюсь доработать чтобы состояние каждого разрушаемого объекта сохранялось.
KTSerg, те сундуки, они как бы не совсем сундуки. :) это ящики, хотя выглядят действительно похоже. В игре есть разрушаемые объекты. К ним же относятся бочки и возможно что-то ещё добавится.
...
После того как диалог закрылся или герой вернулся на тот же экран, то появляются разрушаемые объекты в соответствии с эти процентом. То есть иногда будут появляться разрушаемые объекты которые уже были разрушены. Это сделано для экономии памяти. К концу проекта если останется память и желание это исправить, то постараюсь доработать чтобы состояние каждого разрушаемого объекта сохранялось.
:)
А я подумал это концепция подземелий из японских фэнтези ранобе/аниме ... ;)
Типа авантюрист прошел по подземелью, зачистил, через какое-то время сундуки/монстры снова возрождаются, что-бы и другим авантюристам было чем заняться ;)
parallelno
18.08.2023, 11:12
KTSerg, в игре будут и сундуки которые прям сундуки, то есть объекты с глобальным статусом. Их состояние сохраняется для каждого отдельного объекта, но их ограниченное количество.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot