Curso de Basic
Scroll
Você está em: MarMSX >> Cursos >> BASIC
O scroll é o efeito de deslizar um cenário ou objeto em qualquer direção em uma tela gráfica. Esse recurso é muito utilizado em jogos, como por exemplo Aleste e Space Manbow para MSX 2.
A movimentação da tela pode ser feita de duas maneiras: uma via software e outra via hardware.
A movimentação de tela via software é feita pelo programador, onde os pixels do cenário deverão ser copiados de uma posição para outra, a cada iteração. Já no scroll via hardware, o próprio chip de vídeo se encarrega de mover toda a tela e é bem mais rápido do que o scroll via software, uma vez que não envolve a cópia de um bloco enorme de pixels.
Quando movemos o cenário ou um objeto para qualquer direção, ele deixa um "buraco" na coluna ou linha que ficou para trás, conforme pode ser visto na ilustração abaixo. Então, esse buraco deverá ser preenchido com uma nova informação, que é a próxima coluna ou linha do cenário.
Scroll no MSX 1
O processador de vídeo do MSX 1 não possui scroll via hardware. Devido a sua estrutura, a movimentação da tela usual é utilizando blocos (tiles) de 8x8 pixels, apesar de ser possível realizar o scroll fino de 1 pixel utilizando alguns truques.
O exemplo a seguir desloca uma linha da screen 0 utilizando a cópia de blocos de 8x8 pixels.
10 SCREEN 0:WIDTH 40
20 LOCATE 2,9:PRINT"Esta frase se deslocara ..."
30 FOR I=0 TO 39
50 EY=40*9 : ' Endereço inicial da linha
60 FOR X=1 TO 39
70 E=X+EY
80 VPOKE E-1,VPEEK(E)
90 NEXT X,I
Realizar scroll para o MSX 1 em Basic é muito lento. Assim, o ideal é utilizar rotinas em Assembly para se atingir tal fim.
Devido a essa arquitetura de blocos das telas do MSX 1, a quantidade de dados a ser movida é bem menor do que seria se fosse pixel a pixel (768 versus 49152 bytes)[1]. Assim, o deslocamento de telas no MSX é realizado em tempo satisfatório.
Na screen 2, o scroll também utiliza a tabela de nomes para deslocar os objetos. Veja o exemplo a seguir.
10 SCREEN 2
20 CIRCLE(128,96),8,15
30 CIRCLE(128,96),4,15
40 BY=11:EY=BY*32+6144
50 FOR BX=15 TO 0 STEP -1
60 EI=EY+BX
70 FOR I=0 TO 2
80 FOR J=0 TO 3
90 E=EI+J+I*32
100 VPOKE E-1,VPEEK(E)
110 NEXT J,I,BX
Assim como na screen 1, o movimento é lento. Feito em Assembly, os blocos movem todos juntos.
No curso de Jogos em Basic, há um tutorial de como criar o scroll em Assembly para a screen 1. Esse scroll move toda a tela instantaneamente.
Scroll no MSX 2
O MSX 2 possui scroll vertical via hardware, onde é acessado através do registrador #23.
Entretanto, vamos ver primeiro como fazer o scroll de uma tela via software no MSX 2.
10 SCREEN 5
20 CIRCLE(128,105),50,15
30 PAINT(128,95),12,15
40 ' Inicia scroll
50 FOR X=0 TO 211
60 COPY(0,1)-(255,211),0 TO (0,0),0
70 NEXT
Esse programa faz um scroll vertical do cenário para cima, deslizando o recorte de (0,1) a (255,211) um pixel acima a cada iteração, através da cópia de pixels.
Ao executar o programa, o leitor irá perceber que o processo é bem lento.
Conforme dito anteriormente, o scroll vertical via hardware é feito através do registrador #23. Ele pode ser alterado em Basic através da instrução VDP(24).
Veja o exemplo a seguir, que faz um scroll vertical via hardware.
10 SCREEN 5
20 CIRCLE(128,105),50,15
30 PAINT(128,95),12,15
40 ' Inicia scroll
50 FOR X=0 TO 211
60 VDP(24)=X
70 NEXT
Compare a velocidade desse scroll com o scroll via software. O scroll via hardware é muito rápido, mesmo em Basic.
Quando movemos a tela na vertical, há uma área "suja" entre as linhas 212 e 255, que são os dados dos sprites [2]. Sim, o scroll via hardware acessa as linhas de 212 a 255, que estão ocultas na exibição de tela normal.
A solução para o problema é executar a sub-rotina da BIOS que limpa todos os sprites (CLRSPR - &H69) e também limpar essa área através do comando COPY [2]. Observa-se que as instruções gráficas como LINE não acessam essa área.
Reescrevendo o programa anterior, temos:
10 SCREEN 5
15 DEFUSR=&H69:X=USR(0)
16 COPY(0,0)-(255,44),0 TO (0,212),0 ' Limpa area
20 CIRCLE(128,105),50,15
30 PAINT(128,95),12,15
40 ' Inicia scroll
50 FOR X=0 TO 255
60 VDP(24)=X
70 NEXT
80 GOTO 50
Agora a "sujeira" foi removida da tela. Além disso, o scroll foi modificado para ser eterno.
Veremos agora como fazer a composição das novas partes do cenário, para que se dê a impressão que estamos nos movendo sobre uma superfície.
Quando o scroll é via software, o sistema de coordenadas é preservado e as partes novas são colocadas sempre na mesma posição. Entretanto, quando é utilizado o scroll via hardware, o sistemas de coordenadas também é deslocado. Veja a ilustração a seguir, que faz um scroll horizontal para a esquerda tanto via software, como via hardware.
No scroll via software, a cada iteração o buraco está sempre na mesma coluna (7). No scroll via hardware, o buraco esta em uma posição diferente a cada iteração (0, 1, ...).
No exemplo a seguir, vamos criar um cenário com linhas horizontais coloridas.
10 SCREEN 5:DEFINT A-Z
20 DEFUSR=&H69:X=USR(0)
30 COPY(0,0)-(255,44),0 TO (0,212),0
40 SET PAGE 0,1
50 FOR C=2 TO 15
60 LINE(0,C-2)-(255,C-2),C
70 NEXT
80 SET PAGE 0,0
90 FOR Y=0 TO 128 STEP 13
100 COPY(0,0)-(255,13),1 TO (0,Y),0
110 NEXT
120 ' Inicia scroll
130 C=0:YP=129
140 FOR Y=0 TO 43
150 VDP(24)=Y
160 COPY(0,C-2)-(255,C-2),1 TO (0,YP),0
170 C=C+1 : IF C>13 THEN C=0
180 YP=YP+1: IF YP>211 THEN YP=0
190 NEXT
Obs: não podemos acessar a zona gráfica entre as linhas 212 a 255 através das instruções de desenho do MSX. Assim, o acesso a essa região somente pode ser feito através do comando COPY (vide linha 30) ou VPOKE. Dessa forma, teremos que utilizar o mecanismo de tiles (ou blocos) para compor o cenário nessa região.
Scroll no MSX 2+
O MSX 2+ possui tanto o scroll vertical, como o horizontal via hardware. Ele pode ser feito através da instrução em Basic SET SCROLL.
Sintaxe:
SET SCROLL X, Y, mascara, paginas
Este scroll funciona de forma semelhante ao scroll vertical do MSX 2, onde X e Y definem o deslocamento da tela.
Exemplo de deslocamento em diagonal.
10 SCREEN 5
15 DEFUSR=&H69:X=USR(0)
16 COPY(0,0)-(255,211),0 TO (0,212),0
20 CIRCLE(128,105),50,15
30 PAINT(128,95),12,15
40 ' Inicia scroll
50 FOR X=0 TO 255
60 SET SCROLL X,X
70 NEXT
80 GOTO 50
A opção "mascara", se for igual a 1, esconde a borda da lateral esquerda da tela, de modo a evitar o flicking nessa região. Observe no exemplo anterior, quando o círculo passar sobre essa região.
A opção "paginas", se for igual a 1, permite utilizar duas páginas de vídeo consecutivas para fazer o scroll (somente horizontal). Entretanto, a página visível deverá ser IMPAR. Veja o exemplo a seguir.
10 SCREEN 5
20 CIRCLE(128,105),50,15
30 PAINT(128,95),12,15
40 SET PAGE 0,1
50 CLS
60 LINE(80,80)-(150,140),9,BF
70 LINE(80,80)-(150,140),15,B
80 SET PAGE 1,0
90 ' Inicia scroll
100 FOR X=0 TO 255
110 SET SCROLL X,0,1,1
120 NEXT
Um círculo é desenhado na página 0, enquanto um retângulo é desenhado na página 1.
Referências:
[1] - MSX Assembly Page, em http://map.grauw.nl/articles/scrolling.php
[2] - Vertical Scroll (in Basic), em https://www.msx.org/forum/development/msx-development/vertical-scroll-basic.