А как же: http://vtrdos.ru/system.php#s28
или нужен на пц?
Вид для печати
А как же: http://vtrdos.ru/system.php#s28
или нужен на пц?
deleted
drbars, это не моя процедура :-) Это из книжки "Как написать игру на ассемблере".
По поводу хранения спрайта строками. Фактически переход к следующему байту строки это INC L (INC E), а к следующему байту столбца - INC H (INC D). Равнозначно. От постолбцового вывода выигрыш на спрайтах маленького размера, < 8. На практике таких спрайтов большинство. И наоборот - для вывода больших спрайтов-пейзажей обычно не требуется особая скорость (если требуется - применяются совсем другие методы). Потому что по столбцам во внутреннем цикле гарантированно выводится 8 байт, а по строкам меньше. А LDI использовать нельзя - у нас логические операции.
Oleg N. Cher, следующий этап — сохранение фона перед выводом спрайта, и при последующем выводе восстановление и новое сохранение. В случае использования логических наложений, особенно с маской это обязательно.
Знаю, drbars. Но тут для меня начинается высшая математика и что-то непостижимое. Есть люди, которые самыми неприхотливыми средствами делают настоящие чудеса, я могу только восторгаться или мечтать повторить. С масочными спрайтами работал только один раз, это был вывод пушечного ядра в игре SeaFight, и делался он точками, притом процедурой в ПЗУ.
Oleg N. Cher, вот пример... вывод спрайта с маской без таблиц движения. Делал для игры, но потом переписал под табличный способ.
http://zx-pk.ru/threads/23544-vyvod-sprajta-po-x-y.html
:v2_thumb:
- - - Добавлено - - -
А эффективнее по памяти или по скорости? По скорости таблица вне конкуренции - 32 такта на байт.
- - - Добавлено - - -
Чем-то помочь, рассказать?
- - - Добавлено - - -
Для этого в библиотеке надо поддержать непрямоугольные спрайты, иначе для фигуристых спрайтов будет работать очень медленно и жрать пямять. Вот тут как бы и начинается специфика Спектрума: в одних играх спрайты прямоугольные и такие извращения будут тормозить, в других нудна поддержка непрямоугольных спрайтов, в результате общие библиотеки неэффективны, каждый пишет своё с учетом 1000 и одного нюанса.
Alex Rider, я обязательно воспользуюсь любезным предложением помочь с матчастью: туда дальше вынесу на общую разработку пару своих идей игр, просто не надеюсь, что кто-то захочет присоединиться, из-за чего интерес не очень сильный. А так - художник нужен, музыкант, возможно, хард-кодер ассемблерщик. Но двигаться конечно планирую в своём контексте, т.е. писать на Обероне.
То, что есть специфика, и её надо учитывать - никакой библиотекой не поправишь. И так в любом деле. В книге "Как написать игру на ассемблере" есть вывод спрайтов произвольной конфигурации. И процедура там приводится очень простая. Но она так проста лишь только потому, что там координаты для вывода спрайта знакоместа вшиты в сам спрайт, в каждое его знакоместо. Если там хранить смещения и прибавлять к ним при выводе реальные координаты, пересчитывая их в адреса экрана и атрибутов, угадайте что будет? Правильно - будет довольно тормознуто.
Я просто не собираюсь писать игры со всякими фигурными спрайтами, масками и прочим, отсюда и такой скромный круг задач, которые я перед собой ставлю. Выше головы не прыгнешь - пусть игры делают те, у кого талант. Я со своей стороны буду совершенствовать ZXDev.
Про зеркалирование: конечно интереснее оптимизировать по скорости, но если табличка будет 256 байт, а у меня в игре всего один спрайт, который нужно зеркалить, и он шириной 2 знакоместа, то тут начинается стрельба по воробьям. :) В целом же было бы интересно сделать максимально эффективно по скорости, разумно по памяти, но без таблицы.
ZX_NOVOSIB, как видим, желающих клонировать Буратино не наблюдается. Никому не интересно. :)
P.S. Кстати, я адаптировал к ZXDev пару процедур атрибутного скроллинга из Supercode. То есть, Supercode намечен. Присоединяйтесь.
http://i.piccy_.info/i9/b6d3ca534360.../Supercode.png
deleted
Так может дать возможность выбора разработчику - скорость или размер?
- - - Добавлено - - -
Если нужно развернуть не один байт, а изображение спрайта в памяти,
то обработать попарно можно так (для простоты только внутренний цикл):
Код:col_mirror_loop:
dec hl
ld a, (de)
ld c, (hl)
; ------------------
; byte mirroring
; ------------------
DUP 8
rla
rr c
EDUP
; ------------------
rla
ld (de), a
ld (hl), c
inc de
djnz col_mirror_loop