MSXInício
Capítulo 15Disponível

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 desenho padrao se parece (8 bytes, um por linha; um bit 1 = ponto aceso).
  • SPRITE n, x, y, padrao, cor — põe o sprite n (0–31) na posição (x, y), usando o desenho padrao com a cor indicada.
  • SPRITE n, 0, 209, 0, 0 — tira o sprite n da tela (veja a linha de fuga, no fim do capítulo).
  • SPRITECOLOR n, cor — troca só a cor do sprite n, sem mexer na posição.
  • COLLISION() — devolve TRUE quando 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 0 volta para 8×8.
  • SPRITEMAG 1 — cada ponto do sprite é desenhado em dobro (um 16×16 vira 32×32 na tela). SPRITEMAG 0 desliga.

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

  • SPRITECREATE define o desenho; SPRITE define qual desenho, onde e com que cor.
  • SPRITESIZE 1 liga os sprites 16×16; SPRITEMAG 1 amplia todos em dobro.
  • SPRITECOLOR troca a cor; METASPRITE monta 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.
Comunidade

Discussão · Sprites: o palco dos personagens

Curta, marque como lido e comente o que achou deste capítulo.

0 comentários
Entre para participar
Crie uma conta ou faça login para curtir, marcar como lido e comentar.

Carregando comentários…