Sprites: o palco dos personagens
Tiles pintam o cenário. Sprites são os atores que se movem por cima dele — o herói, os inimigos, o tiro que acabou de sair.
1. O que é um sprite, afinal?
Imagine que o cenário do seu jogo é um quadro pregado na parede. Se você quisesse animar o herói pintando e repintando o quadro inteiro a cada passo, o MSX ficaria ofegante. A solução do hardware é elegante: o VDP mantém uma camada separada com até 32 pequenas figuras — os sprites — que podem ser desenhadas em qualquer posição da tela sem tocar no cenário. Mover um sprite custa dois bytes; redesenhar o cenário custaria centenas.
No MSX 1 cada sprite tem tamanho 8×8 ou 16×16 e uma única cor. Parece pouco, mas foi com isso que os clássicos foram feitos.
2. Os comandos que você vai usar sempre
SPRITECREATE padrao, b1, b2, ... b8— define como o desenhopadraose parece (8 bytes, um por linha; um bit 1 = ponto aceso).SPRITE n, x, y, padrao, cor— põe o spriten(0–31) na posição (x, y), usando o desenhopadraocom a cor indicada.SPRITE n, 0, 209, 0, 0— tira o spritenda tela (veja a linha de fuga, no fim do capítulo).SPRITECOLOR n, cor— troca só a cor do spriten, sem mexer na posição.COLLISION()— devolveTRUEquando quaisquer dois sprites se tocaram no último quadro.
Lembre do USES SPRITES no topo do programa.
DIGITE E VEJA
Programa 15.1 — Um quadradinho que anda
USES SCREEN 2, SPRITES, KEYBOARD
SCREEN 2 : CLS
' Desenho 0: um quadrado sólido 8x8
SPRITECREATE 0, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DIM x AS BYTE = 100
DIM y AS BYTE = 90
WHILE STRIG(0) = 0
IF STICK(0) = 3 THEN x = x + 1
IF STICK(0) = 7 THEN x = x - 1
IF STICK(0) = 1 THEN y = y - 1
IF STICK(0) = 5 THEN y = y + 1
SPRITE 0, x, y, 0, 15
WAIT
WEND
TELA ESPERADA
Um quadrado branco 8×8
Ele se move pelas quatro direções conforme você aperta as setas. Pressione espaço para sair.
3. Sprites 16×16 e ampliação: SPRITESIZE e SPRITEMAG
SPRITESIZE 1— todos os sprites passam a ter 16×16 pontos.SPRITESIZE 0volta para 8×8.SPRITEMAG 1— cada ponto do sprite é desenhado em dobro (um 16×16 vira 32×32 na tela).SPRITEMAG 0desliga.
Um sprite 16×16 usa quatro desenhos seguidos de 8×8, na ordem: superior esquerdo, inferior esquerdo, superior direito, inferior direito. Por isso o número do desenho, no SPRITE, vai de 4 em 4 (0, 4, 8...).
USES SCREEN 2, SPRITES
SCREEN 2 : CLS
SPRITESIZE 1
' desenhos 4, 5, 6 e 7 formam um losango 16x16
SPRITECREATE 4, $01,$03,$07,$0F,$1F,$3F,$7F,$FF
SPRITECREATE 5, $FF,$7F,$3F,$1F,$0F,$07,$03,$01
SPRITECREATE 6, $80,$C0,$E0,$F0,$F8,$FC,$FE,$FF
SPRITECREATE 7, $FF,$FE,$FC,$F8,$F0,$E0,$C0,$80
SPRITE 1, 100, 90, 4, 8
WHILE 1
WAIT
WEND
DICA
Sombras e halos
Você pode empilhar dois sprites na mesma posição — um com a silhueta preta deslocada 1 ponto e outro com o desenho colorido por cima — para simular contorno. É como faziam Nemesis e Salamander.
METASPRITE — um personagem de 32×32
METASPRITE n, x, y, padrao, cor junta quatro sprites 16×16 num bloco 32×32. Ele usa os sprites n a n+3 e os desenhos padrao, padrao+4, padrao+8 e padrao+12, colocados em (x, y), (x+16, y), (x, y+16) e (x+16, y+16). Use com SPRITESIZE 1.
4. Detecção de colisão
O VDP marca um aviso quando quaisquer dois sprites se sobrepõem num ponto aceso. COLLISION() lê esse aviso: devolve TRUE se houve toque no último quadro. Ele não diz quais sprites se tocaram. Quando isso importa, compare as posições você mesmo (por exemplo, IF x1 + 8 > x2 AND x2 + 8 > x1 THEN ..., e o mesmo para y).
DIGITE E VEJA
Programa 15.2 — Nave contra asteroide
USES SCREEN 2, SPRITES, KEYBOARD, BPRINT
SCREEN 2 : CLS
SPRITECREATE 0, $18,$3C,$7E,$FF,$FF,$7E,$3C,$18 ' nave
SPRITECREATE 1, $3C,$7E,$FF,$FF,$FF,$FF,$7E,$3C ' asteroide
DIM nx AS BYTE = 20
DIM ax AS BYTE = 200
WHILE COLLISION() = 0
IF STICK(0) = 3 THEN nx = nx + 2
ax = ax - 1
SPRITE 0, nx, 90, 0, 15
SPRITE 1, ax, 90, 1, 8
WAIT
WEND
' PRINT nao escreve no SCREEN 2; nos modos graficos use BPRINT
BPRINT 13, 8, "BOOM!", 8
WHILE 1
WAIT
WEND
ATENÇÃO
Coordenada Y = 209
No MSX, mandar um sprite para Y = 209 ($D1) esconde todos os sprites de número maior. Use isso para dispensar rapidamente enxames de projéteis, mas cuidado: se o herói for o sprite 0 e você jogar o inimigo 1 para Y=209, tudo desaparece a partir dali.
5. Resumo do capítulo
SPRITECREATEdefine o desenho;SPRITEdefine qual desenho, onde e com que cor.SPRITESIZE 1liga os sprites 16×16;SPRITEMAG 1amplia todos em dobro.SPRITECOLORtroca a cor;METASPRITEmonta um bloco 32×32 com quatro sprites.- Sprites vivem em uma camada própria; mover um não afeta o cenário.
- Até 32 sprites simultâneos; 4 por linha no MSX 1 (8 no MSX 2) antes de começarem a piscar.
COLLISION()avisa que houve um toque, mas não diz entre quais sprites.- Y = 209 é a "linha de fuga": a partir dele, os sprites de número maior somem.