С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Если ширма -- это просто черная рамка, то достаточно перерисовать столько строк, на сколько прокрутка. Правда в этом случае целесообразность ширмы под вопросом, зачем она? Но если там будет HUD с жизнями, уровнем, счетом итд, это будет не просто стереть две строки. Весь HUD придется перерисовывать целиком каждый раз.
Больше игр нет
metamorpho(22.07.2020)
Вверху и внизу экрана есть по 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, никак не пойму как реализовать эту "змейку", можно небольшой пример кода....
Последний раз редактировалось metamorpho; 22.07.2020 в 15:29.
Скрытый текст
;вывод блока 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.
metamorpho(22.07.2020)
Зачем выводить объекты которые не двигаются каждый фрэйм?
Если у вас фрэйм 50Гц... можно выводить чет-нечет- и не каких морганий не будет.
- - - Добавлено - - -
Может я не правильно выразился... у вас есть список отображения (связанный с обратным ходом луча), не включайте туда даже активные объекты если не было приращений.
Если по таймеру.. то можно разделить этот список на чет и не чет... в два раза меньше выводить.. на глаз не заметно.
БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
metamorpho(22.07.2020)
"Ё,,,,,,,,,,"...или мы не про компьютер говорим? Пусть меня все бьют палками....бейте дальше.. я помочь хотел..простите.
Последний раз редактировалось S_V_B; 23.07.2020 в 08:46.
БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
metamorpho(22.07.2020)
Исправил появление главного героя "из стены".
Исправил глюк с палитрой, который был в предыдущей версии.
Переписал рисование ширмы с учётом некоторых предложенных здесь идей.
Ширма рисуется быстрее и вроде без глюков.
Ниже (rom) для тестов
- - - Добавлено - - -
Вот новый код рисования ширмы в программе обработки прерываний:
Скрытый текст
lda kub_napr ; узнаём направление главного героя 3-вверх 4-вниз
;если вертикального движения нет то ширму не рисуем и не стираем
cpi 3 ; движение вверх скрол вниз
jnz ruft12
;=======затриаем_сверху=4 строки + снизу рисуем 8 строк
; стираем ширму сверху
lxi b,0
lxi h,0
dad sp ; HL=HL+SP
shld s_sp ; сохраняем значение стека
lda scroll
sui 7
mov l,a
mvi h,0e0h
mvi a,32
shirmczz: sphl ; перенос из HL в SP 8
push b ; запись в экран 16
push b ; запись в экран 16
inr h
dcr a ; 8
jnz shirmczz ; 12
; рисуем снизу
lxi b,0FFFFh
lda scroll
adi 9
mov l,a
mvi h,0e1h
mvi a,31
shirmc2r: sphl ; перенос из HL в SP 8
push b ; запись в экран 16
push b ; запись в экран 16
push b ; запись в экран 16
push b ; запись в экран 16
inr h
dcr a ; 8
jnz shirmc2r ; 12
lhld s_sp ; возвращаем значение стека
sphl
jmp ruft14
ruft12:
cpi 4 ; движение вниз скрол вверх затриаем снизу строку 08 + сверху рисуем 8 строк
jnz ruft14 ;иначе ничего не делаем
;=======затриаем_сверху=4 строки + снизу рисуем 8 строк
; стираем ширму снизу
lxi b,0
lxi h,0
dad sp ; HL=HL+SP
shld s_sp ; сохраняем значение стека
lda scroll
adi 13
mov l,a
mvi h,0e0h
mvi a,32
shirmc44: sphl ; перенос из HL в SP 8
push b ; запись в экран 16
push b ; запись в экран 16
inr h
dcr a ; 8
jnz shirmc44 ; 12
; рисуем сверху
lxi b,0FFFFh
lda scroll
adi 1
mov l,a
mvi h,0e1h
mvi a,31
shirmc2r44: sphl ; перенос из HL в SP 8
push b ; запись в экран 16
push b ; запись в экран 16
push b ; запись в экран 16
push b ; запись в экран 16
inr h
dcr a ; 8
jnz shirmc2r44 ; 12
lhld s_sp ; возвращаем значение стека
sphl
;===================================
ruft14:
[свернуть]
Последний раз редактировалось metamorpho; 23.07.2020 в 11:36.
metamorpho,почему не используешь модифицирующийся код?
Код:shld s_sp ; сохраняем значение стека ld sp,$ s_sp equ-2
С уважением,
Jerri / Red Triangle.
metamorpho(22.07.2020)
Да это ассемблер Z80
это команда инициализации стека
для i80
LXI sp,$
и ставишь метку переменный на данные вносимые в SP
грубо говоря
#8003 lxi hl,#0000
#8006 lhld #800a
#8009 lxi sp,#0000
просто я не очень люблю систему команд i80 - она не очень наглядная.
грубо говоря переменная s_sp используется в одном месте и хранит определенное значение - стек при отрисовке ширмы
экономия 5 байтов
Последний раз редактировалось jerri; 22.07.2020 в 21:19.
С уважением,
Jerri / Red Triangle.
metamorpho(22.07.2020)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)