Как написать игру для 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


    ;Графические переменные COL DEFB 0 ROW DEFB 0 LNG DEFB 0 HGT DEFB 0 ; Резервирование памяти для окна BUFFER DEFS N_SYM*11+1 ; Заголовок данных спрайта «корабль» KORAB DEFB 13 DEFB 0,3,7, 1,1,4, 1,2,7, 1,3,7, 1,4,7 DEFB 1,5,4, 2,0,15, 2,1,15, 2,2,15, 2,3,15 DEFB 2,4,15, 2,5,15, 2,6,15 ; Данные спрайта «корабль» DEFB 0,0,0,16,16,16,16,24 DEFB 0,0,0,0,0,0,0,31 DEFB 0,0,0,0,3,4,7,197 DEFB 60,38,30,60,149,159,179,191 DEFB 0,0,0,0,128,128,111,229 DEFB 0,0,0,0,0,0,240,0 DEFB 0,1,0,127,85,43,31,0 DEFB 2,251,84,255,85,187,255,0 DEFB 183,254,201,255,85,255,255,0 DEFB 238,12,191,213,127,255,255,0 DEFB 63,217,255,85,255,255,255,0 DEFB 127,40,255,85,186,255,255,0 DEFB 128,0,254,20,184,240,224,0 ; Заголовок маски MASKA DEFB 14 DEFB 0,3,7, 1,1,4, 1,2,4, 1,3,4, 1,4,4 DEFB 1,5,4, 1,6,4, 2,0,15, 2,1,15, 2,2,15 DEFB 2,3,15, 2,4,15, 2,5,15, 2,6,15 ; Данные маски DEFB 255,255,199,199,199,199,195,129 DEFB 255,255,255,255,255,255,192,192 DEFB 255,255,255,248,240,240,16,0 DEFB 128,128,128,0,0,0,0,0 DEFB 255,255,255,63,63,0,0,0 DEFB 255,255,255,255,255,7,7,0 DEFB 255,255,255,255,255,255,255,63 DEFB 252,252,0,0,0,0,128,192 DEFB 0,0,0,0,0,0,0,0 DEFB 0,0,0,0,0,0,0,0 DEFB 0,0,0,0,0,0,0,0 DEFB 0,0,0,0,0,0,0,0 DEFB 0,0,0,0,0,0,0,0 DEFB 63,0,0,0,1,3,7,15 ; Заголовок спрайта «облако» OBL DEFB 4 DEFB 0,0,7, 0,1,7, 0,2,7, 0,3,7 ; Данные спрайта «облако» DEFB 0,48,218,255,255,98,56,0 DEFB 60,255,86,251,247,247,46,112 DEFB 0,58,127,207,123,239,118,57 DEFB 0,0,56,238,207,117,24,0 ; Заголовок спрайта «остров» LAND DEFB 14 DEFB 0,0,4, 0,1,4, 0,2,4, 0,3,4 DEFB 0,4,4, 0,5,4, 0,6,4, 0,7,4 DEFB 0,8,4, 0,9,4, 0,10,4, 0,11,4 DEFB 0,12,4, 0,13,4 ; Данные спрайта «остров» DEFB 0,0,0,0,0,0,28,255 DEFB 0,0,0,0,0,28,255,255 DEFB 0,0,0,0,48,255,255,255 DEFB 0,0,0,0,0,0,252,255 DEFB 0,0,0,0,0,3,63,255 DEFB 0,0,48,252,255,255,253,252 DEFB 0,0,0,0,193,243,255,255 DEFB 0,0,0,0,193,243,255,255 DEFB 0,0,0,0,0,3,63,255 DEFB 0,0,48,252,255,255,253,252 DEFB 0,0,0,0,193,243,255,255 DEFB 0,0,48,252,255,255,253,252 DEFB 0,0,0,0,193,243,255,255 DEFB 0,0,0,0,0,192,252,255


    Содержание раздела