Desenho do Labirinto
Você está em: MarMSX >> Cursos >> Jogos >> Alcatraz
Foi visto no capítulo anterior, que o autor do jogo desenha na screen 2 utilizando caracteres definidos na tela e através da tabela de nomes.
Os padrões de caracteres foram definidos antes do jogo começar (vide capítulo anterior), e são os seguintes, juntamente com seus respectivos códigos:
Descrição textual dos padrões:
- Vazio
- Bloco de tijolo
- Grade
- Policial
- Cadeira elétrica
- Porta
- Escuro
- Fogo
- Alarme
- Feixe de luz
- Cães
- Terra
- Carcereiro
- Vazio
- Presidiário / você
A tabela PO$ define o mapa do labirinto. Ele é codificado com os números correspondentes aos padrões descritos. Os valores estão em hexadecimal, conforme a figura acima.
Este mapa considera a posição do jogador em um determinado momento, definida pelas variáveis PC (coluna) e PL (linha), e desenha o labirinto conforme o jogador vai andando na tela.
Para cada posição do personagem, o mapa contém a informação de desenho dos blocos ao norte, sul, leste e oeste.
A variável ED, ajustada na preparação do jogo, contém o endereço da tabela de nomes da posição atual do jogador.
A partir da posição PC,PL, a rotina de desenho do labirinto escreve os 8 blocos ao redor da posição.
As posições norte, sul, leste e oeste, ele se informa no mapa PO$.
Já os blocos em diagonal são preenchidos sempre com tijolos.
A posição atual do personagem é preenchida sempre com o presidiário (14 ou E).
A rotina do labirinto é essa:
680 REM ♦♦♦♦♦ IMPRIME LABIRINTO ♦♦♦♦♦♦
690 IFMO=1THENPL=PL-1
700 IFMO=2THENPL=PL+1
710 IFMO=3THENPC=PC+1
720 IFMO=4THENPC=PC-1
730 IFED=6613 OR ED=6677 OR ED=6741 THEN VPOKEED,6 ELSE VPOKEED,0
740 I$=PO$(PC,PL):ED=BASE(10)+PC*2+PL*64+3:VPOKEED-33,1:VPOKEED-31,1:VPOKEED+31,1:
VPOKEED+33,1:VPOKEED,14
750 VPOKEED-32,VAL("&H"+MID$(I$,1,1))
760 VPOKEED+32,VAL("&H"+MID$(I$,2,1))
770 VPOKEED+1,VAL("&H"+MID$(I$,3,1))
780 VPOKEED-1,VAL("&H"+MID$(I$,4,1))
790 X(6)=0:X(8)=0:SOUND8,0:GOTO340
A primeira parte dessa rotina, que é chamada a partir do gerenciador de movimentos / comandos, atualiza a posição do personagem, conforme a tecla pressionada.
690 IFMO=1THENPL=PL-1
700 IFMO=2THENPL=PL+1
710 IFMO=3THENPC=PC+1
720 IFMO=4THENPC=PC-1
A linha 730 é responsável por apagar a posição anterior do personagem. Ela verifica se a área anterior era escura ou clara.
730 IFED=6613 OR ED=6677 OR ED=6741 THEN VPOKEED,6 ELSE VPOKEED,0
Na linha 740, a variável I$ recebe do mapa PO$ o código dos blocos vizinhos em relação à posição atual.
Além disso, ele atualiza o endereço na VRAM da tabela de nomes (ED), em relação à nova posição do personagem.
Depois, ele desenha tijolos nas 4 posições diagonais vizinhas ao personagem. Por fim, desenha o personagem (14) na posição ED atual.
740 I$=PO$(PC,PL):ED=BASE(10)+PC*2+PL*64+3:VPOKEED-33,1:VPOKEED-31,1:VPOKEED+31,1:
VPOKEED+33,1:VPOKEED,14
Desenho nas diagonais - T = tijolo e P = personagem:
T T
P
T T
Nas linhas 750-780, o código da posição atual é interpretado e cada bloco é desenhado.
750 VPOKEED-32,VAL("&H"+MID$(I$,1,1))
760 VPOKEED+32,VAL("&H"+MID$(I$,2,1))
770 VPOKEED+1,VAL("&H"+MID$(I$,3,1))
780 VPOKEED-1,VAL("&H"+MID$(I$,4,1))
Onde:
- 1o. caractere = objeto ao norte.
- 2o. caractere = objeto ao sul.
- 3o. caractere = objeto a leste.
- 4o. caractere = objeto a oeste.
Ex: código no formato string "1001" vai desenhar:
- Tijolo ao norte.
- Vazio ao sul.
- Vazio a leste.
- Tijolo a oeste.
T
TP
Juntando as 8 posições, fica:
TTT
TP
T T
Notas:
- A linha do labirinto começa na posição 2 da matriz PO$.
- Os limites do labirinto estão nos corredores e não nas paredes externas.
Imprimindo Todo o Labirinto
A rotina a seguir imprime todo o labirinto. Aguarde um pouquinho a leitura dos dados.
5 COLOR 1,5,5
10 SCREEN 2
20 DIMPO$(13,11):FORM=2TO11:FORN=0TO13:READPO$(N,M):NEXTN:NEXTM
100 FORN=0TO14:VPOKE6144+N,15:VPOKE6400+N,15:VPOKE6656+N,15:NEXT
110 FORN=0TO119:READQ$:Q=VAL("&H"+Q$)
120 VPOKEN,Q:VPOKEN+2048,Q:VPOKEN+4096,Q:NEXT
130 FORN=0TO119:READQ$:Q=VAL("&H"+Q$)
140 VPOKEN+8192,Q:VPOKEN+10240,Q:VPOKEN+12288,Q:NEXT
200 FOR PC=0 TO 13:FOR PL=2 TO 11
210 IFED=6613 OR ED=6677 OR ED=6741 THEN VPOKEED,6 ELSE VPOKEED,0
220 I$=PO$(PC,PL):ED=BASE(10)+PC*2+PL*64+3:VPOKEED-33,1:
VPOKEED-31,1:VPOKEED+31,1:VPOKEED+33,1:VPOKEED,14
230 VPOKEED-32,VAL("&H"+MID$(I$,1,1))
240 VPOKEED+32,VAL("&H"+MID$(I$,2,1))
250 VPOKEED+1,VAL("&H"+MID$(I$,3,1))
260 VPOKEED-1,VAL("&H"+MID$(I$,4,1))
270 NEXT PL,PC
300 GOTO 300
3270 DATA 1001,1010,1001,1100,1100,1009,1100,1100,1100,1100,1010,
10C1,1100,1010
3280 DATA 0011,0011,0101,1100,1010,0011,1001,1010,1011,1011,0011,
0101,1010,0011
3290 DATA 0011,0011,1101,1100,0110,0011,5011,0101,0110,0011,0011,
1011,0011,0011
3300 DATA 0011,0011,1001,1000,1010,8011,0001,1100,1100,0010,0011,
0011,0011,0011
3310 DATA 0111,0101,0010,0011,0011,0011,0011,1101,1100,0612,0011,
0101,0010,0011
3320 DATA 1001,1010,0011,0011,0011,0011,0001,1102,1110,6611,0011,
1011,0011,0111
3330 DATA 0011,0011,0111,0011,0101,0110,0101,1340,1111,6611,0011,
0101,0100,1010
3340 DATA 0011,0011,1001,7000,1010,1101,1100,0100,1010,6111,0011,
1001,1100,0B10
3350 DATA 0011,0011,0011,5011,0101,1100,1100,1110,0011,1001,0110,
0011,1001,0110
3360 DATA 0111,0101,0110,0101,1100,1100,1100,1100,0110,01A1,11DA,
0110,0101,1110
3480 DATA 00,00,00,00,00,00,00,00
3490 DATA 01,01,01,FF,10,10,10,FF
3500 DATA 18,18,18,18,18,18,18,18
3510 DATA 18,18,3C,5A,99,18,24,24
3520 DATA 02,02,02,02,3E,3E,22,22
3530 DATA 00,81,FF,FF,02,06,00,00
3540 DATA FF,FF,FF,FF,FF,FF,FF,FF
3550 DATA 08,28,3A,7A,7E,7E,3E,1C
3560 DATA 07,0F,05,07,07,00,00,00
3570 DATA 18,18,18,18,18,18,18,18
3580 DATA 18,3C,7E,FF,E7,C3,C3,C3
3590 DATA 06,0E,1F,7D,DF,F6,BB,EF
3600 DATA 18,18,3C,5A,99,18,24,24
3610 DATA 00,00,00,00,00,00,00,00
3620 DATA 18,18,3C,5A,99,18,24,24
3630 DATA 00,00,00,00,00,00,00,00
3640 DATA E6,E6,E6,E6,E6,E6,E6,E6
3650 DATA 10,40,10,40,10,40,10,40
3660 DATA 10,D0,10,10,10,10,10,10
3670 DATA E0,E0,E0,E0,F0,E0,E0,E0
3680 DATA 10,10,10,C0,10,10,10,10
3690 DATA 10,10,10,10,10,10,10,10
3700 DATA 60,60,60,80,80,80,90,90
3710 DATA 10,10,10,10,10,10,10,10
3720 DATA 70,70,70,70,70,70,70,70
3730 DATA 90,D0,80,60,F1,F1,F1,F1
3740 DATA 90,90,90,90,91,91,91,91
3750 DATA 10,D0,F0,F0,F0,F0,F0,F0
3760 DATA 00,00,00,00,00,00,00,00
3770 DATA F0,60,10,F0,10,F0,10,F0