Мониторинг обменных курсов валют
18c0693f

Перемещение спрайта скроллингом окна



Рисунок 7.2. Перемещение спрайта скроллингом окна

Сразу же виден и недостаток этого способа, который состоит в том, что спрайт перемещается по экрану вместе с фоном, поскольку скроллинг захватывает все изображение в окне. Отсюда ясно, что применять такой метод можно лишь в тех случаях, когда фон как таковой отсутствует или, по крайней мере, мелкие детали не попадают в сдвигаемое окно. В качестве иллюстрации к сказанному приведем небольшую программку, которая плавно перемещает по экрану симпатичный паровозик, позаимствованный нами из спрайт-файла SPRITE2B пакета Laser Basic (Рисунок  7.2).

ORG 60000 ENT $ XOR A CALL 8859 LD A,5 LD (23693),A CALL 3435 LD A,2 CALL 5633 ; Начальная установка регистров процедуры PTBL LD B,10 LD C,0 LD A,SPRPUT LD HL,PAROW ; Вывод на экран «паровозика» CALL PTBL ; Задание параметров окна LD HL,#A00 ;COL = 0, ROW = 10 LD (COL),HL LD HL,#320 ;LEN = 32, HGT = 3 LD (LEN),HL LD B,0 ;задание длины пробега «паровозика» ; (0 = 256 пикселей) MOVE PUSH BC CALL SCR_RT ;обращение к процедуре скроллинга вправо POP BC DJNZ MOVE RET ; Подпрограмма скроллинга окна вправо

; Подпрограмма вывода спрайта

; Переменные к процедуре скроллинга COL DEFB 0 ROW DEFB 0 LEN DEFB 0 HGT DEFB 0 ; Заголовок данных для «паровозика» PAROW DEFB 14,0,0,5,0,1,5,0,2,5,0,3,5 DEFB 1,0,5,1,1,5,1,2,5,1,3,5,1,4,5 DEFB 2,0,5,2,1,5,2,2,5,2,3,5,2,4,5 ; Данные DEFB 0,0,0,3,15,63,64,95 DEFB 0,0,0,255,255,254,1,255 DEFB 0,0,0,192,160,70,201,73 DEFB 0,0,0,0,30,33,26,18 DEFB 24,248,152,253,133,181,181,181 DEFB 33,39,62,255,0,127,127,127 DEFB 246,73,146,255,0,254,252,251 DEFB 230,83,134,189,133,133,173,214 DEFB 0,192,96,160,160,160,160,96 DEFB 181,133,253,0,255,38,20,15 DEFB 127,0,255,0,255,83,138,7 DEFB 244,11,247,0,255,41,69,131 DEFB 35,216,228,3,249,148,35,192 DEFB 192,32,216,176,96,192,128,0

Второй способ не многим сложнее первого. Он основан на многократном выводе спрайта на экран. Если на каждом шаге изменять на единицу одну из координат, то спрайт будет двигаться параллельно соответствующей границе экрана, если же менять сразу обе, то он начнет перемещаться по диагонали. Основное требование к спрайту - он должен иметь по краям пустое пространство шириной в одно знакоместо, иначе изображение, помещенное на экран на предыдущем шаге, не будет полностью затираться следующим выводимым спрайтом и по экрану потянется не предусмотренный программистом след. Таким образом, если пустые места сделаны вокруг всего спрайта, то его можно спокойно передвигать в любом направлении, если же заранее известно, что он будет перемещаться вправо и никуда больше (как в примере ниже), то достаточно оставить пустую полоску шириной в одно знакоместо только слева.


К сожалению, этот способ перемещения спрайта тоже не лишен недостатка, видного невооруженным глазом: вместе с изображением, действительно подлежащим удалению, спрайт как ластик сотрет вообще весь фон позади себя. Справиться с этим можно точно так же, как мы рекомендовали выше, - выводить спрайт на сплошной фон, лишенный сложного пейзажа, что приемлемо для ограниченного числа игровых сюжетов. В качестве иллюстрации приведем программу, которая передвигает по экрану слева направо маленького динозавра, перебравшегося к нам из игры LITTLE PUFF:

ORG 60000 ENT $ XOR A CALL 8859 LD A,7 LD (23693),A CALL 3435 LD A,2 CALL 5633 ; Основная часть программы LD C,-4 MOVE LD B,10 LD A,SPRPUT LD HL,DIN PUSH BC CALL PTBL LD BC,10 CALL 7997 POP BC INC C LD A,C CP 32 JP M,MOVE ;если координата меньше 32 (с учетом знака) RET ; Подпрограмма вывода спрайта

; Заголовок данных для «динозавра» DIN DEFB 16,0,0,4,0,1,4,0,2,4,0,3,4 DEFB 1,0,4,1,1,4,1,2,4,1,3,4 DEFB 2,0,4,2,1,4,2,2,4,2,3,4 DEFB 3,0,4,3,1,4,3,2,4,3,3,4 ; Данные: DEFB 0,0,0,0,0,0,0,0 DEFB 0,0,0,0,0,0,0,0 DEFB 0,0,0,0,0,70,117,42 DEFB 0,0,0,0,0,64,160,64 DEFB 0,0,0,0,0,0,0,0 DEFB 0,0,2,6,11,21,46,31 DEFB 78,72,110,52,123,111,96,31 DEFB 192,128,219,173,71,254,127,0 DEFB 0,0,0,0,0,0,0,0 DEFB 53,100,85,181,20,4,0,0 DEFB 205,188,63,119,103,231,55,185 DEFB 248,0,0,192,224,240,208,224 DEFB 0,0,0,0,0,0,0,0 DEFB 0,0,0,0,0,0,1,0 DEFB 28,57,67,167,156,191,157,0 DEFB 24,120,184,48,38,140,96,0 DEFB 0,0,0,0,0,0,0,0

Программа содержит всего один цикл и настолько проста, что в дополнительных комментариях не нуждается.

Третий способ использует вывод спрайтов на экран по принципу XOR, который заложен в процедуре PTBL (как, впрочем, и другие). Применение принципа XOR для объединения изображений позволяет легко справиться с проблемой восстановления фона при перемещении спрайтов. Перечислим вначале все операции, которые должна выполнить программа: