Curso de Jogos em Basic
Criação dos personagens
Você está em: MarMSX >> Cursos >> Jogos em Basic
No capítulo anterior, vimos a parte estática do jogo que é o cenário. Agora, veremos a parte móvel que são os personagens e objetos do jogo.
Os objetos que se movem na tela podem ser desenhados de duas formas no MSX 1. A primeira é utilizando o recurso de sprites, onde possuímos plena liberdade de movimentação, bem como o fato de seu deslocamento não afetar os objeto no fundo da tela. A outra opção é utilizar tiles para representar os personagens e objetos.
3.1. Sprites
Os sprites funcionam como uma máscara na tela, onde objetos passeiam livremente nela, com scroll fino de até 1 pixel por movimento. No MSX 1, é possível definir até 256 padrões para sprites no modo 8x8 e 64 padrões para o modo 16x16. Na tela, podemos utilizar até 32 sprites ao mesmo tempo e somente 4 sprites por linha.
✓ O sprite permite o deslocamento livre na tela do MSX, sem alterar o conteúdo da tela por trás dele e nem de outros sprites. Além disso, há um recurso automático de detecção de colisão entre sprites, extremamente útil para o tratamento desse tipo de evento, por exemplo, quando o herói é atingido. Outro aspecto importante é que quando os sprites já estão na memória, a troca de um padrão de sprite para outro é muito rápida.
✗ No MSX 1 podemos ter somente uma cor por sprite. Outro ponto negativo é que não podemos ter mais do que quatro sprites por linha, de modo que o quinto sprite desaparece.
Exemplos de jogos em Basic que utilizam sprites:
A criação de sprites no MSX pode ser bem simples, se utilizarmos um editor de sprites. De outra forma, o desenvolvedor terá um certo trabalho para converter seu desenho em código de sprite. Por exemplo, terá o trabalho de converter valores binários para hexadecimal (pois poupa espaço do código) ou montar os sprites 16x16.
Exemplo de como se criar um sprite em Basic.
10 SCREEN 2
20 FOR I=1 TO 8
30 READ A$
40 S$=S$+CHR$(VAL("&B"+A$))
50 NEXT I
60 SPRITE$(0)=S$
70 PUT SPRITE 0,(128,95),15,0
80 GOTO 80
100 DATA 00111100
110 DATA 01111110
120 DATA 11111111
130 DATA 11111111
140 DATA 11111111
150 DATA 11111111
160 DATA 01111110
170 DATA 00111100
Se substituirmos os valores binários por hexadecimal, poupamos memória usada pelo código.
40 S$=S$+CHR$(VAL("&H"+A$))
...
100 DATA 3C,7E,FF,FF,FF,FF,7E,3C
No capítulo 12 do curso de Basic e no artigo sprites e gravidade, há mais detalhes de como criar sprites no MSX.
Conforme mencionado anteriormente, podemos ter 256 ou 64 diferentes desenhos para personagens e objetos. Além disso, uma vez desenhados, a troca entre desenhos pelo comando PUT SPRITE é imediata. Assim, podemos criar animação dos personagens e objetos.
Não é possível utilizar sprites no modo 8x8 e 16x16 ao mesmo tempo. Assim, devemos escolher um modo e trabalhar com ele. Entretanto, nada nos impede de trabalhar com o modo 16x16 para desenhar objetos maiores e utilizar apenas um quarto do espaço, ou seja, um bloco de 8x8 para os objetos menores. Os mecanismos de detecção de colisão se baseiam nos pixels acesos do sprite, ignorando os demais.
Uma ótima ferramenta Web para edição de sprites é o "Tiny Sprite" [1]. Com ele, podemos criar uma animação de uma bola crescendo utilizando 8 sprites de 16x16.
Observe no programa a seguir, a altíssima velocidade em que os sprites são trocados.
10 SCREEN 2,2
20 FOR I=0 TO 7 : S$="" : FOR J=1 TO 32
30 READ A$ : S$=S$+CHR$(VAL("&H"+A$))
40 NEXT J : SPRITE$(I)=S$ : NEXT I
50 FOR I=0 TO 7 STEP 1: PUT SPRITE 0,(128,95),15,I : NEXT I
60 FOR I=7 TO 0 STEP -1 : PUT SPRITE 0,(128,95),15,I : NEXT I
70 GOTO 50
100 DATA 00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,00
110 DATA 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
120 DATA 00,00,00,00,00,00,01,03,01,00,00,00,00,00,00,00
130 DATA 00,00,00,00,00,00,00,80,00,00,00,00,00,00,00,00
140 DATA 00,00,00,00,00,00,03,03,03,00,00,00,00,00,00,00
150 DATA 00,00,00,00,00,00,80,80,80,00,00,00,00,00,00,00
160 DATA 00,00,00,00,00,01,03,07,03,01,00,00,00,00,00,00
170 DATA 00,00,00,00,00,00,80,C0,80,00,00,00,00,00,00,00
180 DATA 00,00,00,00,03,07,0F,0F,0F,07,03,00,00,00,00,00
190 DATA 00,00,00,00,80,C0,E0,E0,E0,C0,80,00,00,00,00,00
200 DATA 00,00,00,03,07,0F,1F,1F,1F,0F,07,03,00,00,00,00
210 DATA 00,00,00,80,C0,E0,F0,F0,F0,E0,C0,80,00,00,00,00
220 DATA 00,00,00,07,0F,1F,3F,3F,3F,3F,1F,0F,07,00,00,00
230 DATA 00,00,00,80,C0,E0,F0,F0,F0,F0,E0,C0,80,00,00,00
240 DATA 00,07,0F,1F,3F,7F,7F,7F,7F,7F,3F,1F,0F,07,00,00
250 DATA 00,80,C0,E0,F0,F8,F8,F8,F8,F8,F0,E0,C0,80,00,00
É muito rápida a animação! Troquemos então as linhas 50 e 60 por essas.
50 FOR I=0 TO 7 STEP .2: PUT SPRITE 0,(128,95),15,I : NEXT I
60 FOR I=7 TO 0 STEP -.2 : PUT SPRITE 0,(128,95),15,I : NEXT I
Agora dá para perceber melhor a animação.
A troca do desenho do sprite é feita pela variável I presente no comando PUT SPRITE, nas linhas 50 e 60.
Visto o exemplo anterior, não há desculpas para deixar de criar várias animações para seu personagem, como o caminhar, virada de rosto etc. Por exemplo, no jogo Lock-in Man da revista MSX Club Magazine #4, adicionei o rosto do personagem virado para o lado direito, pois só havia o rosto dele em uma posição.
3.2. Tiles
Personagens e objetos do jogo podem ser desenhados utilizando-se tiles. Por exemplo, o jogo Alcatraz utiliza um tile representar o personagem principal na tela.
✓ Na screen 2, os tiles podem ter até 2 cores por linha, criando personagens e objetos multicoloridos. Além disso, a troca de tiles também é bem rápida mesmo em Basic, pois basta alterar um valor na tabela de nomes.
✗ Diferente dos sprites, os tiles sobrepõem todos os pixels de fundo da imagem. Apesar de ser possível criar uma máscara para dizer ao MSX quais pixels do tile desenhar ou não, esse processo deve ser feito manualmente no MSX 1 (no MSX 2 usa-se o operador TPSET). Entretanto, o processo é complexo e possui baixa performance no Basic. Para evitar ter de combinar o tile com o fundo, os autores dos jogos adotam um fundo "liso" para os objetos se moverem, como é o caso do jogo Alcatraz.
Exemplos de jogos em Basic/Assembly que utilizam tiles:
Quando movimentamos um personagem para uma nova posição, devemos recuperar o tile original de sua posição atual. De outra forma, ficaria o rastro do personagem na tela.
O programa a seguir permite que o personagem principal de Alcatraz se mova pela tela através das teclas do cursor.
10 SCREEN 2
20 T=1:VPOKE 6144+T,0:VPOKE 6400+T,0:VPOKE 6656+T,0
30 FOR I=0 TO 7:READ A$:A=VAL("&H"+A$)
40 VPOKE 8*T+I,A:VPOKE 2048+8*T+I,A:VPOKE 4096+8*T+I,A
50 NEXT I
60 FOR I=0 TO 7:READ A$:A=VAL("&H"+A$)
70 VPOKE 8192+8*T+I,A:VPOKE 10240+8*T+I,A:VPOKE 12288+8*T+I,A
80 NEXT I
90 X=20:Y=10 : ' Coordenadas
100 ' Loop principal
110 VPOKE 6144+X+(Y*32),1
120 C=STICK(0)
130 IF C=1 THEN GOSUB 200 : Y=Y-1 : IF Y<0 THEN Y=0
140 IF C=3 THEN GOSUB 200 : X=X+1 : IF X>31 THEN X=31
150 IF C=5 THEN GOSUB 200 : Y=Y+1 : IF Y>23 THEN Y=23
160 IF C=7 THEN GOSUB 200 : X=X-1 : IF X<0 THEN X=0
170 GOTO 110
200 VPOKE 6144+X+(Y*32),0 : RETURN
300 DATA 18,18,3C,5A,99,18,24,24
310 DATA F0,60,10,F0,10,F0,10,F0
Para ficar mais realista, podemos modificar o tile de acordo com a tecla pressionada. Mas esse assunto fica para o próximo capítulo.
Referências:
1. Tiny Sprite - http://msx.jannone.org/tinysprite/tinysprite.html