Спасибо огромное. Добавил на сайт www.z80a.ru
Все прекрасно заработало. Теперь любой желающий может приобщиться к написанию игр на ассемблере:
Спасибо огромное. Добавил на сайт www.z80a.ru
Все прекрасно заработало. Теперь любой желающий может приобщиться к написанию игр на ассемблере:
Последний раз редактировалось zx-kit; 26.07.2013 в 20:53.
"L-256"
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Спрайты для начала есть. Теперь нужно придумать. как их лучше хранить и выводить. Скорее всего при движении по-горизонтали и вертикали будут разные процедуры. При движении по-горизонтали возможна ситуация, когда танк выезжает из-за границы экрана. То есть нужно изображать не весь спрайт, а 1 или 2 столбика. Значит нужно в процедуре вывода спрайта предусмотреть печать тех столбиков, которые входят в диапазон координат X окна игрового поля. Размер игрового поля 24 х 24 клетки, т.е. 192 х 192 точки.
Спрайты симметричные относительно горизонатальной оси, значит можно хранить только половину спрайта для экономии памяти. По 8 байтов в столбике, 3 столбика. В столбике копируем 8 байтов из спрайта, затем повторяем их в обратном порядке. Потом переходим к печати следующего столбика. При печати каждого столбика проверять, входит ли он в область экрана. Если нет, то переходим к следующему столбику спрайта.
Так как танки движутся с максимальной скоростью 1 точка за кадр, нужно хранить 8 фаз движения на каждое направление. Это займет определенное место. На каждый типоразмер при движении влево потребуется 8 полуспрайтов по 3 столбика по 8 байтов, т.е. 192 байта. Для движения вправо еще 192 байта. Для движения вверх и вниз два спрайта по 3 столбика по 16 байтов. Таким образом на один типоразмер танков требуется 192+192+48+48=480 байтов.
Если будет три типоразмера танков и один FT, то для изображения их движений потребуется около 2Кбайт спрайтов. Это без учета цвета.
Однако при выводе спрайтов столбиками по 16 байтов потребует 2 раза переходить границу клетки на каждый столбик, а это около 37 тактов. Да еще проверять, входит ли этот столбик в границы экрана. Это неоправданно замедлит вывод спрайтов, которые полностью входят на экран. Наверно лучше проверять, входит ли спрайт полностью. Если да, выводить спрайт более быстрым способом - Сначала 3 байта 1 строки, потом 3 байта 2 строки и так 16 раз. Но все равно будут 2 перехода границ клеток, но это на весь спрайт, а не каждый столбик. Быстродействие тоже важно.
Для частично отображаемых спрайтов на границах экрана потребуется отдельная процедура с хитрым алгоритмом вывода или индексной адресацией в ОЗУ спрайта, так как при отображении спрайта стольбиками байты спрайта будут браться не подряд. Или хранить спрайты как предлагал Alone Coder. При этом байты в столбике одного спрайта располагаются с шагом 256 байтов. Для перехода к следующему байту в столбике достаточно будет увеличить старший байт адреса. Т.о. данный способ хранения спрайтов подходит для более быстрого вывода спрайта строчками, а на границах экрана его можно использовать и для вывода спрайта столбиками.
Хорошо. С хранением спрайтов разобрался. Теперь нужно написать процедуру достаточно быстрого вывода спрайта, используя процедуру оределения адреса на экране из книжки "Прикладная графика" от Инфоркома или аналогичную. Спрайты будут выводиться зигзагами. Сначала вправо, потом влево, по возможности использовать переход к следующему адресу байта на экране однобайтовыми команадами. Только при переходе через горизонтальные границы клеток потребуется более сложный способ определения следующего адреса на экране. Но он уже придуман. Занимает времени 37 тактов:
Код:4 LD A,L ; увеличиваем номера ряда в сегменте. 7 ADD A, 0010 0000 ; если был ряд номер 7 - установится флаг C (нужен переход в следующий сектор экрана) 4 LD L,A 4 LD A,H 7 ADC A,0 ; переходим в следующий сектор, если необходимо 7 AND 1111 1000 ; обнуляем номер строки в клетке 4 LD H,A
Последний раз редактировалось zx-kit; 28.07.2013 в 14:53.
"L-256"
Хранение спрайтов в памяти. Описание для библиотеки. Удобный способ подсказал alone (http://www.zx.pk.ru/showpost.php?p=611409&postcount=82).
Идея такая. 256 байтов в области спрайтов выделяются для хранения первых строк нескольких спрайтов. Следующие 256 байтов выделяются для хранения вторых строк нескольких спрайтов и т.д. на всю высоту спрайта.
При этом байты в столбике одного спрайта располагаются с шагом 256 байтов. Для перехода к следующему байту в столбике (по-вертикали) достаточно будет увеличить старший байт адреса в области спрайтов.
Для перехода к следующему байту спрайта по-горизонтали достаточно увеличить младший байт адреса о области спрайтов.
Таким образом, данный способ хранения спрайтов подходит для вывода спрайта как строками, так и столбцами.
Адрес начала нужного спрайта можно определить, прибавив к адресу начала области спрайтов номер спрайта (от 0 до максимально влезшего) столько раз, сколько байтов в строке каждого спрайта. Это подходит для случая, когда все спрайты одинакового размера. Также можно составить таблицу для определения по номеру спрайта его адреса.
Последний раз редактировалось zx-kit; 28.07.2013 в 15:56.
"L-256"
zst, не самый удобный способ кстати
по скорости не самый быстрый и ограничение на высоту спрайта
С уважением,
Jerri / Red Triangle.
А какие еще бывают удобные и быстрые способы хранения спрайтов ? Про ограничение в высоту - не вижу ограничений. Объясните, в чем ограничение?
У меня будут полуспрайты высотой 8 точек. 8 удобно тем, что спрайты можно нарисовать прямо на экране. И верхний сегмент картинки (2Кб) можно скопировать без преобразований в область спрайтов. Для других высот спрайтов картинку придется преобразовывать. Но это не ограничение при хранении спрайтов.
На мой взгляд, недостатков у такого способа хранения нет.
Последний раз редактировалось zx-kit; 28.07.2013 в 23:27.
"L-256"
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)