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


         

Изготовление маски спрайта



Рисунок 7.3. Изготовление маски спрайта



Перейдем к реализации способа перемещения спрайтов с восстановлением фона, основанного на применении маски:

  • процедурой GTBL забираем в буфер часть экранного изображения;
  • процедурой PTBL по принципу AND в то же место экрана помещаем маску корабля, в результате чего будет очищена не вся прямоугольная область экрана, а только внутренняя часть, которую вы оставили незаштрихованной (вспомните, в чем заключается принцип AND);
  • процедурой PTBL по принципу OR внутрь маски помещаем спрайт корабля (объединение по OR не стирает предыдущего изображения, поэтому и нужно почистить экран маской);
  • ранее сохраненное окно с изображением части экрана переносим из буфера обратно на экран, используя процедуру PTBL в режиме SPRPUT;
  • изменяем координаты спрайта на новые, после чего повторяем перечисленные действия в том же порядке.
  • ORG 60000 ENT $ N_SYM EQU 36 ;задаем количество знакомест окна LD A,6 LD (23693),A XOR A CALL 8859 CALL 3435 LD A,2 CALL 5633 ; Начало программы CALL MORE ;рисуем «морской» пейзаж LD C,0 ;начальная координата Y корабля LOOP LD B,8 ;задаем параметры окна, в которое ; поместим изображение части экрана ; (COL = C, ROW = 8) LD (COL),BC LD HL,#409 ;LEN = 9, HGT = 4 LD (LEN),HL LD IX,BUFFER ;в IX заносим начальный адрес буфера LD A,N_SYM ;в регистр A заносим площадь окна PUSH BC CALL GTBL ;образ окна переносим в память POP BC ; По принципу AND на экран помещаем маску LD B,8 LD HL,MASKA ;задаем адрес маски LD A,SPRAND ;устанавливаем режим вывода PUSH BC CALL PTBL POP BC ; По принципу OR в маску помещаем спрайт «корабль» LD B,8 INC C ;увеличиваем координату X «корабля» LD HL,KORAB ;задаем адрес спрайта «корабля» LD A,SPROR ;устанавливаем режим вывода PUSH BC CALL PTBL ;выводим корабль LD BC,20 ;вводим задержку CALL 7997 POP BC ; Ранее запомненное окно с изображением части экрана переносим ; из буферной области памяти обратно на экран LD B,8 DEC C LD HL,BUFFER ;устанавливаем начальный адрес буфера LD A,SPRPUT ;устанавливаем режим вывода PUSH BC CALL PTBL POP BC INC C ;увеличиваем координату X корабля LD A,C ;конечная координата X корабля CP 32 ;проверяем, не вышел ли корабль ; за пределы экрана JR C,LOOP RET ; Рисование «моря» синим цветом MORE LD A,14 LD (23693),A CALL 3435 LD A,2 CALL 5633 LD BC,320 LD HL,#5800 ; Изображение черного «неба» NEBO LD (HL),7 INC HL DEC BC LD A,B OR C JR NZ,NEBO LD BC,#606 ;B = 6, C = 6 LD A,SPRPUT ;устанавливаем режим вывода LD HL,OBL ;задаем адрес спрайта «облако» CALL PTBL ;печать «облака» LD BC,#414 ;B = 4, C = 20 LD A,SPRPUT LD HL,OBL CALL PTBL ;печать еще одного «облака» ; Вывод на экран спрайта «остров» OSTROV LD BC,#908 ;B = 9, C = 8 - координаты LD A,SPRPUT LD HL,LAND ;задаем адрес спрайта CALL PTBL ;выводим его на экран RET




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