Нет, работать не будет. Регистр A нельзя использовать.
Вид для печати
Добавил движение вверх/вниз. Вывод танка по OR.
drbars, Вот так правильнее
Надо клешинг именьшать :)
Щас буриме сотворим :)
А насколько важен для игры вывод спрайтов с максимально возможной скоростью? Неужто вывод 6 танчиков съест фрейм? Может, стоит уже дальше двигаться?
Собсна, тред про полезные процедуры, я внесу свои 5 копеек. Процедура опроса кнопок. По таблицам кнопок опрашивает клавиатуру и выдает байт напралений в kempston-формате
Я использую такие таблицы кодов (поддержка sinclair 1,2, qaopm+space, cursor keys)Код:
right: equ #01
left: equ #02
down: equ #04
up: equ #08
fire: equ #10
pool_keyborad_as_joystick: ; in: nothing
; out:
; d - pressed directions in kempston format
ld a,#fe ; check for CAPS SHIFT
in a,(#fe)
rra
ld hl,KeyMapping.key_table - 1 ; selection of appropriate keyboard table
jr c,.no_cs
ld hl,KeyMapping.cs_key_table - 1 ; hl - keyboard table (zero-limited)
.no_cs:
ld d,#00 ; clear key flag
ld c,#0fe ; low address of keyboard port
.loop:
inc hl ; next key
ld b,(hl) ; high byte of port address from table
inc b ; end of table check
dec b
ret z
inc hl ; going to key mask
in a,(c) ; reading half-row state
or (hl) ;
inc hl ; going to key flag
inc a ; a = half-row state or mask. if #ff - current key isn't pressed
ld a,d
jr z,.loop ; key isn't pressed
or (hl) ; result or key flag
ld d,a ; store it
jr .loop
Код:; key table format
; 1st byte - high byte of keyboard half-row address
; 2nd byte - inverted key mask (e.g. outer key - #fe, next key - #0fd etc)
; 3rd byte - direction bit
key_table:
db #0ef, #0fe, fire ;0
db #0ef, #0fd, up ;9
db #0ef, #0fb, down ;8
db #0ef, #0f7, right ;7
db #0ef, #0ef, left ;6
db #0f7, #0fe, left ;1
db #0f7, #0fd, right ;2
db #0f7, #0fb, down ;3
db #0f7, #0f7, up ;4
db #0f7, #0ef, fire ;5
db #0df, #0fe, right ;p
db #0df, #0fd, left ;o
db #0fb, #0fe, up ;q
db #0fd, #0fe, down ;a
db #07f, #0fb, fire ;m
db #07f, #0fe, fire ;space
db #000
cs_key_table:
db #0ef, #0fe, fire ;0
db #0ef, #0fb, right ;8
db #0ef, #0f7, up ;7
db #0ef, #0ef, down ;6
db #0f7, #0ef, left ;5
db #000
Добавил обработчик клавиатуры с переопределением клавиш :v2_dizzy_keyboard:
графику надо поправить
правильный размер танка - 3*3 3*4
Да там надо всё иначе делать вообще. Процедурка вывода танка должна уметь за край экрана рисовать, т.к. во время игрового процесса оттуда может выехать танк врага. А за (X,Y) координаты спрайта нужно взять правый нижний угол этого спрайта.
Если делать как я предложил, глобальными координатами и окном игровой проекции. Кстати динамично должно получится... Препятствия в лабиринте сделать можно тайлами 16х16px. Анализируем игровую проекцию и если было смещение быстро стеком рисуем сначала тайлы, потом танки... скролл проще по 16px сделать.
Тайлы которые рисуются в ирговой проекции стоят атрибутную карту, по ней проверяем препятствия.
В идеале, сырой движок должен выглядеть так: тестовая локация обрамлённая тайлами по периметру. Внутри хаотично катают танки... и мы перемещаемся среди них, игровое окно двигается (можно разными способами сделать).
Думаю есть шанс за фрейм уложиться даже со скроллом.
drbars, элементы 24х24 иначе танк некрасивый будет