
Сообщение от
Andrew771
спасибо. Завтра буду смотреть.
Насчет еще более быстрого вывода сцены думал.
Можно подумать над тем, чтобы хранить в спрайтах не координаты знакоместа, а сразу адрес вывода на экране первого байта знакоместа. Тогда не нужно каждый раз его высчитывать. Правда, в этих же двух байтах я храню параметр - краевое это знакоместо спрайта или нет, и если краевое, то какое - правое или левое. Можно как-то это продумать, чтобы вместе с адресом хранить (можно не адрес, а хотя бы смещение от какого-то адреса, например, начала экрана, тогда два бита будут по-прежнему свободны для краевых параметров).
Еще думал, хранить "слои" экрана - у меня 7 уровней вглубь, следовательно, 7 слоев для перспективы 90 градусов и 7 слоев для перспективы 45 градусов. Причем не весь экран, а только четверть, т.к. остальные 3/4 можно получать отзеркаливанием. В слое хранятся для каждого знакоместа байты изображения каждого элемента (15 элементов - стены, колонны, бассейны, трупы, фазы врагов и т.д.). Т.е. спрайты вообще не нужны, а всё хранится в этих слоях, которые быстро можно вывести. Но всё это занимает в памяти очень много места, пока не придумал, как сократить размер.
есть еще вариант отрисовки
1 как сделано у тебя
есть теневой экран 6912 байт
сначала ты делаешь расчеты, потом рисуешь, потом копируешь на экран - это долго
2 как можно сделать
сделать таблицу 3072 байта
сделать таблицу 768 байт под атрибуты
где 2 байта обработчик знакоместа
вторые 2 байта - адрес символа
также у тебя на экране имеется довольно много пустых мест
и рисовать в них - довольно расточительно по тактам
Код:
итак обработчик
обработка пустого места
empty_char
pop af //снимаем ненужный адрес
exx
ldi //красим экран - естественно в этом месте атрибуты должны быть #00
exx
ret //переходим на следующий элемент
draw_char //обычная отрисовка изображения
pop hl //снимаем адрес чара
ld (draw_c0),sp
ld sp,hl
ld l,e
ld a,d
and #f8
ld h,a
dup 3
pop bc
ld (hl),c
inc h
ld (hl),b
inc h
edup
pop bc
ld (hl),c
inc h
ld (hl),b
ex de,hl
exx
ldi
exx
ld sp,$
draw_c0 equ $-2
inc e
ret nz
ld a,d
add a,8
ld d,a
ret
draw_charfv //отрисовка перевернутого по вертикали изображения
pop hl //снимаем адрес чара
ld (draw_c1),sp
ld sp,hl
ld l,e
ld a,d
or #07
ld h,a
dup 3
pop bc
ld (hl),c
dec h
ld (hl),b
dec h
edup
pop bc
ld (hl),c
dec h
ld (hl),b
ex de,hl
exx
ldi
exx
ld sp,$
draw_c1 equ $-2
inc e
ret nz
ld a,d
add a,8
ld d,a
ret
как заполнять эту таблицу?
для начала распушаем
нулевой адрес и обработчик нулевых чаров
в область атрибутов заливаем #00
далее при прорисовке добавляем в область атрибутов цвет тайла
а в область обработчика адрес рисовалки и адрес тайла
т.е получается чтото вроде
dw empty_char,0,empty_char,0,empty_char,0,empty_char, 0
dw draw_char,#8000,draw_char,#8008,draw_char,#8010,dr aw_char,#8018
и в файле атрибутов
db 0,0,0,0,1,1,1,1
как то так 
основная тема понятна?
дальше рассказывать как делать прорисовку с маской?