O Desenho das Telas de Abertura




  Tela Alternativa: Disprosoft

 

  Essa tela não faz parte do jogo original e acompanhava algumas distribuições. Entretanto, vale apena conferir como ela é criada, assim como um truque aplicado para suspender o display da tela.

  Código:
10 COLOR15,1,1: SCREEN 2,0
11 OPEN"GRP:"FOR OUTPUT AS #1
12 PI=3.1415927#:VDP(1)=160
13 LINE(18,74)-(33,82),2,BF
14 LINE(33,82)-(39,82),2
15 CIRCLE(32,82),8,2,0,PI/2,1.1:PAINT(34,77),2
16 LINE(18,84)-(39,92),7,BF
17 LINE(18,94)-(33,102),13,BF
18 LINE(33,94)-(39,94),13
19 CIRCLE(32,94),8,13,3*PI/2,0,1.1:PAINT(35,100),13
20 LINE(42,74)-(50,82),2,BF
21 LINE(42,84)-(50,92),7,BF
22 LINE(42,94)-(50,102),13,BF
23 LINE(67,74)-(72,82),2,BF
24 LINE(72,74)-(76,74),2:LINE(64,82)-(67,82),2
25 CIRCLE(69,82),8,2,PI/2,PI,1.7
26 CIRCLE(76,82),8,2,PI/2,PI,2.2
27 PAINT(66,80),2:PAINT(73,75),2
28 LINE(63,84)-(69,92),7,BF
29 LINE(63,92)-(61,92),7
30 LINE(63,84)-(61,92),7:PAINT(62,91),7
31 LINE(69,84)-(71,84),7:LINE(71,84)-(69,92),7:PAINT(70,85),7
32 LINE(53,94)-(61,102),13,BF
33 LINE(61,94)-(68,94),13:CIRCLE(61,94),8,13,3*PI/2,0,1.1:PAINT(63,96),13
34 LINE(79,74)-(94,82),2,BF
35 LINE(94,82)-(100,82),2
36 CIRCLE(93,82),8,2,0,PI/2,1.1:PAINT(95,77),2
37 LINE(79,84)-(87,92),7,BF:LINE(87,84)-(100,84),7:LINE(87,90)-(96,90),7:
CIRCLE(96,84),6,7,3*PI/2,0,1.5:PAINT(89,86),7
38 LINE(79,94)-(87,102),13,BF
39 LINE(103,74)-(118,82),2,BF
40 LINE(118,82)-(124,82),2
41 CIRCLE(117,82),8,2,0,PI/2,1.1:PAINT(119,77),2
42 LINE(103,84)-(118,90),7,BF
43 LINE(118,84)-(124,84),7:CIRCLE(120,84),6,7,3*PI/2,0,1.5:LINE(119,90)-(124,92),7:
LINE(116,90)-(116,92),7:LINE(116,92)-(124,92),7:PAINT(122,86),7:PAINT(117,91),7
44 LINE(116,94)-(124,102),13,BF
45 LINE(127,82)-(147,82),2
46 CIRCLE(137,82),10,2,0,PI,.82:PAINT(137,80),2
47 LINE(127,84)-(147,92),7,BF
48 LINE(127,94)-(147,94),13
49 CIRCLE(137,94),10,13,PI,0,.82:PAINT(137,96),13:PSET(127,93),1
50 LINE(164,74)-(169,82),2,BF
51 LINE(169,74)-(173,74),2:LINE(161,82)-(164,82),2
52 CIRCLE(166,82),8,2,PI/2,PI,1.7
53 CIRCLE(173,82),8,2,PI/2,PI,2.2
54 PAINT(163,80),2:PAINT(170,75),2
55 LINE(160,84)-(166,92),7,BF
56 LINE(160,92)-(158,92),7
57 LINE(160,84)-(158,92),7:PAINT(159,91),7
58 LINE(166,84)-(168,84),7:LINE(168,84)-(166,92),7:PAINT(167,85),7
59 LINE(150,94)-(158,102),13,BF
60 LINE(158,94)-(165,94),13:CIRCLE(158,94),8,13,3*PI/2,0,1.1:PAINT(160,96),13
61 LINE(172,82)-(192,82),2
62 CIRCLE(182,82),10,2,0,PI,.82:PAINT(182,80),2
63 LINE(172,84)-(192,92),7,BF
64 LINE(172,94)-(192,94),13
65 CIRCLE(182,94),10,13,PI,0,.82:PAINT(182,96),13:PSET(172,93),1
66 LINE(195,74)-(215,82),2,BF
67 LINE(195,84)-(213,92),7,BF
68 LINE(195,94)-(203,102),13,BF
69 LINE(218,74)-(238,82),2,BF
70 LINE(218,84)-(226,92),7,BF
71 LINE(218,94)-(226,94),13:LINE(226,94)-(226,102),13:CIRCLE(226,94),8,13,PI,3*PI/2:
PSET(218,93),1:PAINT(220,96),13:LINE(226,96)-(234,102),13,BF
72 PRESET(150,120):COLOR11:PRINT#1,"APRESENTA"
73 VDP(1)=224
74 FORN=1TO2000:NEXT

  É interessante observar nesse código, um truque usado para suspender o display de toda a tela, enquanto o desenho é feito.
  Ele altera o registrador de modo #1 do VDP, de forma que o bit 6 (display) seja desabilitado. Depois, ele habilita novamente ao final. Veja como:
12 VDP(1)=160 : ' Desabilita display (160 = &B10100000)
73 VDP(1)=224 : ' Habilita display (224 = &B11100000)
  Fonte: O Livro Vermelho do MSX, Avalon Software

  A linha 74 faz um loop nela mesmo, de forma a estabelecer um intervalo para ficar exibindo a tela.



  Tela de Abertura: Alcatraz, a Fuga Impossível

 

  O código que desenha a tela de abertura é o seguinte:
100 CLEAR4000:DEFINTA-Z:COLOR8,15,15
110 SCREEN2,0:OPEN"GRP:"AS#1
...
170 GOSUB3030
...
3030 READX,Y
3040 FORN=0TO65:READA,B:LINE(X,Y)-(A,B):X=A:Y=B:NEXT
3050 LINE(20,114)-(208,114)
3060 FORN=1TO8:READA
3070 PAINT(A,80):NEXT
3072 COLOR1:PSET(104,117),15:PRINT#1,"A FUGA IMPOSSIVEL":COLOR8
3075 PSET(12,8),15:PRINT#1,"Programa de Wilson F. Martins"
3080 PSET(28,170),15:PRINT#1,"Tecle SPACO para comecar."
3090 IFSTRIG(0)=0THEN3090
...
3150 DATA 44,78,44,78,16,114,28,114,36,103,36,114,44,114,44,78
3160 DATA 48,78,48,114,72,114,64,106,64,106,56,106,56,78,48,78
3170 DATA 72,78,72,114,96,114,88,106,80,106,80,86,88,86,96,78,72,78
3180 DATA 124,78,96,114,108,114,116,103,116,114,124,114,124,78
3190 DATA 124,78,132,86,136,86,136,114,144,114,144,86,148,86,156,78,124,78
3200 DATA 156,78,156,114,164,114,164,98,172,114,180,114,172,98,180,98,172,78,
156,78
3210 DATA 208,78,180,114,192,114,200,103,200,114,208,114,208,78
3220 DATA 208,78,240,78,224,106,232,106,240,114,208,114,224,86,216,86,208,78
3230 DATA 43,49,73,123,127,159,207,220

  A linha 100 reserva um espaço para guardar os dados relativos ao jogo. Além disso, define a cor de texto para vermelho (8) e fundo branco (15).
  Na linha 170, o programa é desviado para um sub-rotina de desenho da tela "Alcatraz".
  Nas linhas 3030 e 3040, ele lê 67 coordenadas de pontos, localizadas nas instruções DATA contidas nas linhas 3150-3220. A cada loop, ele desenha uma linha do ponto atual até o ponto anterior.
  Depois de desenhar os contornos da palavra "Alcatraz", ele pinta as áreas internas, cujas as coordenadas X estão na linha 3230.
  Após escrever as mensagens, ele espera que a tecla de espaço seja pressionada.



  O Disparo e as Marcas de Bala

 

  Ao pressionar a barra de espaços, o programa apaga os textos do topo e fundo da tela e desenha dez marcas de bala.

  O trecho do programa que faz isso é o seguinte:
100 CLEAR4000:DEFINTA-Z:COLOR8,15,15
110 SCREEN2,0:OPEN"GRP:"AS#1
120 VPOKE6144,1:VPOKE6400,1:VPOKE6656,1
130 FORN=0TO7:READQ$:Q=VAL("&H"+Q$)
140 VPOKEN,Q:VPOKEN+2048,Q:VPOKEN+4096,Q:NEXT
150 FORN=0TO7:READQ$:Q=VAL("&H"+Q$)
160 VPOKEN+8192,Q:VPOKEN+10240,Q:VPOKEN+12288,Q:NEXT
170 GOSUB3030 : ' Rotina de desenho
...
3090 IFSTRIG(0)=0THEN3090 : ' Pausa p/ espaço
3095 LINE(0,8)-(255,15),15,BF:LINE(28,170)-(255,177),15,BF
3100 FORN=0TO9:VPOKE6370+N*35,0
3110 SOUND7,7:SOUND8,16:SOUND6,25:SOUND13,0:SOUND12,20
3120 FORM=0TO100:NEXTM,N:RETURN
3130 DATA 10,41,18,3C,3C,19,40,01
3140 DATA 10,10,10,10,10,10,10,10

  O que a rotina faz é criar o padrão de desenho das marcas de bala como um novo "caractere" e copiar para determinadas regiões da tela, assim que a barra de espaços é pressionada. Vamos entender como isso funciona.

  Observe que antes de desviar para a rotina de desenho da tela "Alcatraz", o programa desenha as balas na tela utilizando o padrão contido linha 3130 e as cores contidas na linha 3140.

  Desenho da marca de bala na VRAM:
3130 DATA 10,41,18,3C,3C,19,40,01 : ' Padrão
3140 DATA 10,10,10,10,10,10,10,10 : ' Cor
Padrão

10 = 00010000
41 = 01000001
18 = 00011000
3C = 00111100
3C = 00111100
19 = 00011001
40 = 10000000
01 = 00000001


Cor

&H10 = &B00010000

Texto = 1 = Preto
Fundo = 0 = Transparente

  Este desenho é feito em três locais da tela, através do código das linhas 130-160. Entretanto, todas as marcas estão "invisíveis".
  A tabela de nomes da screen 2 é utilizada para deixar as marcas invisíveis e também copiar esses padrões para outras posições na tela. Vejamos como.

  A screen 2 possui as seguintes tabelas:   Fonte: O Livro Vermelho do MSX

  As tabelas de cores e padrões podem ser vistas no apêndice do MSX Viewer 5 ou aqui. Elas servem para desenhar algo na tela, como as marcas de bala (linhas 130-160).

  A tabela de nomes mapeia a tela em blocos de 8x8 pixels, como se fossem caracteres. São 32 colunas e 24 linhas e o mapeamento da tela é o seguinte:
┌───┬───┬───┬───┐ 
│000│001│...│031│
├───┼───┼───┼───┤
│032│033│...│063│
├───┼───┼───┼───┤
│...│...│...│...│
├───┼───┼───┼───┤
│736│737│...│768│
└───┴───┴───┴───┘
  O endereço do bloco na tabela de nomes é obtido através da soma:

  E = &H1800 + M

  Onde "M" é a posição no mapa.

  O conteúdo de uma posição da tabela de nomes indica qual é o bloco das tabelas de padrão e cor que aquela área da tela irá exibir.
  Por exemplo, podemos dizer que a área 001 da tela irá exibir o conteúdo da área 000 das tabelas de padrão e cor. Veja esse programa:
05 COLOR 15,0,0
10 SCREEN 2
20 OPEN"GRP:" AS #1
30 PRESET(0,0):PRINT#1,"A"
40 VPOKE &H1801,0
50 GOTO 50
  Ele escreve a letra "A" na posição de tela correspondente ao bloco 000, alterando as tabelas de padrão e cor.
  Em seguida, a posição 001 da tabela de nomes foi alterada de 1 para 0. Isto faz com que a região 001 da tela (posição) passe a desenhar o conteúdo da região 000 das tabelas de padrão e cor (conteúdo).
  O resultado disso, é que temos o segundo caractere "A" desenhado ao lado do primeiro.
AA

  Como em cada posição da tabela de nomes só cabe um número de 0 a 255, ela é dividida em três partes. Dessa forma, o mapa de nomes das linhas de 0 a 7 só enxerga esse pedaço da tela, assim como das linhas 8 a 15 só enxergam o seu pedaço de tela e, finalmente, as linhas de 16 a 23 idem.
  É por isso, que o programa desenha três vezes a marca de bala na tela, uma para cada trecho. De outra forma, a primeira marca não seria enxergada nas outras partes da tela.
  Cada trecho é inicialmente numerado de 0 a 255 na tabela de nomes, fazendo correspondência direta com as tabelas de padrão e cor.

  O truque utilizado para esconder as marcas de bala, foi o de atribuir à posição 000 da tela o conteúdo da posição 001, que está vazio. O desenho continua lá nas tabelas de padrão e cor, mas não é exibido.
05 COLOR 15,0,0
10 SCREEN 2
20 OPEN"GRP:" AS #1
30 VPOKE &H1800,1
40 PRESET(0,0):PRINT#1,"A"
50 GOTO 50

  Agora a letra "A" é escondida.

  Para provar que o desenho da letra "A" ainda está ali, vamos desenhá-lo na posição 005.
05 COLOR 15,0,0
10 SCREEN 2
20 OPEN"GRP:" AS #1
30 VPOKE &H1800,1
40 PRESET(0,0):PRINT#1,"A"
50 VPOKE &H1805,0
60 GOTO 60

  Voltando ao jogo, a linha 120 esconde as três marcas de bala.
  As linhas 130-160 desenham secretamente as marcas de bala na tela.
  A sub-rotina da linha 3030 desenha a tela do "Alcatraz".
  Após pressionar a barra de espaços, a linha 3095 apaga os textos.
  A linha 3100 copia os desenhos de marca de bala na tela, enquanto que a linha 3110 faz o barulho de tiro.
  Observe que o código utilizado para as três marcas de bala é o mesmo: 0. Eles correspondem ao inicio de cada trecho (terça parte) da tabela de nomes.


<< Anterior Home Próxima >>

MARMSX/CURSOS/Basic