ivagor, а сколько тактов всего во фрейме?
Вид для печати
ivagor, а сколько тактов всего во фрейме?
312*192=59904 такта/фрейм
Если ширма -- это просто черная рамка, то достаточно перерисовать столько строк, на сколько прокрутка. Правда в этом случае целесообразность ширмы под вопросом, зачем она? Но если там будет HUD с жизнями, уровнем, счетом итд, это будет не просто стереть две строки. Весь HUD придется перерисовывать целиком каждый раз.
Есть ещё одна мысля по поводу ширмы...
Левый верхний угол мельтешит, из-за того, что не хватает времени стереть ширму и снова нарисовать до подхода луча к верхнему левому углу рабочей области экрана...
А если сначала выставить ширму на новом месте, а потом удалять старую ширму... то мельтешить не должно. ;)
Без ширмы можно "гладко" без видимого заворота при скролле вывести только 1 или 2 строки (смотря как выводить и сколько цветов 8 или 16). С ширмой намного удобнее и проще, но, конечно, цветов в 2 раза меньше.
Тоже так думаю, поэтому и предлагаю оптимизировать сдвиг ширмы. В принципе промежуток времени доступный для ширмы можно увеличить, если ориентироваться не на прерывание, а на таймер синхронизированный с прерываниями (в духе эксолона и некоторых других программ). Но скорее всего без таймера можно обойтись если максимально ускорить сдвиг ширмы.
Зачем выводить объекты которые не двигаются каждый фрэйм?
Если у вас фрэйм 50Гц... можно выводить чет-нечет- и не каких морганий не будет.
- - - Добавлено - - -
Может я не правильно выразился... у вас есть список отображения (связанный с обратным ходом луча), не включайте туда даже активные объекты если не было приращений.
Если по таймеру.. то можно разделить этот список на чет и не чет... в два раза меньше выводить.. на глаз не заметно.
Вверху и внизу экрана есть по 8 строк, которые появились из-за выбора размера спрайта 24х24 в итоге экран 240х240.
Ширма нужна для скрытия внизу рисования частей спрайтов при вертикальном скроллинге (они мельтешат).
Вверху ширма просто закрывает торчащую треть спрайта, т.к. в этой трети не отображается анимация движущихся элементов.
Сдвиг экрана при вертикальном скроллинге происходит так:
внизу экрана рисуется строка 8 точек и происходит скроллинг на 8 точек
итак три раза т.е. 8 х 3 =24 т.е. высота одного блока уровня
На данный момент задумка такая:
Жизни и уровни будут показываться только на статичном экране при потере жизни и при прохождении уровня.
Счёта в игре не будет, т.к. цель игры собрать все монетки, а вот сколько осталось собрать монеток
будет отражаться во время игры но пока точно не знаю как и где.
Сейчас код ширмы такой:
Скрытый текст
; это в программе обработки прерываний
;=================== ширма вверху
call shirm0 ; стираем ширму
lhld ashirm
lda scroll
adi 1
mov l,a
shld ashirm
call shirm1 ; рисуем ширму
call shirmbon ; дополнительно ещё раз рисуем первые семь столбиков чтобы убрать глюки слева вверху
;======================================= ширма снизу
call shirm0wwt ; стираем ширму
lhld ashirm2 ;
lda scroll
adi 9
mov l,a
shld ashirm2 ;
call shirm1wwt ; рисуем ширму
;=======================================
;================ Это подпрограммы
; стираем ширму
shirm0: lxi h,0
shld shirmx+1
jmp shirm
;
shirm1: lxi h,0FFFFh
shld shirmx+1
; jmp shirm
;
shirm: lxi h,0
dad sp ; HL=HL+SP
shld s_sp ; сохраняем значение стека
;
lhld ashirm ; в HL помещаем адрес куда выводить на экран
lxi d,0100h ; 256
shirmx: lxi b,0
mvi a,31
;
shirmc: sphl ; перенос из HL в SP 8
push b ; запись в экран 16
push b
push b
push b
dad d ; HL=HL+DE(256) переход на следующий столбик 12
dcr a ; 8
jnz shirmc ; 12
lhld s_sp ; возвращаем значение стека
sphl
ret
;===================================
shirm0wwt: lxi h,0
shld shirmxwwt+1
jmp shirmwwt
;
shirm1wwt: lxi h,0FFFFh
shld shirmxwwt+1
;jmp shirmwwt
;
shirmwwt: lxi h,0
dad sp
shld s_sp
;
lhld ashirm2
lxi d,0100h
shirmxwwt: lxi b,0
mvi a,31 ;32
;
shirmcwwt: sphl
push b
push b
push b
push b
dad d
dcr a
jnz shirmcwwt
;
lhld s_sp
sphl
;
ret
;======================================================
shirmbon:
lxi h,0
dad sp ; HL=HL+SP
shld s_sp ; сохраняем значение стека
;
lhld ashirm ; в HL помещаем адрес куда выводить на экран
lxi d,0100h ; 256
shirmxbon: lxi b,0ffffh
mvi a,7
;
shirmcbon: sphl ; перенос из HL в SP
push b ; запись в экран
push b
push b
push b
dad d ; HL=HL+DE(256) переход на следующий столбик
dcr a
jnz shirmcbon
lhld s_sp ; возвращаем значение стека
sphl
ret
[свернуть]
- - - Добавлено - - -
ivagor, никак не пойму как реализовать эту "змейку", можно небольшой пример кода....
Скрытый текст
;вывод блока 8x2
;первые 8 точек в блоке 8x2
lxi b,8192
ldax d\ mov m,a\ inx d\ dad b
ldax d\ mov m,a\ inx d\ dad b
ldax d\ mov m,a\ inx d\ dcr l
;вторые 8 точек в блоке 8x2
lxi b,-8192
ldax d\ mov m,a\ inx d\ dad b
ldax d\ mov m,a\ inx d\ dad b
ldax d\ mov m,a\ inx d\ dcr l[свернуть]
При необходимости можно немножко разменивать "одновременность" на скорость за счет (как уже писал) вывода нескольких байт в одной плоскости перед ее сменой. Это очевидно связано с тем, что inr/dcr быстрее dad.
"Ё,,,,,,,,,,"...или мы не про компьютер говорим? Пусть меня все бьют палками....бейте дальше.. я помочь хотел..простите.