Obrigado a Julio Marchi pelo espaço cedido na MSX All
 

Curso de Jogos


 
Guie o Balão - MSX 2

English


Comentários sobre as mudanças
  Inicializações gerais e variáveis do jogo

10 MAXFILES=2:OPEN"GRP:"AS#1:N$="M S X":KEYOFF:GOSUB2100
15 SCREEN0:WIDTH40:COLOR1,15,15:PLAY"V15O2G#F#BO3C#GD#C#F#D#O2BC#C#F#":Q=0:GOSUB1300
20 LI=5:S=1:CLS:SC=0:DR=0
30 SCREEN 5,0
  A declaração "MAXFILES=2" é necessária para usar o comando OPEN #2 para abrir o arquivo de recordes, uma vez que o #1 está sendo usado para escrever no modo gráfico.
  A linha 10 é executada apenas uma vez no programa. Assim, aproveitamos para chamar no inicio da execução a sub-rotina que lê os recordes do arquivo (GOSUB 2100) e armazena os dados em dois vetores.
2100 ' Le recordes do arquivo
2110 OPEN"balao.dat"FOR INPUT AS #2
2120 DIM HI(5) : DIM NO$(5)
2130 FOR I=1 TO 5
2140 INPUT #2, NO$(I)
2150 INPUT #2, A$: HI(I)=VAL(A$)
2160 NEXT
2170 CLOSE 2
  A linha 15 foi introduzida, de forma que ao término do jogo fosse possível retornar ao menu principal.
  A variável DR é utilizada como flag para indicar se a tela atual já foi desenhada na página 1.
  O modo de tela passa a ser screen 5, que possui significantes melhorias em relação à screen 2.


  Desenho do balão

40 RESTORE:A$="":FORF=0TO7:READD$:A$=A$+CHR$(VAL("&B"+D$)):NEXTF:SPRITE$(0)=A$
45 COLOR SPRITE$(0)=CHR$(4)+CHR$(5)+CHR$(4)+CHR$(5)+CHR$(14)+CHR$(14)+CHR$(4)+CHR$(4)
50  DATA 00011000
60  DATA 00111100
70  DATA 01111110
80  DATA 01111110
90  DATA 00100100
100 DATA 00100100
110 DATA 00111100
120 DATA 00111100
  A linha 45 cria um padrão de cores para cada linha do sprite (sprite modo 2). Cada valor dentro da instrução CHR$(n) corresponde ao código da cor de uma linha.
  O balão foi alargado um pouco.


  Sub-rotinas para desenho das telas

130 ' ** TELA **
140 TIME=0:CLS
144 PUT SPRITE0,(256,212)
145 IF DR=1 THEN 185 ELSE IF S=5 THEN 170
146 CLS:LINE(95,85)-(153,103),4,BF:LINE(95,85)-(153,103),6,B
147 COLOR15,4:PRESET(100,90):PRINT#1,USING"Tela #";S:COLOR1,15
150 SET PAGE 0,1:CLS
160 GOSUB1910
170 ONSGOSUB380,530,680,830,1140
180 DRAW"BM230,11C1R10D10L10U10F10L10E10"
185 SET PAGE 0,0:GOSUB 2000
190 COLOR15,6:PSET(10,2):PRINT#1,"VIDAS=";LI:PSET(10,182):
PRINT#1,"PONTOS=";SC:COLOR,15:DR=1:GOSUB 2050
  A linha 144 esconde o balão enquanto a tela é desenhada.
  Se a tela atual já foi desenhada na pagina 1, apenas copia da tela 1 para 0 (pula para a linha 185). Senão, apaga a página 0 e escreve uma mensagem "Tela n" para o jogador, enquanto a tela está sendo desenhada em "background" na página 1.
  O comando SET PAGE 0,1 indica que a página visível é a zero e que a página de uso (ou desenho) é a página 1.
  Quando termina o desenho, chama a sub-rotina de copia de tela em 2000.
2000 ' Animacao de entrada da tela
2010 FOR Y1=0 TO 7:FOR Y2=0 TO 211 STEP 8
2020 COPY(0,Y1+Y2)-(255,Y1+Y2),1 TO (0,Y1+Y2),0
2030 NEXT Y2,Y1
2040 RETURN


  Mudanças nas sub-rotinas de tela

  O fundo do cenário foi modificado para azul em todas as telas.
  Primeiro, a área útil da tela é delimitada. Depois, pinta-se de azul 7 a tela, com restrição de limite a cor vermelha 6.
LINE(10,10)-(240,180),6,B:PAINT(15,175),7,6
  Na tela 1, foi introduzida uma linha na parte de baixo do obstáculo, de forma que ele se tornasse um polígono fechado e pudesse ser pintado.
  Em vez de pintar os obstáculos de cada tela por dentro, foi criado um retângulo preenchido na cor desejada na área em que esses objetos serão desenhados. Assim, quando a tela for pintada de azul, somente o cenário será pintado menos o interior dos objetos, uma vez que são polígonos fechados.

 
  As coordenadas iniciais do balão foram retiradas das sub-rotinas de desenho da tela e colocadas em uma sub-rotina em separado.
2050 ' Define coordenadas iniciais do balao
2060 IF S=1 THEN X=150:Y=130:RETURN
2070 IF S=2 THEN X=220:Y=160:RETURN
2080 IF S=3 THEN X=15:Y=150:RETURN
2090 IF S=4 THEN X=200:Y=160:RETURN
2095 RETURN


  Loop principal

200 ' ** LOOP PRINCIPAL **
210 ST=STICK(Q):IFST=0THEN250
220 IFST=1THENY=Y-1:GOTO 260
225 IFST=2THENY=Y-1:X=X+1:GOTO 260
230 IFST=3THENX=X+1:GOTO 260
240 IFST=7THENX=X-1:GOTO 260
245 IFST=8THENY=Y-1:X=X-1:GOTO 260
250 Y=Y+1
260 PUTSPRITE0,(X,Y)
270 IFPOINT(X,Y)=6THENGOTO 330
280 IFPOINT(X,Y)=1THENGOTO 360
290 X%=X+7:Y%=Y+8
300 IFPOINT(X%,Y%)=6THENGOTO 330
310 IFPOINT(X%,Y%)=1THENGOTO 360
320 GOTO210
  Foram introduzidos dois novos movimentos: diagonal esquerda e direita para cima.

  Sub-rotina de falha:
330 LI=LI-1
340 PLAY"O4L5CCCD#DDCCCC"
344 FOR F=1 TO 5
345 FOR C=1 TO 7 STEP .5:COLOR=(7,C,0,0):NEXT C
346 FOR C=7 TO 1 STEP -.5:COLOR=(7,C,0,0):NEXT C,F
350 COLOR=NEW:IF LI<1 THEN 1710 ELSE 130
  Quando o balão bate, o fundo azul é substituído por um efeito de paleta de cores, que varia o vermelho de escuro para claro e claro para escuro.

  Sub-rotina de tela completada:
360 IFTIME<7200THENSC=SC+INT((7200-TIME)/5)
370 PLAY"O6DB":S=S+1:DR=0:GOTO130
  Agora, a pontuação é baseada no tempo de dois minutos em vez de 30 segundos.


  Tela inicial

1300 COLOR1:CLS
1310 PRINT"GUIE O BALAO - MSX 2":PRINT
1320 PRINT"Pressione:":PRINT
1330 PRINT"D - para ver telas do jogo"
1340 PRINT"C - para comecar"
1350 PRINT"J - para joystick"
1360 PRINT"I - para instrucoes"
1370 PRINT"R - para ver os recordes"
1410 A$=INKEY$:IFA$=""THEN1410
1420 IFA$="C"ORA$="c"THENRETURN
1430 IFA$="J"ORA$="j"THENQ=1
1440 IFA$="I"ORA$="i"THEN1470
1450 IFA$="D"ORA$="d"THEN1960
1455 IFA$="R"ORA$="r"THENGOSUB2210:GOTO1300
1460 GOTO1410
  Mudanças: todo o menu na tela, aceita letras minúsculas e opção do ranking (letra D).

  Sub-rotina que imprime os 5 melhores placares:
2200 ' Imprime recordes
2210 SCREEN 0:COLOR1,15,15
2220 PRINT"Recordes:":PRINT
2230 FOR I=1 TO 5
2240 PRINT I;"- ";NO$(I);
2250 LOCATE 15 : PRINT HI(I)
2260 NEXT
2270 PRINT:PRINT"Tecle algo ...":A$=INPUT$(1)
2280 RETURN


  Instruções

1470 CLS
1480 PRINT"        GUIE O BALAO"
1490 PRINT
1500 PRINT"  Seu balao esta furado e voce precisa"
1510 PRINT"viajar atraves de quatro telas de"
1520 PRINT"suspense para continuar no ar."
1530 PRINT
1540 PRINT"  Para completar a tela, voce precisa
1550 PRINT"pousar na cruz negra no topo direito"
1560 PRINT"da tela."
1570 PRINT
1580 PRINT"  Tocando em qualquer coisa, resulta
1590 PRINT"na perda de uma vida."
1600 PRINT
1610 PRINT"  Cuidado! O balao inicia caindo quando
1620 PRINT"a tela acaba de ser desenhada."
1630 PRINT"
1640 PRINT"  Utilize as setas para guiar o balao.":PRINT
1650 PRINT"                           Boa Sorte!
1660 PRINT
1670 PRINT"   -PRESSIONE ESPACO-"
1680 A$=INKEY$:IFA$=""THEN1680
1690 IFA$<>" "THEN1680
1700 CLS:GOTO 1300


  Sub-rotina para mostrar as telas

1960 SCREEN5,0:CLS:D=1
1970 ONDGOSUB380,530,680,830
1980 IFD=5THENFORT=1TO1000:NEXT:CLS:SCREEN0:GOTO1300
1990 GOSUB1910:D=D+1:FORT=1TO1000:NEXT:CLS:GOTO1970


  Fim do jogo

1705 ' Rotina de fim de jogo (game over)
1710 COLOR1:SCREEN5
1720 CLS:PRESET(85,10):PRINT#1,"Fim de Jogo":LINE(85,20)-(168,20),6:
1730 PRESET(10,40):PRINT#1,"Seus pontos:";SC
1750 IF SC<=HI(5) THEN 1780
1760 PRESET(10,50):PRINT#1,"Novo Recorde !!"
1770 PRESET(10,70):PRINT#1,"Digite seu nome:":GOSUB 1845
1780 PRESET(10,100):PRINT#1,"Tecle algo para prosseguir ..."
1820 A$=INPUT$(1)
1830 GOTO 15
1840 ' Le nome do teclado
1845 COLOR1,15:NM$=""
1850 A$=INPUT$(1)
1855 A=ASC(A$):IF (A<65 OR A>90) AND (A<97 OR A>122) AND
(A<>32 AND A<>8 AND A<>13) THEN 1850
1860 C=LEN(NM$)
1865 IF A=13 AND C>1 THEN GOSUB2300:RETURN
1870 IF A=8 AND C>0 THEN NM$=LEFT$(NM$,LEN(NM$)-1):
LINE(146+8*(C-1),70)-(146+8*C,80),15,BF
1875 IF A>13 AND C<11 THEN NM$=NM$+A$
1880 PRESET(146,70):PRINT#1,NM$
1890 GOTO 1850
  Essa sub-rotina foi reescrita para a screen 5, acrescida de uma sub-rotina para capturar o nome do jogador, caso um dos recordes da lista seja batido.
  A leitura de dados do teclado espera letras, espaço em branco, backspace ou enter.
  Ao completar o nome, uma sub-rotina é chamada para colocar o nome e o placar na lista (GOSUB 2300).

  Sub-rotina que insere recorde na lista:
2300 ' Adiciona novo recorde e grava
2310 I=1
2320 IF SC<=HI(I) AND I<6 THEN I=I+1 : GOTO 2320
2330 IF I=6 THEN RETURN
2340 FOR F=4 TO I STEP -1
2350 NO$(F+1) = NO$(F) : HI(F+1)=HI(F)
2360 NEXT F
2370 NO$(I)=NM$ : HI(I)=SC
2380 OPEN"balao.dat"FOR OUTPUT AS#2
2390 FOR I=1 TO 5 : PRINT#2, NO$(I)+","+STR$(HI(I)) : NEXT
2395 CLOSE2:RETURN
  Em vez de um recorde apenas, agora são 5 recordes. Para chegar aqui, basta que o recorde atual seja maior que o 5o. recorde.
  Uma vez modificada a lista de recordes, o arquivo é atualizado.


Marcelo Silveira
Engenheiro de Sistemas e Computação
Especialista em Processamento de Imagens e Inteligência Artificial
© MarMSX 1999-2025