Curso de Jogos em Basic
Truques para Melhorar o Desempenho


  Ao estudar diversos códigos de jogos em Basic publicados em livros e revistas nos anos 80, constatamos que boa parte do código é composto por dados necessários ao funcionamento do jogo. Pior ainda é constatar que a maioria desses dados estão contidos em instruções como DATA, no qual ainda devem ser copiados para a memória principal ou de vídeo. Isso quer dizer que esses dados serão duplicados na memória do MSX. Assim, o MSX consome tempo de processamento e espaço de armazenamento desnecessários.

  Isso acontecia porque na década de 1980 nem todos tinham a disposição um disk-drive. Entretanto, agora isso é possível graças aos emuladores, disquetes e também a novas formas de dispositivos como os cartuchos com memória flash para MSX.

  Assim, a solução para melhorar a legibilidade do código, bem como o desempenho do MSX, é colocar os dados em arquivos separados. Assim, podemos armazenar em arquivos:   Os dados gerais e as instruções do jogo podemos salvar em um arquivo no formato texto. Por exemplo, imagine um jogo sobre países contendo dados de cem nações. Qual o espaço ocupado pelos dados em DATA, mais o replicamento dos dados em uma tabela? E o trabalho e desperdício de atribuir cada um dos itens na tabela? Por quê não carregá-los de um arquivo?

  Exemplo de código para a leitura de dados de N países, onde os campos são: nome, área, população e língua.
10 SCREEN 0:WIDTH 40:CLEAR 600
20 DIM PA$(100,4)
30 OPEN"PAISES.TXT" FOR INPUT AS#1
40 I=1
50 FOR A=1 TO 4 : INPUT#1, PA$(I,A) : NEXT A
60 I=I+1
70 IF NOT EOF(1) THEN 50
80 CLOSE 1
90 FOR F=1 TO I-1
100 CLS
110 PRINT"REGISTRO ";F;"/";I-1:PRINT
120 PRINT"Pais: ";PA$(F,1)
130 PRINT"Area: ";PA$(F,2);" km2"
140 PRINT"Populacao: ";PA$(F,3);" habitantes"
150 PRINT"Lingua: ";PA$(F,4)
160 LOCATE 0,10:PRINT"Tecle algo para prosseguir ...";
170 IF INKEY$="" THEN 170
180 NEXT F
  O trecho de código que lê os dados de um arquivo vai de 20-80. Podemos ler dados de quantos países quisermos (ou couber na memória). Não se esqueça de reservar espaço de memória para dos dados com o comando CLEAR.

  Exemplo de arquivo texto com 16 países.

PAISES.TXT
Africa do sul,1.221.037,57.725.600,africaner
Alemanha,357.051,82.800.000,alemao
Arabia Saudita,2.149.690,33.500.000,arabe
Argentina,2.780.400,43.590.368,espanhol
Brasil,8.515.767.049,210.147.125,portugues
Belgica,30.528,11.420.163,flamengo
Canada,9.984.670,37.242.571,ingles e frances
China,9.596.961,1.394.015.977,mandarim
Espanha,504.030,46.524.943,espanhol
Estados Unidos,9.371.175,325.719.178,ingles
Franca,543.965,67.348.000,frances
Holanda,41.528,17.100.475,neerlandes
Italia,301.338,60.665.551,italiano
Japao,377.975,126.440.000,japones
Portugal,92.256,10.374.822,portugues
Russia,17.124.442,144.526.636,russo
  Obs: o uso desse procedimento não se justifica se a quantidade de dados for menor do que o tamanho do código utilizado para a leitura de dados.

  Os demais dados como sprites, tiles e mapa do jogo consomem uma boa parte do código do jogo. Entretanto, eles podem ser salvos no formato binário e carregados diretamente na memória de vídeo.

  Para jogos na screen 1, necessitamos armazenar os caracteres modificados em um arquivo, bem como o mapa. Para isso, iremos salvar trechos da tabela de caracteres e da de nomes. Não há necessidade de salvar toda a tabela de caracteres, mas somente os dados modificados. Entretanto, esses dados deverão estar em posições consecutivas da tabela. Caso não estejam, salve a tabela toda.
  Cada caractere ocupa 8 bytes na tabela de caracteres. Essa tabela começa na posição 0 para as screens 1 e 2. Assim, a entrada da tabela correspondente a um caractere C é calculado assim:
Endereço = C * 8
  Na seção 1.2.1 do capítulo 1, montamos o labirinto do jogo Break-man. Veja quantas linhas de programa Basic ele consome. São 54 linhas. Vamos utilizar esse exemplo para salvar os dados no formato binário.
  Nós havíamos modificado a tabela de caracteres da posição 128 a 143. Podemos então salvar somente esse trecho, pois os dados estão em posições consecutivas. A posição inicial e final são:
Inicial: 128 x 8 = 1024
Final: (143+1)*8 - 1 = 1151
  Ao modificarmos essa tabela (e sem dar um comando SCREEN, que limpa a tabela), podemos salvá-la em um arquivo binário (com o sufixo S = VRAM):
BSAVE"CARACT.TAB",1024,1151,S

  A tabela de nomes é onde o mapa do jogo é criado. Ela começa no endereço 6144 tanto para a screen 1 como para a 2. Cada caractere ocupa apenas 1 byte.

  O mapa do jogo Break-man começa na linha 0 e vai até a linha 20. Cada linha consome 32 caracteres. Assim os endereços iniciais e finais são:
Inicial: 6144 + 0 = 6144
Final: 6144 + (20+1)*32-1 = 6815
  Após carregar a tela, salve-a:
BSAVE"NOME.TAB",6144,6815,S

  Outra tabela modificada é a tabela de cores da screen 1. Como foi feita a modificação em apenas 2 bytes dessa tabela, iremos realizar essa modificação na mão mesmo.

  De posse das duas tabelas, podemos carregar todo o cenário do jogo utilizando o código abaixo.
10 SCREEN 1:WIDTH 32
20 VPOKE 8192+16,32:VPOKE 8192+17,32
30 BLOAD"CARACT.TAB",S
40 BLOAD"NOME.TAB",S
  Voìla! Eis o labirinto completo criado em apenas 4 linhas em vez de 54, e desenhado muito mais rápido.

  Na seção 5.2.1 do capítulo 5, vimos como salvar a tabela de padrões de sprite. Essa técnica permite carregar os 256/64 padrões de sprites de uma vez a partir de um arquivo.

  Para a screen 2, podemos criar os tiles em um editor gráfico em posições contíguas de memória. Em Basic, carregamos a tela criada e depois salvamos as tabelas de caracteres e cores (começa na posição 8192) em separado.




<< Anterior BasGame Próxima >>


/MARMSX/CURSOS/BasGame