Curso de Jogos em Basic
Adicionar elementos ao scroll
Você está em: MarMSX >> Cursos >> Jogos em Basic
Este capítulo extra é continuação do capítulo anterior sobre Scroll em Assembly. O objetivo agora é adicionar elementos à um cenário que rola na tela através de scroll.
Tiles x sprites
Podemos adicionar facilmente elementos a nosso rolamento da tela ou scroll. Entretanto, a escolha do tipo de elemento irá causar diferentes efeitos na tela.
Tiles
Entendemos no capítulo extra anterior que o rolamento da tela move toda a informação da tela em uma linha ou uma coluna. Assim, se adicionarmos qualquer caractere na tela, ele irá acompanhar o movimento. Dessa forma, concluímos que os elementos do tipo "tile" irão sempre se mover junto com a tela.
Vamos utilizar o exemplo de Copacabana do capítulo anterior nos exemplos desse capítulo.
Nossa primeira tarefa é inserir uma mensagem de inicio e fim no passeio por Copacabana. Para isso, iremos criar um contador de linhas que irá nos permitir identificar linhas. Uma vez identificada uma linha, podemos modificar a string dessa linha através do comando MID$. Por exemplo, quando atingirmos a linha 10 do scroll, inserimos a mensagem "PARTIDA" na parte da areia da praia. Assim, substituímos os caracteres de 10 a 16 da linha original por essa palavra.
Se contador_linha = 5 então
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ← "xxxxxxxxxxPARTIDAxxxxxxxxxxxxxx";
fim_então
O programa a seguir irá realizar o passeio por Copacabana inserindo uma faixa de PARTIDA e outra de CHEGADA. Ao atingir a chegada, andamos mais 15 linhas e a animação pára.
10 SCREEN 1 : WIDTH 32 : COLOR 15,0,0 : KEY OFF : DIM L$(4)
20 L$(1)="xyhhhhhhhhhhhhhhhhhhh`a`a`apppp"
30 L$(2)="xzhhhhhhhhhhhhhhhhhhhbcbcbcpppq"
40 L$(3)="xyhhhhhhhhhhhhhhhhhhhdededepppp"
50 L$(4)="xzhhhhhhhhhhhhhhhhhhhfgfgfgpppq"
60 LN=1
70 BLOAD"PAT.DAT",S
80 BLOAD"COL.DAT",S
90 BLOAD"SCROLLVD.BIN"
100 DEFUSR=&HC000
110 CL=0
120 A$=L$(LN)
130 IF CL=10 THEN MID$(A$,10,7)="PARTIDA"
140 IF CL=80 THEN MID$(A$,10,7)="CHEGADA"
150 X$=USR(A$)
160 LN=LN-1 : IF LN<1 THEN LN=4
170 FOR T=1 TO 50 : NEXT
180 CL=CL+1
190 IF CL=95 THEN GOTO 190
200 GOTO 120
A variável CL controla a linha do rolamento de tela total. A instrução MID$, quando à esquerda do igual, substitui parte dos caracteres de A$ começando em 10 e com o comprimento da mensagem igual a 7 em ambos os casos. Outra forma de inserir caracteres (tiles) é imprimir a mensagem após o scroll através dos comandos LOCATE X,Y : PRINT.
No jogo Slalom Gigante, as faixas de partida e chegada possuem duas linhas. Na primeira linha está a mensagem e na segunda os postes que a segura. Dessa forma, devemos verificar por duas linhas consecutivas e preencher cada uma com o seus respectivos tiles.
Veja o exemplo a seguir.
10 SCREEN 1 : WIDTH 32 : COLOR 15,0,0 : KEY OFF : DIM L$(4)
20 L$(1)="xyhhhhhhhhhhhhhhhhhhh`a`a`apppp"
30 L$(2)="xzhhhhhhhhhhhhhhhhhhhbcbcbcpppq"
40 L$(3)="xyhhhhhhhhhhhhhhhhhhhdededepppp"
50 L$(4)="xzhhhhhhhhhhhhhhhhhhhfgfgfgpppq"
60 LN=1
70 BLOAD"PAT.DAT",S
80 BLOAD"COL.DAT",S
90 BLOAD"SCROLLVD.BIN"
100 DEFUSR=&HC000
105 VPOKE &H2000+24,&H4A : VPOKE &H2000+25,&H4A
106 FOR I=8 TO 11:VPOKE &H2000+I,&H4F:NEXT I
110 CL=0
130 IF CL=10 THEN LOCATE 11,0: PRINT CHR$(&HC6);"hhhhh";CHR$(&HC9)
140 IF CL=11 THEN LOCATE 11,0: PRINT "PARTIDA"
150 X$=USR(L$(LN))
160 LN=LN-1 : IF LN<1 THEN LN=4
170 FOR T=1 TO 50 : NEXT
180 CL=CL+1
190 GOTO 130
Nas linhas 105 e 106 modificamos as cores de frente e fundo dos caracteres da faixa.
Nota: nesse programa não tem a faixa de chegada.
A ordem de inserção das linhas dos tiles depende do sentido do scroll. Se for para baixo, devemos inserir primeiro a segunda linha - inserção reversa. Já o scroll para cima, inserimos primeiro a primeira linha - inserção normal.
No jogo Slalom Gigante, somente o esquiador é feito com sprites. Todo o resto é feito com tiles, inclusive as balizas onde o esquiador deve passar. O mais interessante é que, quando o jogador acerta uma baliza, ela é derrubada. Para isso, ele faz um teste de colisão entre o sprite e um tile de baliza. Em caso de colisão, ele troca o tile da baliza de em pé (ASCII 97 ou 98) pela deitada (ASCII 112 ou 113).
Sprites
Os sprites são elementos à parte na tela. Assim, eles não são afetados pelo scroll e ficam sempre parados no mesmo lugar, a menos que o façamos se mover.
Veja o exemplo a seguir. Movimente a nave para a esquerda ou direita com os cursores.
10 SCREEN 1,2 : WIDTH 32 : COLOR 15,0,0 : KEY OFF : DIM L$(4)
20 L$(1)="xyhhhhhhhhhhhhhhhhhhh`a`a`apppp"
30 L$(2)="xzhhhhhhhhhhhhhhhhhhhbcbcbcpppq"
40 L$(3)="xyhhhhhhhhhhhhhhhhhhhdededepppp"
50 L$(4)="xzhhhhhhhhhhhhhhhhhhhfgfgfgpppq"
60 LN=1
70 BLOAD"PAT.DAT",S
80 BLOAD"COL.DAT",S
90 BLOAD"SCROLLVD.BIN"
100 DEFUSR=&HC000
110 FOR S=0 TO 1:FOR X=1 TO 32:READ A$:S$=S$+CHR$(VAL("&H"+A$)):NEXT X
120 SPRITE$(S)=S$:S$="":NEXT S:X=128
130 PUT SPRITE 0,(X,95),4,0:PUT SPRITE 1,(X,95),15,1
140 X$=USR(L$(LN))
145 A=STICK(0)
146 IF A=3 THEN X=X+8 : IF X>248 THEN X=248
147 IF A=7 THEN X=X-8 : IF X<8 THEN X=8
150 LN=LN-1 : IF LN<1 THEN LN=4
170 CL=CL+1
180 GOTO 130
500 ' Sprites
510 DATA 03,04,04,04,04,04,04,05,09,09,48,B0,86,8A,BB,44
520 DATA 80,40,40,40,40,40,40,40,20,20,24,1A,C2,A2,BA,44
530 DATA 00,03,03,03,03,03,03,02,06,06,07,4F,79,75,44,00
540 DATA 00,80,80,80,80,80,80,80,C0,C0,C0,E4,3C,5C,44,00
Nota importante: removemos a linha 160 dos exemplos que controlam a velocidade do scroll por deixar o movimento da nave lento. Assim, podemos substituir aquele controle de velocidade por um contador, onde atualizamos o scroll através de N loops, da seguinte forma:
IF CONTADOR MOD N THEN X$=USR$(L$(LN))
Entretanto, conforme inserimos códigos de controle no loop principal, o scroll fica mais lento. Dessa forma, esse controle de velocidade pode se tornar desnecessário.
Sprites + Tiles
Agora, vamos unir as duas coisas e deixar o rastro da nave na areia. Veja o exemplo a seguir.
10 SCREEN 1,2 : WIDTH 32 : COLOR 15,0,0 : KEY OFF : DIM L$(4)
20 L$(1)="xyhhhhhhhhhhhhhhhhhhh`a`a`apppp"
30 L$(2)="xzhhhhhhhhhhhhhhhhhhhbcbcbcpppq"
40 L$(3)="xyhhhhhhhhhhhhhhhhhhhdededepppp"
50 L$(4)="xzhhhhhhhhhhhhhhhhhhhfgfgfgpppq"
60 LN=1
70 BLOAD"PAT.DAT",S
80 BLOAD"COL.DAT",S
90 BLOAD"SCROLLVD.BIN"
100 DEFUSR=&HC000
105 VPOKE &H2000+24,&HBA : VPOKE &H2000+25,&HBA
110 FOR S=0 TO 1:FOR X=1 TO 32:READ A$:S$=S$+CHR$(VAL("&H"+A$)):NEXT X
120 SPRITE$(S)=S$:S$="":NEXT S:X=128
130 PUT SPRITE 0,(X,95),4,0:PUT SPRITE 1,(X,95),15,1
140 X$=USR(L$(LN))
145 A=STICK(0)
146 IF A=3 THEN X=X+8 : IF X>248 THEN X=248
147 IF A=7 THEN X=X-8 : IF X<8 THEN X=8
150 LN=LN-1 : IF LN<1 THEN LN=4
160 C=X\8: IF X>8 AND X<160 THEN LOCATE C,13:PRINT CHR$(&HC6)+CHR$(&HC9)
170 CL=CL+1
180 GOTO 130
500 ' Sprites
510 DATA 03,04,04,04,04,04,04,05,09,09,48,B0,86,8A,BB,44
520 DATA 80,40,40,40,40,40,40,40,20,20,24,1A,C2,A2,BA,44
530 DATA 00,03,03,03,03,03,03,02,06,06,07,4F,79,75,44,00
540 DATA 00,80,80,80,80,80,80,80,C0,C0,C0,E4,3C,5C,44,00