Как написать игру для ZX Spectrum на ассемблере


         

«Волна»


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

Для осуществления этого эффекта прежде всего потребуется написать две подпрограммы вертикального скроллинга отдельных знакомест экрана: одну для перемещения символа вверх, а другую - для движения изображения вниз. Принцип такого рода скроллингов исключительно прост. Например, для сдвига изображения на один пиксель вверх нужно байт из второго ряда пикселей перенести на место байта первого ряда, затем байт из третьего ряда поместить во второй и так далее, а самый нижний ряд пикселей заполнить нулями. Правда, при этом потеряется содержимое самого верхнего байта, но для текстовой строки это не особенно важно, так как обычно буквы сверху и снизу имеют по пустому ряду точек (ведь между строками текста должен быть какой-то зазор). Скроллинг букв вниз аналогичен, только перемещать байты знакоместа нужно, начиная с нижнего края.

Подпрограмма вертикального скроллинга знакоместа может выглядеть так:

UP CP 32 ;проверка позиции перемещаемого знакоместа RET NC ;выход, если больше или равна 32 LD HL,(AD_LIN) ;получаем адрес экрана начала строки PUSH AF OR L LD L,A PUSH HL LD D,H ;копируем адрес в DE LD E,L LD B,7 ;повторяем 7 раз UP1 INC H ;в HL - адрес байта следующего ряда LD A,(HL) ;переносим из (HL) в (DE) LD (DE),A INC D ;переходим к следующему ряду DJNZ UP1 LD (HL),0 ;обнуляем самый нижний ряд POP HL POP AF RET

Перед обращением к этой (а также и к следующей) подпрограмме в аккумулятор нужно занести горизонтальную позицию знакоместа в строке. Если заданная позиция выходит за пределы экрана, то есть не попадает в диапазон от 0 до 31, подпрограмма не должна выполняться. Для этого в самом ее начале проверяется обозначенное условие и в случае его невыполнения происходит условный выход из подпрограммы (команда RET NC). Как видите, условными могут быть не только переходы. Сразу заметим, что по условию можно также вызывать процедуры, используя команды типа



Содержание  Назад  Вперед