Curso de Basic
Animações na screen 2


  O capítulo 15 do curso de Basic apresentou as tabelas de nomes, caracteres e cores do MSX 1. A partir da modificação dessas tabelas na screen 2, é possível gerar desenhos padronizados e animações, sendo uma alternativa aos sprites.


  Sprites Coloridos

  É possível gerar sprites coloridos, apesar da limitação de uma cor por sprite. Nesse caso, devemos compor o desenho de um objeto colorido com diversos sprites monocromáticos. Entretanto, o MSX 1 possui a limitação de desenhar apenas 4 sprites por linha. Assim, o objeto está limitado a quatro cores diferentes por linha.
  Outra coisa interessante que pode ser feita com sprite é a mosaicagem. Ainda há o limite de 4 sprites por linha, mas a concatenação vertical de sprites é livre, de acordo com o número de sprites disponíveis.
  O programa a seguir cria um desenho com três cores.
10 SCREEN 2,1
20 FOR I=1 TO 3
30 S$=""
40 FOR T=1 TO 8
50 READ A$ 
60 S$=S$+CHR$(VAL("&H"+A$)) 
70 NEXT T 
80 SPRITE$(I)=S$ 
90 NEXT I
100 PUT SPRITE 0,(128,96),9,1
110 PUT SPRITE 1,(128,96),10,2
120 PUT SPRITE 2,(128,96),5,3
130 GOTO 130
200 DATA 38,44,82,82,82,44,38,00
210 DATA 00,38,7C,44,7C,38,00,00
220 DATA 00,00,00,38,00,00,00,00
  Saída:

 

  Ao movimentarmos o conjunto, algumas falhas no desenho acontecem. Observe isso, rodando o programa abaixo.
10 SCREEN 2,1
20 FOR I=1 TO 3
30 S$=""
40 FOR T=1 TO 8
50 READ A$ 
60 S$=S$+CHR$(VAL("&H"+A$)) 
70 NEXT T 
80 SPRITE$(I)=S$ 
90 NEXT I
95 FOR X=1 TO 255
100 PUT SPRITE 0,(X,96),9,1
110 PUT SPRITE 1,(X,96),10,2
120 PUT SPRITE 2,(X,96),5,3
125 NEXT X
130 GOTO 130
200 DATA 38,44,82,82,82,44,38,00
210 DATA 00,38,7C,44,7C,38,00,00
220 DATA 00,00,00,38,00,00,00,00

  No caso de um cenário com diversos objetos, essa opção se torna inviável, pois muitos deles irão desaparecer quando estiverem na mesma linha.


  Desenhos a partir dos caracteres

  O processador de vídeo do MSX 1 possui memória limitada, fazendo com que não haja espaço extra para armazenar objetos, como é feito no esquema de páginas de vídeo do MSX 2. Dessa forma, deve-se utilizar os recursos disponíveis. O conceito de caractere pode ser utilizado na screen 2 para desenhar objetos na tela, com a vantagem do caractere na screen 2 ser colorido, além de ser possível colocar diversos objetos na mesma linha. Vejamos como.
  Quando uma imagem é criada na screen 2, a tabela de nomes não é normalmente utilizada, como nas screens 0 e 1. No caso do desenho de uma imagem, somente as tabelas de padrão e caractere são utilizadas. A screen 2 utiliza a tabela de caracteres não mais para desenhar letras, números ou símbolos, como nas screens 0 e 1, mas sim para definir padrões quaisquer.
  As tabelas de caracteres e cores funcionam em conjunto e ambas controlam individualmente todos os 768 blocos de caracteres da tela, formando um mega mosaico.
             Screen 2
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘
  Tabela de caracteres e cores:
  Mosaico de 32 x 24 caracteres

  A tabela de nomes na screen 2 também tem a função de mapear uma posição na tela com um caractere. Porém, no caso dessa tabela, a tela é dividida verticalmente em três partes iguais, com 256 caracteres cada uma. Essa limitação se deve devido à falta de espaço na VRAM do MSX 1, que tem somente 16 KB.
             Screen 2
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘
        Tabela de nomes
  A referência a cada posição da tela é feita pela tabela de nomes da seguinte maneira:
000 001 ... 031
032 033 ... 063
     ...
224 225 ... 255

---------------

000 001 ... 031
032 033 ... 063
     ...
224 225 ... 255

---------------

000 001 ... 031
032 033 ... 063
     ...
224 225 ... 255

  A tabela de nomes da screen 2 é inicializada com os valores variando de 0 a 255 em cada parte. Isso faz a correspondência direta entre a localização do caractere e as tabelas de caracteres e cores.
  Cada parte da tabela de nomes controla e faz correspondências somente a terça parte da tela em que ela se localiza. Por exemplo, se eu estiver na segunda parte da tabela de nomes referenciando a posição 0 da tabela de caracteres, eu estarei referenciando a posição 0 da segunda parte da tela, conforme mostra o diagrama anterior.
  As entradas da tabela de nomes na screen 2 se localizam nos seguintes endereços de VRAM:

  Utilizando a tabela de nomes para criar desenhos padronizados

  A idéia aqui é utilizar a tabela de nomes exatamente como faz as screens 0 e 1. Para isso, vamos utilizar a tabela de caracteres para criar o padrão e a tabela de nomes para definir o local da tela em que o padrão aparece.
  O programa a seguir desenha a letra "A" na posição 0 da tabela de caracteres e cores.
10 SCREEN 2
20 OPEN"GRP:" FOR OUTPUT AS#1
30 PRESET(0,0) : PRINT#1,"A"
40 GOTO 40

  Podemos "esconder" a letra "A", fazendo a referência da posição 0 da primeira parte da tela com o caractere 1.
10 SCREEN 2
20 OPEN"GRP:" FOR OUTPUT AS#1
30 PRESET(0,0) : PRINT#1,"A"
40 VPOKE 6144,1
50 GOTO 50
  Agora, vamos fazer a cópia do caractere "A", localizada na posição 0 da primeira parte da tela, para outra posição da tela, utilizando a tabela de nomes.
10 SCREEN 2
20 OPEN"GRP:" FOR OUTPUT AS#1
30 PRESET(0,0) : PRINT#1,"A"
40 VPOKE 6200,0
50 GOTO 50
  Saída:

 

  Foi visto que cada parte da tabela de nomes não se comunica com as demais. Isto pode ser verificado nas posições 6400 e 6656 (entradas da segunda e terceira parte na tabela de nomes), onde cada uma referencia a posição 0 da tabela de caracteres e cores, e nada é desenhado ali.
  Agora, vamos modificar a tabela de caracteres e cores na posição 0 da segunda parte da tela.
10 SCREEN 2
20 OPEN"GRP:" FOR OUTPUT AS#1
30 PRESET(0,65) : PRINT#1,"A"
40 GOTO 40
  Agora a letra "A" apareceu.

  No exemplo a seguir, vamos utilizar as duas primeiras partes da tela e observar a independência delas.
10 SCREEN 2
20 OPEN"GRP:" FOR OUTPUT AS#1
30 PRESET(0,0) : PRINT#1,"A"
40 PRESET(0,65) : PRINT#1,"B"
50 VPOKE 6200,0
60 VPOKE 6440,0
70 GOTO 70
  Saída:

 

  Em ambas as linhas 50 e 60, há referência ao caractere 0. Entertanto, a primeira parte escreve a letra "A" e a segunda a letra "B".
  Fica evidente que, se um padrão tiver que ser desenhado em qualquer parte da tela, ele deverá ser repetido nas três partes. Um exemplo disso pode ser visto na explicação do jogo Alcatraz, a Fuga Impossível:

 

  Aproveitando o gancho do jogo, vamos desenhar um aposento em toda a tela, utilizando o padrão de tijolos.
10 SCREEN 2
20 FOR N=0 TO 7 : READQ$:Q=VAL("&H"+Q$)
30 VPOKE N,Q : VPOKE N+2048,Q : VPOKE N+4096,Q : NEXT
40 FOR N=0 TO 7 : READQ$:Q=VAL("&H"+Q$)
50 VPOKE N+8192,Q : VPOKE N+10240,Q : VPOKE N+12288,Q : NEXT
60 GOTO 60
500 ' Tabela de Padrões
510 DATA 01,01,01,FF,10,10,10,FF
520 ' Tabela de Cores
530 DATA E6,E6,E6,E6,E6,E6,E6,E6
  Esse código cria o tijolo nas três partes da tela. Ele irá aparecer, a menos que nós o escondamos:
15 VPOKE 6144,1 : VPOKE 6400,1 : VPOKE 6656,1
  Essa linha referencia as posições 0 de cada parte para a posição 1, que não há nada desenhado.

  Agora, vamos desenhar o aposento em toda a tela.
  Uma coisa a ser observada é que o endereçamento à tabela de nomes não possui divisão, ou seja, é feito diretamente. Somente a referência aos caracteres é feita em três partes, e por isso, repetimos o padrão nas três partes. Assim, para colocar o tijolo em qualquer parte da tela, basta fazer referência ao caractere 0, em qualquer endereço da tabela de nomes.
  Para calcular o endereço da tabela de nomes de acordo com a coordenada de um caractere (linha e coluna) é feita utilizando a seguinte equação:
endereço = 6144 + (linha x 32) + coluna
  O programa completo é apresentado a seguir.
10 SCREEN 2
15 VPOKE 6144,1 : VPOKE 6400,1 : VPOKE 6656,1
20 FOR N=0 TO 7 : READQ$:Q=VAL("&H"+Q$)
30 VPOKE N,Q : VPOKE N+2048,Q : VPOKE N+4096,Q : NEXT
40 FOR N=0 TO 7 : READQ$:Q=VAL("&H"+Q$)
50 VPOKE N+8192,Q : VPOKE N+10240,Q : VPOKE N+12288,Q : NEXT
100 ' Desenha aposento
110 FOR X=5 TO 22
120 Y=1 : VPOKE 6144 + X + Y*32,0
130 Y=23 : VPOKE 6144 + X + Y*32,0
140 NEXT X
150 FOR Y=2 TO 22
160 X=5 : VPOKE 6144 + X + Y*32,0
170 X=22 : VPOKE 6144 + X + Y*32,0
180 NEXT Y
190 GOTO 190
500 ' Tabela de Padrões
510 DATA 01,01,01,FF,10,10,10,FF
520 ' Tabela de Cores
530 DATA E6,E6,E6,E6,E6,E6,E6,E6
  Saída:

 

  Em resumo, vimos que o endereçamento a qualquer uma das três tabelas é feito diretamente, a partir do endereço de entrada da tabela. Entretanto, quando referenciamos um caractere na tabela de nomes, devemos considerar a divisão da tela em três partes, numeradas de 0 a 255 cada uma.


  Criando animações

  Alterando a tabela de nomes, podemos criar algumas animações. Seja ela um objeto em movimento na tela ou até mesmo um pequeno filme, onde há a alternância da aparência de um objeto.
  Vamos aproveitar o exemplo anterior dos tijolos e criar um tijolo em movimento na tela.
10 SCREEN 2
15 VPOKE 6144,1 : VPOKE 6400,1 : VPOKE 6656,1
20 FOR N=0 TO 7 : READQ$:Q=VAL("&H"+Q$)
30 VPOKE N,Q : VPOKE N+2048,Q : VPOKE N+4096,Q : NEXT
40 FOR N=0 TO 7 : READQ$:Q=VAL("&H"+Q$)
50 VPOKE N+8192,Q : VPOKE N+10240,Q : VPOKE N+12288,Q : NEXT
100 ' Animação
110 VPOKE I,0
120 FOR I=6145 TO 6144+31
130 FOR T=1 TO 100 : NEXT
140 VPOKE I,0 : ' Desenha tijolo em nova posição
150 VPOKE I-1,1 : ' Apaga tijolo na posição antiga
160 NEXT
170 GOTO 170
500 ' Tabela de Padrões
510 DATA 01,01,01,FF,10,10,10,FF
520 ' Tabela de Cores
530 DATA E6,E6,E6,E6,E6,E6,E6,E6
  A rotina de animação (linhas 100-170) é responsável por alterar a tabela de nomes, desenhando o tijolo em novas posições, ao mesmo tempo que apaga o desenho da posição antiga. Se o tijolo não fosse apagado, deixaria um rastro de tijolos e o trecho ficaria com a aparência de um muro. Foi exatamente isso que foi feito quando fizemos o aposento na seção anterior.
Instante 1:
0                                                              31
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│T│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
...

Instante 2:
0                                                              31
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│ │T│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
...

Instante 3:
0                                                              31
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│ │ │T│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
...

T - Tijolo

  O jogo Alcatraz faz toda a dinâmica do jogo utilizando essa técnica. Entretanto, a linguagem Basic é lenta para fazer animações. Para jogos mais sofisticados, devemos utilizar o Assembly.

  O exemplo a seguir apresenta uma animação do jogo de Volley do MSX, no qual são feitos dois desenhos da jogadora, um em cada posição do movimento.
10 SCREEN 2 : COLOR 15,2,2
20 GOSUB 400
30 EI=0 : GOSUB 500
40 EI=16 : GOSUB 500
100 ' Animação
110 E=0
120 VPOKE 6154,E : VPOKE 6155,E+1  
130 VPOKE 6186,E+32 : VPOKE 6187,E+33
140 VPOKE 6218,E+64 : VPOKE 6219,E+65
150 FOR T=1 TO 100 : NEXT T
160 IF E=0 THEN E=2 ELSE E=0
170 GOTO 120
400 ' Configura
410 VPOKE 6144,255 : VPOKE 6145,255
420 VPOKE 6146,255 : VPOKE 6147,255
430 VPOKE 6176,255 : VPOKE 6177,255
440 VPOKE 6178,255 : VPOKE 6179,255
450 VPOKE 6208,255 : VPOKE 6209,255
460 VPOKE 6210,255 : VPOKE 6211,255
470 RETURN
500 ' Desenha jogadora
510 E = EI
520 FOR T=1 TO 2
530 FOR I=1 TO 3
540 FOR L=1 TO 16
550 READ A$
560 A = VAL("&H"+A$)
570 VPOKE E,A
580 E=E+1
590 NEXT L
600 E=E+30*8
610 NEXT I
620 E=EI+&H2000
630 NEXT T
640 RETURN
1000 ' Tabela de caracteres
1010 DATA 00,00,00,03,07,0F,3F,81
1020 DATA 00,00,00,C0,E0,F0,FC,81
1030 DATA 05,07,03,03,07,1F,3F,2F  
1040 DATA A0,E0,C0,C0,E0,F8,FC,F4
1050 DATA 3F,0F,0F,0E,0E,0E,0E,1E
1060 DATA FC,F0,F0,70,70,70,70,78
1100 ' Tabela de cores
1110 DATA 00,00,00,10,10,10,10,91
1120 DATA 00,00,00,10,10,10,10,91
1130 DATA 91,91,91,A0,A0,A0,A0,A0
1140 DATA 91,91,91,A0,A0,A0,A0,A0
1150 DATA A0,C0,C0,90,90,90,A0,A0
1160 DATA A0,C0,C0,90,90,90,A0,A0
1200 ' Tabela de caracteres
1210 DATA 00,00,00,03,07,0F,3F,81
1220 DATA 00,00,00,C0,E0,F0,FC,81
1230 DATA 05,E7,E3,63,7F,7F,0F,0F
1240 DATA A0,E7,C7,C6,FE,FE,F0,F0
1250 DATA 0F,0F,0E,1C,38,38,38,78
1260 DATA F0,F0,70,38,1C,1C,1C,1E
1300 ' Tabela de cores
1310 DATA 00,00,00,10,10,10,10,91
1320 DATA 00,00,00,10,10,10,10,91
1330 DATA 91,91,91,A0,A0,A0,A0,A0
1340 DATA 91,91,91,A0,A0,A0,A0,A0
1350 DATA C0,C0,90,90,90,90,A0,A0
1360 DATA C0,C0,90,90,90,90,A0,A0
  Saída:

Mapa de caracteres Resultado final

  A animação mostra a jogadora comemorando um ponto, ora selecioando os dados da figura da esquerda, ora o da direita, desenhando no mesmo lugar da tela. Veja as figuras em detalhe:



  As linhas 100-170 são responsáveis pela animação, fazendo com que haja a alternância das figuras na tela, dando a impressão de animação. O restante do programa é responsável por desenhar as duas figuras da jogadora na tela. Como a figura é composta de 6 blocos, sendo 2 colunas e 3 linhas, é necessário alterar toda essa região em cada quadro da animação. A linha 150 controla a velocidade da animação.


  Considerações finais

  O conceito de mapeamento de caracteres visto aqui é bastante utilizando nos jogos do MSX 1, conforme foi estudado no jogo Alcatraz.
  As animações utilizando os mapas da screen 2 possuem a limitação de mover os objetos de 8 em 8 pixels em qualquer direção. Entretanto, o desenho de um objeto na tela é rápido, uma vez que não há necessidade de desenhar o objeto na tela pixel a pixel, uma vez que o objetivo é alcançado através do mapeamento de um bloco de 8x8 pixels.
  Com o advento do MSX 2, melhoras significativas surgiram nos novos modos de tela (screens 5-8):   Os novos modos de tela possuem uma área de rascunho no vídeo (que ficam ocultas), no qual é possível armazenar desenhos e copiá-los para a tela principal. Além disso, um bloco passa e ter qualquer tamanho e não mais 8x8 pixels, tornando qualquer desenho uma unidade e não mais uma composição de blocos (mosaico).


MARMSX/CURSOS/Basic