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


         

что при таком способе задания


BUFFER DEFS N_SYM*11+1

Добавим, что при таком способе задания буфера размер его может быть больше рассчитанного, но ни в коем случае не меньше, иначе сохраняемые коды уничтожат часть программы! Кроме этого, надо сказать, что DEFS имеет смысл использовать только для сохранения небольших участков экрана, а при работе с большими изображениями (или когда одновременно сохраняются много окон) лучше выделить для этих целей некоторый участок памяти вне программы, чтобы сократить размер исполняемого модуля.

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

Перечислим основные этапы реализации описываемого способа передвижения спрайта:


  • процедурой GTBL забираем в буфер часть экранного изображения в форме прямоугольного окна;


  • в это же место процедурой PTBL (в режиме SPRPUT) выводим спрайт;


  • делаем небольшую задержку;


  • ранее сохраненное окно с изображением части экрана переносим процедурой PTBL (в режиме SPRPUT) обратно на экран и в то же самое место;


  • изменяем координаты спрайта (либо одну из них, как в примере) и повторяем перечисленные выше действия.


  • При составлении программы игры необходимо следить за тем, чтобы спрайт не выходил за пределы экрана, по крайней мере влево и вверх, так как этого не допускает процедура GTBL.

    Эффективность способа продемонстрируем с помощью приведенной ниже программы, которая передвигает по экрану человечка из игры EXPRESS. Он пробегает мимо кустов, закрывая их собой по очереди, однако за его спиной кусты вновь появляются. Добежав до лежащего на дороге камня, человечек спотыкается и падает, на этом действие микромультфильма заканчивается (но вы можете попытаться его продолжить).

    ORG 60000 ENT $ N_SYM EQU 6 ;задаем количество знакомест окна LD A,6 LD (23693),A XOR A CALL 8859 CALL 3435 LD A,2 CALL 5633 ; Начало программы CALL GRUNT ;рисуем пейзаж LD C,0 ;начальное значение координаты X для ; «бегущего человечка» ; Перенос окна с частью изображения в буфер LOOP LD B,10 ;COL = C, ROW = 10 LD (COL),BC LD HL,#302 ;LEN = 2, HGT = 3 LD (LEN),HL LD IX,BUFFER ;в IX заносим начальный адрес буфера LD A,N_SYM ;в A заносим площадь окна PUSH BC CALL GTBL ;образ окна переносим в память POP BC ; Выводим человечка на то место, где было окно LD HL,MAN1 ;задаем адрес спрайта «человечек» LD A,SPRPUT ;задаем режим вывода PUSH BC CALL PTBL ; Вводим небольшую задержку LD BC,10 CALL 7997 POP BC ; Ранее запомненное окно с изображением части экрана переносим ; из буфера обратно на экран LD HL,BUFFER ;задаем начальный адрес буфера ; с изображением части экрана LD A,SPRPUT ;устанавливаем режим вывода PUSH BC CALL PTBL ;вывод окна на экран POP BC INC C ;увеличиваем координату X человечка LD A,C CP 20 JR C,LOOP ;(или JP M,LOOP) ; Вывод человечка, споткнувшегося о камень LD BC,#B16 ;B = 11, C = 22 LD A,SPRPUT ;устанавливаем режим вывода LD HL,MAN2 ;задаем адрес спрайта «упавший человечек» CALL PTBL RET


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