Você está na página 1de 283

PARA O

AÇAO
JOGOS DE AÇÃO
PARA O APPLE

Faça seus próprios jogos

S. Scott Zimmerman
Beverly Zimmerman
Com assistência de programação
de Stephen H, Zimme.rman
e Brent D. Zimmerman

Editora Manole Ltda.


1988
Dedicado a nossos pais:
Rex e Ardell Zimmerman
Percy e Ora Burrup

Copyright © 1986 Scott, Foresman and Company.

Todos os programas, jogos e utilitários são Copyright © 1985


Computer Expressions.

Tradutores:
Roberto Manole
Nelson Pereira Campos

Revisor:
Orlando Parolini

Editor:
Roberto Manole.

Composição e Fotolito:
Artel - Artes Gráficas Ltda.

Nenhuma parte desta obra poderá ser reproduzida sem a autorização


prévia dos editores.
É proibido a reprodução por xerox.
Os direitos para a língua portuguesa foram adquiridos
pela Editora Manole Ltda.

Editora Manole Ltda.


Rua 13 de Maio, 1026 - Bela Vista
01327 - São Paulo-SP Impresso no Brasil
Fone: 287-0746 Printed in Brazil
PREFÁCIO
Durante os quatro anos passados ensinamos programação de compu­
tadores para mais de 500 jovens e adultos na Brighan Young University
Youth e em Family Computer Camps, e outras escolas de computação.
Achamos que as pessoas gostam mais de programação quando elas
podem ver e ouvir, o resultado de seus esforços. Assim, nossas escolas
de computação enfatizaram gráficos, animação, som e criação de jogos.
No processo, aprendemos muito sobre técnicas de programação de
computadores e sobre métodos de ensino. Jogos de Ação para o Apple
é o auge do que aprendemos.
Os fundamentos e técnicas de programação e os programas utilitá­
rios que apresentamos neste livro foram testados por centenas de estu­
dantes. A maioria dos iniciantes pode escrever com sucesso jogos de
ação de computadores seguindo nosso método de organização de jogos
e técnicas especiais de programação. Os que já conhecem Applesoft
BASIC podem geralmente usar estas técnicas para diminuir pela metade
seu tempo de programação, podendo então gastar mais tempo em idéias
de jogos e menos tempo em codificação e correção de programas.
Estes fundamentos e técnicas aplicam-se não somente a jogos de
ação mas também a muitos outros tipos de programas de computadores
— software educacional, utilitários de programação, simulações e apli-
cações comerciais, entre outros. Usamos com sucesso estes fundamen­
tos escrevendo programas profissionais para publicação em revistas
nacionais e para distribuição comercial.
Jogos de Ação para o Apple foi urri projeto de família. Nossos filhos
escreveram muitos dos jogos (Stephen: Nuclear Fallout e Death Chase
Brent: Race Car, Invaders, Space Hunter e Racquet) enquanto traba­
lhavam como nossos assistentes no ensino. Scott escreveu os outros
jogos e os utilitários de programação. Todos os jogos foram “testados
em campo de batalha’’ pelo resto da família. O crédito por tornar o livro
legível vai para Beverly, quem corrigiu, editou, e, quando necessário,
reescreveu o manuscrito.
Esperamos que você tenha tanta diversão lendo este livro, apren­
dendo as técnicas de programação, e jogando os jogos* quanto nós
tivemos enquanto juntávamos tudo. Enfim esperamos que você se divirta
criando e desfrutando de seus próprios jogos de computadores.

Scott e Beverly Zimmerman


Orem, Utah
INDICE
Capítulo 1. INTRODUÇÃO .................................................................... 1
Como usar este livro ........................................................ 2
O que você já deveria saber............................................ 2
Como digitar e gravar programas Applesoft ________ 2
Usando o programa Startup ................................ 5
O disquete Jogos de Ação ............................................ 6
É necessário mais do que ler um livro.......................... 6
Listagem do programa Startup ...................................... 8
Capítulo 2. FUNDAMENTOS DA CRIAÇÃO DE JOGOS .................. 10
Organização de programas.............................................. 11
Quadro: Organização Padrão de Programas........ 12
Técnicas Especiais de programação.............................. 15
Capítulo 3. GRÁFICOS E ANIMAÇÃO ................................................ 16
Gráficos .............................................................................. 17
Preceitos para gráficos de baixa resolção .................. 17
Qadros
Cores de Baixa Resolução no Apple e Seus Números 18
Resumo dos Comandos de Gráficos de Baixa Reso­
lução ........................ ,............................................... 21
Animação ...................................... 21
Qs Sete Passos da Animação...................................... 21
Capítulo 4. SNAKE ................................................................................ 24
Como jogar Snake ............................................................ 25
Explicação do programa .................................................. 26
Quadro: Variáveis Principais em Snake........ ........ 26
Organização do programa ................................ 26
Animação ...................................................................... 27
Ciclo principal ................................................................ 27
Entrada via teclado ...................................................... 27
Efeitos sonoros .............................................................. 28
Cronômetros de jogos .................................................. 28
Melhorias e modificações ................................................ 28
Listagem do programa Snake ........................................ 29
Capítulo 5. WIPEOUT ............................................................................ 31
Como jogar Wipeout................... 32
Explicação do programa .................................................. 33
Quadro: Variáveis Principais em Wipeout.................. 33
Animação ...................................................................... 33
Quadro: Valores de MX e MY para o Movimento da
Nave Estelar................. 34
Contadores de Jogos.................................................... 35
Inimigos Aleatórios........................................................ 35
Melhorias e Modificações ................ .............................. 36
Mudando a dificuldade do jogo................................. 36
Usando as teclas de seta como entrada.................. 37
Usando o mouse do Apple como entrada.................. 37
Outras melhorias....................................... 37
Listagem do programa Wipeout .................................... 39
Capitulo 6. RACE CAR ......................................................... 42
Como jogar Race Car ...................................................... 43
Explicação do Programa.................................................. 43
Quadro: Variáveis Principais em Race Car ................ 43
Seleção dos níveis de dificuldade.............................. 44
Paddles ................. 44
Movimentando a tela de baixa resolução ................ 45
Ciclo principal modificado .......................... 45
Melhorias e modificações ................................................ 46
Listagem do programa Race Car.................................... 47
Capítulo 7. MÚSICA E EFEITOS SONOROS .................................... 49
Como digitar o Criador de Som .................................... 50
Exemplos de efeitos sonoros .......................................... 51
Tutor do Criador deSom ........................ 52
Pitch ................................................................................ 52
Duração ......................... 53
Ritmo ........................................................ 53
Ligando e desligandoo som ........................................ 54
Quadros
Comandos do Teclado do Editor de Som ................ 55
Relação entre as Notas Musicais e os Parâmetros
Pitch ............................... 56
Ritmo da Música e Parâmetros de Duração............ 56
Listagem dos programas ................................................ 57
Editor de Som .................................................................. 63
Música: Computador Bach................................................ 65
Capítulo 8. NUCLEAR FALLOUT ........................................................ 67
Como jogar Nuclear Fallóut ............................................ 68
Explicação do programa .................................................. 68
Quadro: Variáveis Principais em Nuclear Fallout .... 69
Usando o Criador de Som .................... 69
Posições aleatórias ...................................................... 70
Aumentando automaticamente os níveis de dificul­
dade ............ 71
Velocidades diferentes............... 71
Melhorias e modificações ................................................ 71
Listagem do programa Nuclear Fallout.......................... 72
Capítulo 9. INVADERS .......................................................................... 75
Como jogar Invaders ....................................................... 76
Explicação do programa .................................................. 76
Quadro: Variáveis Principais em Invaders................ 76
Soltando bombas e atirando balas............................ 77
Eventos Aleatórios ........................................................ 77
Animação de objetos múltiplos ....................... 78
Melhorias e modificações ........... 79
Acelerando o Applesoft................. 79
Compilando o Applesoft ...................................... 80
Listagem do programa Invaders ... •.............................. 82
Capítulo 10. SPACE HUNTER 85
Como jogar Space Hunter .............................................. 86
Explicação do programa .................................................. 87
Quadro: Variáveis Principais em Space Hunter ...... 87
Ciclos principais duplos .............................................. 88
Usando a janela de texto para gráficos.................... 88
Controle do joystick ...................................................... 89
Entrada dos botões do paddle.................................... 90
Explosões ém baixa resolução.................................... 90
Melhorias e modificações ................................................ 91
Listagem do programa Space Hunter............................ 93
Capítulo 11. GUIA PARA GRÁFICOS DE ALTA RESOLUÇÃO.......... 98
Preceitos para gráficos de alta resolução.................... 99
Quadro: Cores de Alta Resolução do Apple e seus
respectivos números .,............................................ 100
PEEKS, POKES e CALLS .............................................. 101
PEEKS, POKEs e CALLS gráficos do Apple.............. 102
Desenhando ou apagando uma tela de alta resolu­
ção sem mostrá-la...................................................... 103
Usando a janela de texto com gráficòs de alta reso­
lução .......................................................................... 104
Sumário de comandos Applesoft para gráficos de alta
resolução ........................................................................ 105
Contador de colisão dealta resolução......................... 107
Organização de programas com gráficos de alta reso­
lução .............. 107
Capítulo 12. EDITOR DE TABELA DEFIGURAS................................. 108
Tabela de Figuras ............................................................ 109
O que é uma Tabela de Figuras?.............................. 109
O que é um Editor de Tabela de Figuras.................. 109
Quais são os usos do Editor de Tabela de Figuras 110
Digitando e gravando o Editor de Tabela de Figuras .. 110
Preceitos para o Editor de Tabela de Figuras.............. 111
Modos principais do Editor de Tabela de Figuras .... 114
Modo Editar Figura .......................................................... 114
Controle do cursor........................................................ 114
Desenhando e apagando pontos na Figura de Edição 115
Desenhando linhas ecaixas ........................................ 116
Movimentando a Figura deEdição.............................. 116
Saindo do Editor de Tabela de Figuras...................... 117
Modo ARQUIVAR................................................................ 117
Modo COMANDO DOS .................................................... 120
Usando tabelas de figuras .............................................. 121
Mapa da memória do Editor de Tabela de Figuras ... 123
Listagens dos programas ................................................ 125
Capítulo 13. WIPEOUT DE ALTA RESOLUÇÃO .................................. 158
Como Jogar Wipeout de Alta Resolução...................... 159
Explicação do programa ................................................ 160
Quadro: Variáveis Principais em HR Wipeout.......... 160
Organização de programas em alta resolução .... 161
Dicas para gráficos de alta resolução .................... 163
Matrizes de dados de figuras...................................... 164
Animação em alta resolução ...................................... 164
Contador de colisões .................................................. 166
Texto de alta resolução .............................................. 167
Pausas de jogo ............................................................ 168
Melhorias e modificações ................................................ 168
Listagens de programas para HR Wipeout .................. 171
Capítulo 14. NUCLEAR FALLOUT DE ALTA RESOLUÇÃO .............. 177
Como jogar Nuclear Fallout de alta resolução .......... 178
Quadro: Variáveis Principais em HR Nuclear Fallout 179
Explicação do programa . .............................................. 179
Instruções ao usuário .................................................. 180
Matrizes de dados de figuras .................................... 180
Animação de figuras múltiplas .................................. 181
Explosões de alta resolução ...................................... 182
Melhorias e modificações .............................................. 183
Listagens de programas para HR Nuclear Fallout .... 184
Capítulo 15. RACQUET .......................................................................... 190
Digitando Racquet ............................................................ 191
Como jogar Racquet ...................................................... 191
Explicação do programa ................................................ 193
Quadro: Variáveis Principais em Racquet ................ 193
Jogos de dois jogadores ............................................ 194
Seleção de entrada (paddles/teclado) .................... 194
Bola saltitante ................................................................ 195
Usando o comando SCALE ........................................ 195
Melhorias e modificações ................................................ 196
Listagem do programa Racquet .................................... 197
Capítulo 16. ALIEN DEFENSE .......................................... 201
Como jogar Alien Defense .._.......................................... 202
Quadro: Variáveis Principais em Alien Defense .... 202
Explicação do programa.................................................. 203
Fundos de alta resolução ............................................ 203
Chaves articuláveis ...................................................... 204
Expressões booleanas ................................................ 205
Balas dirigíveis .............................................................. 207
Melhorias e modificações .............................................. 207
Listagens dé programas para Alien Defense .............. 212
Capítulo 17. DEATH CHASE ................................................................... 218
Digitando Death Chase .................................................... 219
Como jogar Death Chase ................................................ 219
Explicação do programa ................................................ 220
Quadro: Variáveis Principais em Death Chase .... 220
Inimigos “inteligentes” ................................................ 220
Pontos de bônus .......................................................... 221
Gravando o escore máximo nodisco ........................ 222
Melhorias e modificações .............................................. 222
Listagem do programa Death Chase ............................ 225
Apêndice A. Como Corrigir Programas Applesoft BASIC ................. 231
Apêndice B. Como Digitar Arquivos Binários ............................ 235
O monitor do Apple ........................................................ 236
Tutor do monitor .............................................................. 237
Digitando arquivos binários ............................................ 239
Digitando programas em linguagem de máquina .... 240
Apêndice C. Mapa da Memória do Apple II .......... 241
Apêndice D. Texto na Tela de Alta Resolução ................ 243
Fazendo as suas próprias fontes .................................. 244
Usando fontes de alta resolução em programas Apple­
soft ................................................................................ 245
Apêndice E. Guia de Referência Rápida para o Editor de Tabela
de Figuras ...................................................................... 258
Apêndice F. Programando o Mouse do Apple ................................ 261
Apêndice G. Bibliografia ...................................................................... 267
CAPÍTULO 1
INTRODUÇÃO
2 Jogos de Ação para o Apple

Se você deseja aprender como criar e programar seus próprios


jogos de computadores, você veio ao lugar certo! Se você gosta de jogar
jogos de computadores mas não tem interesse algum em programar
seus próprios jogos, este livro será uma frustração. É verdade que o
livro contém onze excitantes jogos de ação, mas nós os criamos primei­
ramente para ensinar-lhe as técnicas de programação, e em segundo
lugar somente para divertí-lo. Além disso, este livro fornece utilitários
de programação para gráficos e sons em jogos e outros tipos de pro­
gramas.

COMO USAR ESTE LIVRO

Só há uma maneira de se aprender como programar jogos de com­


putadores: você deve fazê-lo.
Você não pode aprender programação de jogos aconchegando-se
em uma cadeira gostosa com um drinque em uma mão e este livro em
outra. Você só pode aprender sentando-se ao computador com suas
mãos no teclado, e este livro aberto na escrivaninha.

O QUE VOCÊ JÁ DEVERIA SABER


Este livro supõe que você já esteja acostumado com programação
de Applesoft BASIC. Este livro é um tutor em técnicas especiais de pro­
gramação, não um tutor de programação em Applesoft. Você já deve
entender (pelo menos até um certo grau) variáveis, matrizes e declara­
ções DIM, ciclos FOR...NEXT, sintaxe IF...THEN, e outros comandos
comuns do BASIC. Se você não é familiar a estes aspectos do BASIC,
deveria consultar úm bom livro de programação de Applesoft BASIC
(veja a bibliografia no Apêndice G).
Este livro também supõe que você saiba algo sobre ProDOS e/ou
DOS 3.3, os dois populares Sistemas Operacionais em Disco do Apple.
Os programas do livro foram escritos primeiramente para o ProDOS,
embora todos, menos um deles, também irão rodar com DOS 3.3. Se você
é familiar ao DOS 3.3, mas não ao ProDOS, provavelmente será capaz
de entender todos os comandos de disco, como é semelhante a sintaxe
usada com os dois sistemas operacionais. Se você tem perguntas sobre
comandos de operação de disco, examine uma das referências de DOS
dada no Apêndice G.
Este livro não supõe que você saiba algo sobre gráficos, animação,
som, ou criação de programas, e os explicará em detalhes.

COMO DIGITAR E GRAVAR PROGRAMAS APPLESOFT


Se você precisa rever como digitar um programa de Applesoft
BASIC no seu computador e gravá-lo para o disco, continue lendo esta
seção, se, por outro lado, você está familiar com digitação, detecção e
correção de erros (“debugging”), e gravação de programas no Apple,
você pode pular esta seção.
Introdução 3

Os passos seguintes são necessários para escrever e gravar pro­


gramas Applesoft com séu computador Apple e seu drive acompanhante.
1. Insira seu disquete do sistema mestre (o Sistema Mestre DOS 3.3, o
Sistema Mestre ProDOS ou o Disco de Utilitários do Sistema), no
drived 1. (Se você tiver apenas um drive, este é o drive 1. Se você
tiver dors drives, eles deverão estar marcados “1” e "2”; o drive 1 é
geralmente o drive de cima quando os dois estão empilhados um em
cima do outro ou o drive esquerdo quando os dois estão situados
lado a lado.)
2. Toda vez que você for instruído para pressionar uma tecla, o nome da
tecla estará entre os sinais <e>. Por exemplo, <RETURN> quer di­
zer, pressione a tecla RETURN e não, escreva a palavra “Return”.
3. Quando dizemos a você para digitar um comando de computador,
colocaremos o comando entre aspas. Não escreva as aspas.
4. Ligue o computador, ou, se ele já está ligado, digite “PR4£6” e pres­
sione < RETURN >. Isto é chamado de dar o boot no sistema ou carre­
gar o disco.
5. Depois de você carregar o sistema você precisa inicializar (ou for­
matar) um disco virgem.
Isto é feito como segue:
a. ProDOS. Para formatar um disco ProDOS em um Apple II + ou //e,
BRUN õ programa FILER, o qual é encontrado no Disco do Usuário
ProDOS, e depois selecione “VOLUME COMMANDS” seguido da
opção “FORMAT A VOLUME”. Para formatar um disco ProDOS, no
Apple//c, use o Disco Utilitário //c do ProDOS, e selecione a opção
“FORMAT A DISK”. Você deveria dar a seu disco o nome do diretório:
“/JOGOS DE AÇÃO ”. Então você deveria usar o ProDOS Filer ou o
Disco Utilitário do //c para copiar os arquivos ProDOS e BASIC SYS­
TEM em seu novo disco formatado.
b. DOS 3.3. Para inicializar um disco DOS 3.3, digite um programa qual­
quer de uma linha como, por exemplo, “100 REM STARTUP”, e depois
com seu disquete virgem no drived 1, digite: “INIT STARTUP”. Dê ao
seu programa de saudação o nome de “STARTUP”, não o chame de
“HELLO” como é tradicionalmente feito. Você digitará e gravará o ver­
dadeiro STARTUP no passo 7 desta seção.
6. Depois de formatar um disco virgem, vá para o BASIC. Você pode
dizer que está em BASIC quando ver um colchete (]) na borda
esquerda do monitor. Este colchete, chamado “prompt” (pronto), diz
a você qup o computador aceitará comandos de Applesoft BASIC.
Logo à direita do prompt está um bloco piscante chamado de cursor.
Isto diz a você onde aparecerá o próximo caractere que você digitar.
7. Digite o programa Applesoft chamado STARTUP (dado na Listagem 1.1)
no seu computador. Para completar, primeiro digite o número da linha,
depois digite a linha completa de comandos, e finalmente pressione
< RETURN >. Depois de pressionar < RETURN > você verá o prompt
do Applesoft a indicar que agora você pode digitar a próxima linha.
Aqui estão algumas dicas sobre como digitar a listagem:
4 Jogos de Ação para o Apple

a. Se você digitar errado um caractere, pressione a tecla da seta esquerda


para mover o cursor um espaço para trás. Depois digite o caractere
correto sobre o erro.
b. Lembre-se sempre de pressionar <RETURN> no final de cada linha.
Caso contrário, o computador não registrará que você digitou uma
linha de código BASIC.
c. Se você digitou várias palavras em uma linha, e então percebe um
erro pequeno no seu começo, você poderá pressionar a seta esquerda
até que o cursor esteja no erro. Digite a palavra ou o caractere correto.
Então pressione a seta direita até que o cursor esteja de volta de onde
você havia partido. Se a palavra correta não cabe no mesmo espaço,
você terá que redigitar a linha inteira.
d. Se você detectar um erro em uma linha depois que já a digitou e pres­
sionou <RETURN>, você deve redigitar a linha inteira. Este é um
processo cansativo e meticuloso. Felizmente, há duas soluções para
o problema: aprenda a usar as teclas de edição ESC-I, J, K e M, como
explicado no manual de referência do Applesoft BASIC, (ou no seu
manual) é/ou adquira um bom editor de linhas Applesoft (como,
por exemplo, o Global Program Line Editor (GPLE), comercializado
pela Beagle Bros. Micro Software, 4315 Sierra Vista, San Diego, CA
92103, ou Global Applesoft Line Editor (GALE), comercializado pela
MicroSPARC, 45 Winthrop St., Concord, MA 01742).
e. Em Applesoft BASIC, adicionar ou omitir um espaço eventual não faz
diferença, quando entrando uma linha de código (exceto dentro de
aspas depois de uma declaração INPUT ou PRINT, como mencionado
abaixo). O computador irá automaticamente juntar palavras se você
adicionou um espaço desnecessário, e irá preencher espãços entre
comandos conforme eles sejam listados.
f. Quando digitar uma declaração INPUT ou PRINT, preste atenção
cuidadosa aos espaços! Enquanto espaços não são importantes quando
se digitam outros comandos Applesoft, eles são extremamente impor­
tantes em comandos PRINT porque muitos programas, especialmente
jogos, requerem uma formatação de tela específica para uma operação
bem sucedida.
g. Preste atenção aos detalhes! Pequenos erros como omitir dois pontos
(:),: ou digitar “I” (“L” minúsculo) ao invés de “1” o (número um), ou
digitar “O” (“O” maiúsculo) ao invés de "0” (o número zero), podem
câusár o mau funcionamento de um programa.
h. Enquanto você digita o programa, LISTe o programa ocasionalmente
e compare sua listagem com a listagem do livro.
i. Para criar declarações REM como estas nas linhas 190 e 490 do STAR­
TUP, primeiro digite o número da linha. Depois digite “REM” e então
tecle <CTR-J>. Para fazê-lo, mantenha a tecla <CTRL> pressiona­
da e aperte a tecla “J”. Tecle <CTR-J> novamente para fazer o cursor
descer outra linha, então digite a legenda (como, por exemplo, “INTRO­
DUÇÃO:”). Finalmente, digite <CTRL-J> novamente. (CTRL-J é algu­
mas vezes chamado de “line feed”, visto que ele causa a saída para ir
para a próxima linha abaixo.)
Introdução 5

j. À medida que você vai digitando o programa, ocasionalmente deveria


rodá-lo (RUN) para ver como as coisas vão indo. O Apêndice A explica
como detectar e corrigir erros em seu programa.
8. Após digitar cada jogo ou utilitário Applesoft, voce deveria digitar
“SAVE nome do arquivo” onde nome do arquivo é o nome do jogo
ou programa utilitário. Por exemplo, você deveria digitar “SAVE STAR­
TUP” após digitar a Listagem 1.1. Isso grava ó programa no disco.
9. Para sugestões em como detectar e corrigir erros em seus programas ’
Applesoft, ou nos que você digitar deste livro, consulte o Apêndice-
A, Como Corrigir Programas em Applesoft BASIC.

USANDO O PROGRAMA STARTUP


Quando você carrega (“boot”) o disco Jogos de Ação, o programa
STARTUP irá rodar automaticamente. Ou se o sistema operacional do
disco foi carregado de outro disco, você pode rodar o STARTUP digitan­
do “RUN STARTUP". Quando você o fizer, verá o seguinte display de tela:

MENU JOGOS DE AÇAO


BY S. SCOTT ZIMMERMAN
SNAKE
WIPEOUT
RACE.CAR
EXEMPLOS.SOM
EDITOR.SOM
COMPUTADOR.BACH
NUCLEAR.FALLOUT
INVADERS
SPACE.HUNTER
TABELA.FIGURAS.ED
HR.WIPEOUT
HR.NUC.FALLOUT
RACQUET
ALIEN.DEFENSE
DEATH.CHASE

PRESSIONE AS SETAS PARA SELECIONAR PROGRAMA


PRESSIONE <RETURN> PARA RODAR O PROGRÁMA
PRESSIONE <ESC> PARA SAIR PARA O BASIC
Um dos nomes dos programas será mostrado em vídeo inverso com
um indicador sobre o nome. Para mover o. indicador para baixo, pres­
sione a tecla da seta direita ou a tecla da seta para baixo; para movê-lo
para cima, pressione a tecla da seta esquerda ou a tecla da seta para
cima.
Uma vez que o indicador está sobre o nome do programa que você
quer executar, tecle < RETURN >. Obviamente, como você apenas inicia-
6 Jogos de Ação para o Apple

lizóu o disco Jogos de Ação, nenhum destes programas está no disco,


então quando você tecla < RETURN > você perceberá o érro “FILE NOT
FOUND” do DOS ou o erro “PATH NOT FOUND” do ProDOS.
Quando você roda o STARTUP mas não quer executar nenhum dos
programas do menu, tecle apenas <ESC> para sair para o BASIC.

O DISQUETE JOGOS DE AÇÃO


À medida que você lê este livro e digita os jogos, os utilitários e as
informações (data) das figuras, você deveria gravar todos os arquivos
no disco formatado na seção anterior o qual chamaremos disco “Jogos
de Ação”.
Os programas e outros arquivos no disco Jogos de Ação incluirão
o seguinte: Um programa STARTUP, que contém um menu dos progra­
mas que você pode rodar (veja a seção anterior); os onze jogos de ação;
vários utilitários (um gerador de som, um editor de som, e um editor de
figuras gráficas); e vários arquivos de demonstração (efeitos sonoros, mú­
sica, e tabelas de figuras).
Todos os programas deste livro, exceto o Editor de Tabelas de
Figuras, são compatíveis tanto com o ProDOS como com o DOS 3.3.
Se você conhece o DOS 3.3, pode revisar a seção de DOS do Editor
de Tabelas de Figuras para torná-lo compatível com DOS 3.3.
Para usar este disco, coloque-o no drive 1 e ligue o computador. Se
o computador já estiver ligado, você pode digitar “PRffcô” <RETURN >
para carregar o disco.
Quando você carregar o disco, o programa STARTUP irá rodar auto­
maticamente. Este contém o menu principal, quer dizer, uma lista dos
programas do disquete. Se você quiser rodar um dos programas, pres­
sione as teclas de setas no APPLE para mover o indicador na tela para o
programa desejado, e tecle < RETURN >. Se você não quer rodar nenhum
destes programas, tecle <ESC> para sair do menu principal e ir para o
Applesoft BASIC.

É NECESSÁRIO MAIS DO QUE LER UM LIVRO


Este livro pode ensinar-lhe métodos e técnicas de programação —
criação de jogos, gráficos, animação, efeitos sonoros, uso da entrada
via teclado, paddles e joysticks — mas não pode ensinar-lhe duas
peculiaridades importantes que você precisará para se divertir fazendo
jogos: curiosidade e vontade.
A curiosidade mantê-lo-á aprendendo e experimentando enquanto
avança no livro. Você quererá aprender novas técnicas e experimen­
tá-las nos seus próprios programas, a fim de descobrir o que acontece
quando você modifica programas existentes, adiciona novas qualidades
a seus programas e faz seus próprios programas.
Introdução 7

A vontade mantê-lo-á trabalhando quando as coisas parecerem difí­


ceis. Você talvez terá que reler partes do livro que não ficaram muito
claras na primeira vez; refaça um programa para fazê-lo funcionar da
maneira que você queira; ou gaste várias horas tentando achar um erro
(“bug”) no seu programa, é necessário vontade mesmo para fazer este
tipo de trabalho — e ter toda esta diversão.
8 Jogos de Ação para o Apple

Listagem 1.1: STARTUP

10 REM
20 REM * STARTUP *
30 REM * BY SCOTT ZIMMERMAN *
40 REM COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH - *
70 REM * OREM, UTAH 84057 *
80 REM
90 REM
190 REM

INTRODUÇÃO:

20Ô TEXT s HOME : IF PEEK (104) < > B THEN


POKE 103,1: POKE 104,8: POKE 2048,0:
PRINT CHRt (4);"RUN STARTUP"
220 M = " MENU JOGOS DE ACAO ": INVERSE : GOSUB
6000: NORMAL :AT = "BY S. SCOTT ZIMMERMAN":
GOSUB 6000:At = "COPYRIGHT (C) 1985":
GOSUB 6000
490 REM

ARRANJO:

500 DIM Ft-(15): NF = 15: FOR I = 1 TO NF: READ


Ft(I): NEXT I
520 FOR I = 1 TO 40: PRINT NEXT I
540 FOR FC = 1 TO NF: GOSUB. 7000: NEXT FC
560 FÓR I = 1 TO 4Q: PRINT NEXT I
580 FC = 1: GOSUB 7100
600 VTAB 21: PRINT "USE AS SETAS PARA ESCOLHER 0
PROGRAMA": PRINT "TECLE <RETURN> PARA RODAR
0 PROGRAMA": PRINT "TECLE <ESC> PARA IR
PARA O BASIC"
990 REM

CICLO PRINCIPAL:

1000 KB = PEEK ( - 16384): IF KB < 128 THEN


1000
1020 POKE - 16368,0:SN = PEEK ( - 16336)
+ PEEK ( - 16336): IF KB = 138 OR KB =
=149 THEN 2000
1040 IF KB = 139 OR KB = 136 THEN :3000
1060 IF KB = . 141 THEN 4000
1080 IF KB = 155 THEN 10000
1100 GOTO :1000
2000 GOSUB 7000:!FC = FC + 1: IF FC > NF THEN
) FC = 1
2020 GOSUB 7100: GOTO 1000
3000 GOSUB 7000:!FC = FC - 1: IF FC < 1 THEN
FC = NF
3020 GOSUB 7100: GOTO 1000
4000 HOME ;: PRINT "RUN ";F$(N)
4020 PRINT CHR$ (4);"RUN "; F$(N)
5990 REM

SUB-ROTINAS:

6000 HTAB (40 - LEN! (A$>) / 2; PRINT A$: RETURN


1
7000 VT = FC 4:N = FC: VTAB VT: HTAB 11: PRINT
g F$(N): RETURN i
7100 vT = FC + 4:N = FC: VTAB VT: HTAB 11: INVERSE
: PRINT F$(N): NORMAL : RETURN
10000 TEXT : HOME : END
29990 REM

NOMES DOS AROUIVOS

30000 DATA "SNAKE","WIPEOUT","RACE.CAR","EXEMPLOS.SOM",


"EDITOR.SOM","COMPUTADOR.BACH”,"NUCLEAR.FALLOUT",
" INVADERS " , " SPACE. HUNTER ’*
30020 DATA "ED.TAB.FIG","WIPEOUT.HR","NUC.FALLOUT.HR",
"RACQUET","ALIEN.DEFENSE","DEATH.CHASE"
CAPÍTULO 2
FUNDAMENTOS DA
CRIAÇÃO DE JOGOS
Fundamentos da Crihção de Jogos 11

Se você pensa que jogar é divertido,, então achará á criação de seus


próprios jogos o prazer máximo! Observando uma espaçonave que você
criou, um foguete que você desenhou; uma bomba que você inventou...
escutando suas explosões, sua artilharia, sua rajada de laser... marcando
seus próprios pontos, sendo acertado pelo seu próprio alienígena, ga­
nhando ou perdendo —no seu próprio programa... estes são os verda­
deiros prazeres dos jogos para computadores.
Fazer jogos para computadores no entanto pode ser desanimador.
Espaçonaves e alienígenas que são difíceis de desenhar. Foguetes que se
recusam a voar cruzando a tela. Bombas que param de cair, e explosões
permanecendo em silênGio. Estas são as frustrações de quase todos os
programadores de jogos.
O objetivo deste livro é ensinar a criação e técnicas de jogos para
computadores enquanto aumentamos seu divertimento e minimizamos
suas frustrações.
Este livro irá ajudá-lo a desenvolver as habilidades que você precisa
para fazer jogos de ação em Apple BASIC, usando gráficos de alta e baixa
resolução, animação, efeitos sonoros, cronômetros e contadores, perifé­
ricos de entrada do usuário (teclado, paddles, joystick, mouse) e muitos
outros truques de programação. Ser-lhe-ão dados também utilitários de
programação poderosos para a criação de figuras de alta resolução e
para gerar sons de jogos em seus programas.
Desenvolvemos um método padrão de organização de jogos que o
ajudará a evitar o tempo e a frustração de reinventar técnicas e métodos
de programação toda vez que escrever um jogo. Esta organização do pro­
grama provou ser eficaz não somente fazendo jogos, mas também fazendo
muitos outros programas. Escrever um jogo de computador, como os
desse livro, levaria normalmente trinta a cinquenta horas de programa­
ção, mas seguindo á organização padrão apresentada abaixo, e com um
pouco de prática, você será capaz de fazer jogos parecidos em quatro a
seis horas!
Com poucas exceções, todos os jogos deste livro seguem a mesma
organização fundamental. Sugerimos que você siga com cuidado este
modelo, pelo menos para os primeiros dois ou três jogos que você escre­
ver. Algumas partes da organização podem parecer arbitrárias, mas nossa
experiência em fazer dúzias de jogos, e em ensinar centenas de estudan­
tes como programar jogos, indica que este formato padrão funciona.
(Você também notará que o STARTUP no Capítulo 1 usa essencial­
mente esta mesma organização de programas.)

ORGANIZAÇÃO DE PROGRAMAS

O Quadro 2.1 dá a organização padrão de programas. Os exemplos


que damos são para jogos escritos com gráficos de baixa resolução, mas
os mesmos fundamentos se aplicam aos gráficos de alta resolução. Os
números de linha sugeridos estão no lado esquerdo do quadro. Exceto
para declarações REM, os números de linhas sugeridos são em incre­
mentos de vinte. É claro, um programa pode ser feito em incrementos de
12 Jogos de Ação para o Apple

um, mas isto não permitiría a adição de novas linhas dentro do corpo do'
programa. Fazendo com incrementos de vinte, permite-se a maioria das
adições e correções para desenvolver programas, sendo portanto um bom
hábito de programação. Além disso, no final de cada capítulo, apresenta­
mos uma seção de melhorias e modificações sugeridas. Estas mudanças
sugeridas serão fáceis de se fazerem se você mantiver os incrementos
das linhas em vinte.
As seções do programa com uma breve explicação estão no lado
direito do Quadro 2.1. Para entender completamente o objetivo de cada
seção e como fazer a programação, você deverá examinar com cuidado
os programas de exemplo nos capítulos posteriores usando este quadro
como um guia.

QUADRO 2.1
ORGANIZAÇÃO PADRÃO DE PROGRAMAS
NÚMERO DE
LINHAS SEÇÃO DO PROGRAMA E EXPLICAÇÕES
10-100 Observações (REM): Título do jogo, autor, copyright, etc.
100 - 480 Introdução do Programa: Nome da página, instruções (ou
GOSUBs para instruções), carregando (BLOAD) ou rodan­
do (BRUN) arquivos em linguagem de máquina, etc. Uma
Introdução de Programa padrão deveria parecer algo com
o seguinte:
200 TEXT: HOME
220 VTAB 8: A$ = “JOGO DE COMPUTADOR EM BAIXA­
RES”: HTAB (40-LEN (A$))/2: PRINT AÍ
240 VTAB 10: AS = “BY JOHN Q. DOE”: HTAB (40-LEN
(A$))/2: PRINT AS
280 IF PEEK (768)<> 201 THEN PRINT CHRS (4) “BRUN
CRIADOR.SOM”
300 VTAB 22: PRINT “TECLE A BARRA DE ESPAÇO PARA
COMEÇAR GET AS: PRINT AS
500 - 980 Arranjo do Programa: Atribui valores iniciais às variáveis,
Por exemplo, comandos GR e HOME, escore, tempo, cor,
ou números de alienígenas. Comandos PLOT, HLIN e
VLIN para fixarem o fundo inicial da tela. Ajusta X,Y das
figuras iniciais (por exemplo, sua espaçonave), e desenha
(PLOT) as figuras iniciais.
1000-4980 Ciclo Principal: Inclui as seguintes subdivisões, com o
número da linha que começa cada subdivisão.
1000 Verifica se uma tecla foi pressionada; se não, a execução
do programa vai para a linha 2000.
1020 Recebe (GET) a tecla que acaba de ser pressionada.
1040 Verifica qual tecla foi pressionada, e muda as variáveis de
acordo. Isto, por exemplo, muda a direção do movimento
de sua espaçonave ou canhão ou faz com que uma bala
seja atirada.
Fundamentos da Criação de Jogos 13

2000 Guarda as posições correntes das figuras que se movem.


Calcula nova posição das figuras. Verifica bordas (A fi­
gura está para sair da tela?). Verifica colisões possíveis.
Ajusta o escore como for necessário. Apaga a figura de
sua antiga posição, desenhando-a em sua, nova posição.
Muda o tempo e os contadores.
5000 Fim do ciclo principal, volte para a linha 1000.
6000- 9980 Sub-rotinas.
1000-14980 Seção Ganhar Jogo.
15000-19980 Seção Perder Jogo.
20000 - 29980 Seção Fim do Jogo: Mostra o tempo, registra o número de
inimigos, etc. Grava o escoreKmáximo. Pergunta se o joga­
dor quer jogar novamente.

Na explicação seguinte de cada seção principal de programação,


você deverá ter em mente que todas as seções não estão necessaria­
mente em todos os programas de jogos que você escrever. De fato, para
simplicidade e brevidade, omitimos algumas das seções nos primeiros
jogos de exemplos deste livro. Note também que o tipo de código do
programa irá variar de jogo para jogo dentro de cada seção do programa.
A seção Observações (linhas 10-100) deverá ser sempre incluída
em qualquer programa que você escrever. Estas déçlarações deixarão
você saber o que, o quem, e o quando do programa: nome, autor(es),
aviso de copyright (se necessário), e a data. Quando você escrever seu
primeiro programa, você poderá pensar que nunca esquecerá estas infor­
mações. Você poderá esquecer, entretanto, depois de escrever muitos
programas. Você poderá desejar dar uma cópia de seu programa a seu
amigo que desejará saber a origem do programa. O mais importante, estas
informações devem aparecer na listagem se você qualquer dia planejar
comercializar ou publicar um programa.
A seção Introdução do Programa (linhas 100-480) inclui o seguinte:
o código para o display inicial da tela de texto (nome e autor do jogo):
as instruções do jogo (geralmente opcionais); carregar (BLOAD) tabelas
de figuras e alterar (POKE) o endereço da tabela de figuras; ajustamento
da escala e rotação iniciais para as figuras de alta resolução; rodar
(BRUN) ou carregar (BLOAD) quaisquer rotinas em linguagem de máqui­
na, por exemplo, Criador de Som (veja o Capítulo 7); dimensionámento
(DIM) de quaisquer matrizes.
A seção Arranjo do Programa (linhas 500 - 980) pode ser considera­
da a preparação para jogar. Todas as variáveis são inicializadas aqui, por
exemplo: o escore, o número de alienígenas, o tempo e as posições das
espaçonaves. Você irá também desenhar a tela inicial de gráficos, como
ela irá aparecer quando o jogo começar, na seção de arranjo do progra­
ma; isto inclui todas as aeronaves espaciais, alienígenas, barreiras, cená­
rios de fundo, etc. Ela normalmente não inclui balas, foguetes, explosões,
ou itens parecidos, visto que estas figuras aparecem geralmente somente
depois de o jogo ter começado em resposta à entrada e movimento do
jogador de outras figuras. A seção Arranjo do Programa também inclui
14 Jogos de Ação para o Apple

impressão do texto, como, por exemplo, o escore inicial, o número de


foguetes, e a quantidade de combustível. Estas são quantidades que mu­
dam durante o curso do jogo mas que possuem um valor inicial que
aparece na tela antes de o jogo começar.
A seção Ciclo Principal (linhas 1000-5000) é a mais importante, pois
inclui o código para os lances do jogo. Esta é a seção que faz as espaço-
naves voarem, alienígenas se moverem, bombas caírem e balas atirarem.
Cronômetros e contadores (explicados no próximo parágrafo) são incre­
mentados e qualquer entrada do jogador via teclado, paddles, joystick,
ou mouse acontece aqui.
O ciclo principal é o conceito mais importante em programação de
jogos de ação. Um ciclo é uma série de passos ou instruções que são
repetidas muitas vezes. Em jogos de ação, o ciclo principal é geralmente
repetido até que o jogo é vencido ou perdido. Durante cada passagem
pelo ciclo, todas as figuras animadas movem-se de um incremento. O in­
cremento pode ser um ponto, dois pontos, ou até dez ou doze pontos,
dependendo do ritmo de movimento (zero pontos, se um objeto está tem­
porariamente parado). Se você tem um cronômetro com o jogo, cada
passagem pelo ciclo principal pode incrementar o cronômetro de 0,1 para
que em todas as dez passagens pelo ciclo, o tempo aumente (ou diminua)
de um. Do mesmo modo, o combustível de sua espaçonave pode diminuir
de um certo incremento durante cada passagem pelo ciclo principal. Se
você atinge Um alienígena, então o número de alienígenas e o escore do
jogador mudarão durante esta passagem pelo ciclo principal.
O mais importante, a entrada via jogador é verificada durante cada
passagem pelo ciclo principal. O programa pega os valores novos do
paddle, joystick, ou mouse, pega a nova entrada via teclado (se uma tecla
foi pressionada), ou verifica se o botão do paddle foi pressionado. Depois
de verificar a entrada via jogador, a ação produzida pelo ciclo principal
pode ser modificada, por exemplo: a direção da espaçonave pode mudar,
uma bala pode começar a mover-se, ou uma bomba começar a cair.
Quando o jogo acaba, o programa sai do ciclo principal. Isto geralmente
acontece, por exemplo, quando todos os alienígenas foram aniquilados
(você ganha), ou todas,as naves foram destruídas (vecê perde).
A seção Sub-rotinas (linhas 6000-9980) contém sub-rotinas do pro­
grama. Estas incluem rotinas que centralizam a impressão, rotinas de
explosão, seqüências de sons, e cálculos de escores, entre outras. Nós
escassamente usamos sub-rotinas neste livro, pois chamadas de sub-ro­
tinas gastam tempo e portanto atrasam o jogo. Se sub-rotinas dependen­
tes de ação são usadas, recomendamos colocá-las perto do início do
programa para aumentar a velocidade. Entretanto, nenhuma das sub-ro­
tinas deste livro é assim tão gránde que colocando-a perto do começo
faria muita diferença na velocidade.
As três últimas seções de programação dadas no Quadro 2.1 estão
intimamente relacionadas, e explicam-se por si próprias. A seção Ganhar
Jogo é executada quando o jogador ganha o jogo. Muitos jogos não têm
esta seção, pois o objetivo é fazer um escore máximo, não vencer. Por
outro lado, a seção Perder Jogo está incluída em quase todos os jogos,
Fundamentos da Criação de Jogos 15

como seu soldado morre ou seu canhão explode ou sua espaçonave fica
sem combustível. A seção Fim de Jogo geralmente mostra o escore final,
o tempo, o nível final, e informações parecidas. Esta seção pode pergun­
tar ao jogador se ele quer jogar novamente.

TÉCNICAS ESPECIAIS DE PROGRAMAÇÃO


Cada jogo deste livro exemplifica duas ou mais técnicas ou métodos
de programação para fazer jogos de ação melhores para o seu Apple.
Estes métodos incluem: entrada via teclado e cronômetros de jogos (Ca­
pítulo 4); contadores de jogos e inimigos aleatórios (Capítulo 5); paddles,
movimento da tela, e seleção de níveis de dificuldade (Capítulo 6); música
e efeitos sonoros (Capítulo 7); níveis automáticos de dificuldade, posições
aleatórias, e velocidades que variam (Capítulo 8); soltar bombas e atirar
balas, animação de objetos múltiplos, acelerando o Applesoft (Capítulo 9);
joysticks, botões de paddles, e explosões em baixa resolução (Capítulo
10); gráficos de alta resolução (Capítulos 11-12); animação em alta reso­
lução, colisões, e texto na tela de alta resolução (Capítulo 13); explosão
em alta resolução e animação de figuras múltiplas (Capítulo 14); jogos de
dois jogadores e seleção de entrada (Capítulo 15); fundos em alta reso­
lução, balas dirigíveis, e expressões booleanas (Capítulo 16); inimigos
“inteligentes” e gravação do escore máximo para o disco (Capítulo 17).
Gastando seu tempo para ler cada um desses capítulos, para estudar
os programas e para jogar os jogos, você aprenderá a maioria das técni­
cas necessárias para se fazer qualquer tipo de jogo de ação.
CAPÍTULO 3
GRÁFICOS E ANIMAÇÃO
Gráficos e Animação 17

A essência dos jogos de ação para computadores são gráficos agu­


çados e suave animação.

GRÁFICOS

Todos os jogos apresentados neste livro envolvem algum tipo de


gráfico. Os primeiros sete jogos são gráficos de baixa resolução. Isto
quer dizer que o menor ponto na tela gráfica é um retângulo quase do
tamanho de uma borracha para lápis. Quarenta pontos lado a lado pre­
enchem toda a tela gráfica, o que quer dizer que a dimensão da tela de
baixa resolução é de 40 x 40 pontos.
Os últimos quatro jogos são de gráficos de alta resolução. Isto quer
dizer que cada ponto é quase do tamanho de um ponto-final (.). As dimen­
sões da tela de alta resolução são 280 x 160 pontos em modo gráficos e
texto misturados ou 280 x 192 em modo gráficos total (estes modos dife­
rentes serão explicados no Capítulo 11).
As vantagens de se usarem gráficos de baixa resolução ao invés de
alta resolução nos seus jogos em Applesoft são as seguintes: a progra­
mação é mais simples; a animação é geralment.e mais rápida; há mais
cores disponíveis.
Não caia na armadilha de pensar que jogos de alta resolução são
necessariamente mais divertidos que jogos de baixa resolução. De fato,
alguns dos jogos mais excitantes de ação-reunida em Applesoft são de
gráficos de baixa resolução.
A única vantagem — mas esta é importante — de gráficos de alta
resolução é que você pode colocar figuras significativas, como espaço-
naves, tanques, pistolas, alienígenas e pessoas, na tela do computador.
Discutiremos em detalhes gráficos de alta resolução nos Capítulos 11 e
12 e forneceremos a você as ferramentas necessárias para desenhar e
criar figuras de alta resolução.

PRECEITOS PARA GRÁFICOS DE BAIXA RESOLUÇÃO

Se você tem experiência em programar gráficos de baixa resolução,


pule esta seção e vá diretamente para a seção de animação. Mas se você
não é familiar a gráficos de baixa resolução, ou se você precisa de uma
revisão, puxe uma cadeira para perto de seu Apple, insira o disco Jogos
de Ação, ligue o computador e continue a ler.

A Tela de Gráficos de Baixa Resolução

Depois de você carregar o seu disco Jogos de Ação, você verá o


menu do disco. Como você não jogará um jogo ou usará um utilitário
agora, tecle <ESC> para sair do menu e ir para o BASIC.
Você deverá estar olhando agora para uma tela de monitor vazia,
exceto por dois símbolos: um colchete direito (]), chamado de prompt do
Applesoft; e um retângulo piscante, chamado de cursor.
18 Jogos de Ação para o Apple

Vamos fazer um programa curto, uma linha por vez, para demonstrar
o uso dos gráficos de baixa resolução. (Se você precisa recapitular como
entrar programas Applesoft no seu computador, leia o Capítulo 1.) Comece
digitando no teclado do seu Apple o seguinte: “100 GR : HOME”. Você
deve teclar < RETURN > ao final de cada linha mesmo que você não for
avisado para fazê-lo. Quando você roda (RUN) o programa, o gue é que
você vê?
O comando GR muda o display do Apple de texto para gráficos de
baixa resolução. Na verdade GR faz com que muitas coisas aconteçam:
ele limpa a tela de baixa resolução (quer dizer, ajusta todos os pontos
para preto); fixa a janela de texto para as quatro últimas linhas da tela,
mas não limpa esta janela; move o cursor para o canto esquerdo inferior
da janela de texto, como se você tivesse executado os comandos “VTAB
23: HTAB 1”; fixa a cor de baixa resolução em 0 (zero) que é preta.
Como o comando GR não limpa à janela de texto, a linha 100 também
inclui o comando familiar HOME. O comando HOME limpa a janela de
texto e coloca o cursor no canto superior esquerdo desta.
Você pode sair do modo gráficos de baixa resolução e voltar ao modo
texto com o comando “TEXT”, que você deverá digitar agora. Você usará
o comando TEXT mais tarde no programa-exemplo.
Continue o programa como segue:

120 COLOR — 15
140 PLOT 0,0: PLOT 39,0: PLOT 0,39: PLOT 39,39
160 COLOR = 1: PLOT 20,20

Depois da você tèr digitado estas três linhas, rode (RÜN) o programa
para ver o que acontece. A linha 120 fixa a cor de baixa resolução em 15.
Isto é necessário, pois, como dito acima, ó comando GR fixa automatica­
mente a cor de baixa resolução em 0. O Quadro 3.1 mostra as dezesseis
cores possíveis de baixa resolução e seus números correspondentes
(0-15). Como você pode ver, “COLOR = 15” ajusta a cor para branco.
Na linha 160, a cor é reajustada para vermelho (cor número 1).

QUADRO 3.1
CORES DE BAIXA RESOLUÇÃO NO APPLE E
SEUS NÚMEROS
0 = preto 4 = verde escuro 8- marrom 12 = verde
1 = vermelho 5 = cinza 9— Jaranja 13 = amarelo
2 = azul escuro 6 = azul médio 10 = cinza 14 = água
3 = roxo 7 = azul claro 11 = rosa 15 = branco

A linha 140 do programa-exemplo desenha quatro pontos quadrados


e brancos em cada um dos cantos da tela gráfica de baixa resolução. Isto
demonstra a organização da tela de baixa resolução. Ela é dividida em
Gráficos e Animação 19

uma rede com 1600 pontos: quarenta pontos na direção horizontal (X) e
quarenta pontos na direção vertical (Y). Cada um desses pontos é rela­
cionado a dois números. O primeiro é o valor X e o segundo é o valor Y.
Como são usados aqui, X e Y são chamados de coordenadas da tela.
A coordenada X é numerada do lado esquerdo da tela e a coordenada
Y é numerada do topo da tela.
A linha 160 fixa a cor em vermelho com COLOR = 1, depois desenha
outro ponto no meio da tela. O comando PLOT 20,20 desenha o ponto
vermelho na posição X,Y = 20,20, quer dizer, vinte pontos do lado esquer­
do da tela e vinte pontos do topo da tela.
Mesmo que você não tenha um monitor a cores, você pode notar a di­
ferença entre os pontos brancos e vermelhos na tela porque seus modelos
de pixel são diferentes. LTm pixel — ou “picture element” (elemento de
figura) — é um dos pontos pequeninos na tela, usados para desenhar
caracteres de texto e pontos gráficos. '
Tente desenhar mais pontos e mais cores. Depois de rodar (RUN)
o programa cada vez, digite “TEXT” para voltar ao modo texto antes de
você continuar digitando novas linhas. Agora digite o seguinte para con­
tinuar o programa:

180 PLOT 0,2

Você deverá ser capaz de adivinhar antecipadamente a posição e a


cor do ponto desenhado na linha 180. A posição X,Y = 0,2 é zero pontos
na direção horizontal (quer dizer, na borda esquerda da tela) e dois pontos
na direção vertical (quer dizer, dois pontos abaixo do topo da tela).
O ponto é vermelho pois o comando COLOR mais recente fixou o valor
da cor em 1.

200 COLOR = 12: PLOT 37,20

Isto desenha um ponto verde perto do lado direito da tela (na verda­
de dois pontos para a esquerda da borda direita), e na metade do cami­
nho para baixo do topo, em X,Y — 37,20.
Se você quiser desenhar uma fileira ou coluna de pontos todos da
mesma cor, pode usar os comandos VLIN ou HLIN, como mostrado na
próxima linha do programa:

220 COLOR = 2: HLIN 10,30 AT 5: VLIN 0,39 AT 22

Com esta nova linha digitada, rode (RUN) o programa. A linha 220
ajusta a cor para azul êscuro, depois desenha duas linhas ha tela: uma
horizontal indo do meio do lado esquerdo para o meio dó lado direito e
uma vertical indo de cima para baixo, perto do lado direito do centro. As
duas linhas se cruzam na posição X,Y = 22,5.
No comando HLIN, os primeiros dois números (10,30) indicam as po­
sições horizontais de começo e fim (valores X), respectivamente. O ter­
ceiro número (5) indica a posição vertical (valor Y) da linha. Da mesma
maneira, no comando VLIN, os primeiros dois números (0,39) indicam as
20 Jogos de Ação para o Apple

posições verticais de começo e fim (valores Y), respectivamente, e o ter­


ceiro número (22) indica a posição horizontal (valor X) da linha.
As seguintes linhas do programa-exemplo demonstram outro coman­
do importante de gráficos de baixa resolução:

240 A = SCRN( 0,0): B = SCRN( 22,5): C = SCRN( 37,20)


260 PRINT A, B, C

Quando você rodar (RUN) o programa, você verá três números im­
pressos na base da tela na janela de texto, logo abaixo da tela gráfica.
O primeiro número, 15, é o valor da variável A. O segundo, 2, é o valor
da variável B. O terceiro, 12, é o valor de C. A linha 240 ajusta A para a
cor encontrada nas coordenadas X,Y = 0,0 usàndo o comando SCRN
(“screen” = tela). Resumindo, SCRN (X,Y) dá a cor do ponto encon­
trado na posição X,Y. Portanto, a linha 240 ajusta B para a cor encontra­
da em X,Y = 22,5, e ajusta C para a cor encontrada em X,Y = 37,20. Se
você olhar com atenção as linhas anteriores do programa, verá que a
posição 0,0 tem um ponto de cor 15 (branco); a posição 22,5 tem um
ponto de cor 2 (azul escuro) e a posição 37,20 tem urj ponto de cor 12
(verde).
Para completar o programa-exemplo, digite as linhas:

280 INPUT “TECLE RETURN PARA PARAR”; AS


300 TEXT: HOME

onde 6 comando TEXT muda os modos de gráficos para tudo texto e


move o cursor para o canto inferior esquerdo da tela. Neste exemplo, o
comando HOME segue imediatamente TEXT para limpar a tela de texto
do “lixo” deixado pelos gráficos de baixa resolução e mover o cursor
para sua posição de origem.
Estes são todos os comandos de gráficos de baixa resolução. Eles
estão resumidos no Quadro 3.2. Note o uso do símbolo expra. Isto signi­
fica qualquer expressão Applesoft que computa a um número dentro de
um limite permitido. Por exemplo, você pode ajustar a cor de baixa reso­
lução com o comando “COLOR - expra” onde o limite permitido é de
0 a 15. Agora se Z = 12, a expressão (Z/2) + 3 é igual a 9, e portanto o
comando “COLOR = (Z/2) + 3” é válido; ele ajustará a cor para laranja.
Se uma expra cai fora do limite válido, você receberá a mensagem
“7ÍLLEGAL QUANTITY ERROR”.
Além do Quadro 3.2, você pode consultar o Manual de Referência do
Programador de Applesoft BASIC para uma discussão detalhada de cada
um dos comandos de baixa resolução.
Gráficos e Animação 21

QUADRO 3.2

RESUMO DOS COMANDOS DE GRÁFICOS DE


BAIXA RESOLUÇÃO

SINTAXE DO COMANDO FUNÇÃO

GR Fixa o modo gráficos de baixa resolução; lim­


pa a tela gráfica; fixa a cor em 0; ajusta a
janela de texto para as quatro últimas linhas;
move o cursor para dentro da janela de texto.
COLOR = expra Seleciona a cor de baixa resolução. Ajusta a
cor para o valor da expressão Applesoft (ex­
pra) de acordo com o Quadro 3.1. A expra
deve estar no limite 0-15.
PLOT expral, expra2 Desenha um ponto na tela de baixa resolu­
ção na posição horizontal expral da esquer­
da da tela e a posição vertical expra2 do topo
da tela. 0 limite válido para os valores de
ambas as expral e expra2 é de 0 a 39. As
expressões expral e expra2 são chamadas
de coordenadas; expral é freqüentemente
chamada de coordenada X e expra2, coor­
denada Y.
HLIN expral, expra2 Desenha uma linha horizontal de expral até
AT expra3 expra2 na posição vertical expra3.
VLIN expral, expra2 Desenha uma linha vertical de expral até
AT expra3 expra2 na posição horizontal expra3.
TEXT Ajusta a tela para o modo texto (sai do modo
gráficos); coloca o cursor no canto esquerdo
inferior da tela.

ANIMAÇÃO

Criar figuras que se movem na tela de baixa resolução não é tão


difícil quanto você possa pensar. Praticamente, você desenha uma figura
na tela gráfica; apaga a figura; depois desenha-a em uma nova posição.
Mais especificamente o procedimento seguinte produz suave animação.

Os Sete Passos da Animação

1. Ajuste as coordenadas iniciais e desenhe a figura na tela gráfica. Nos


gráficos de baixa resolução isto envolvería, por exemplo, as declarações
22 Jogos de Ação para o Apple

simples “COLOR = 12: X = 20: Y = 10: PLOT X,Y", que fariam um


ponto verde na posição 20,10.
2. Guarde as coordenadas da posição corrente porque as coordenadas X
e Y da figura devem mudar conforme ela se mova na tela. Declarações
como “X1 = X: Y1 = Y” ajustarão X1,Y1 para a posição X,Y corrente
para que as últimas variáveis possam ser modificadas.
3. Calcule as novas coordenadas. Por exemplo, se um ponto estiver cor­
rentemente em X,Y = 5,10 e você quer que a figura se mova uma posi­
ção para a direita, você precisa somar 1 ao valor X. Isto é feito com a
declaração simples “X = X + 1”.
4. Verifique se as novas coordenadas estão dentro dos limites da tela grá­
fica. Por exemplo, como as coordenadas X e Y de uma espaçonave va-
riam durante o curso do jogo devido as entradas do jogador, as chances
são de que o jogador dirigirá a espaçonave para a borda da tela e então
tentar sair da tela. Se o valor corrente de X for 39 e a espaçonave tentar
mover 1 mais para a direita, X seria 40, que é uma quantidade ilegal nos
gráficos de baixa resolução. Portanto, depois do Passo 3 acima, você
precisa ter uma declaração como “IF X > 39 THEN X = 39” para man­
ter a nave na tela. Para uma discussão completa deste assunto, veja o
Capítulo 5.
5. Apague a figura da posição anterior. Nos gráficos de baixa resolução
isto é feito facilmente com as declarações “COLOR = 0: PLOT X1,Y1”,
onde XI e Y1 foram ajustadas no Passo 2.
6. Desenhe a figura na nOvà posição. Se você o fizer logo depois do Pas­
so 4, a animação será suave, com o mínimo piscar da figura. Os comãh-
dos nos gráficos de baixa resolução seriam “COLOR = 12: PLOT X,Y”.
7. Volte ao Passo 2 para continuar a animação.
Se você seguiu os exemplos de todos os passos, observou que um
ponto em X,Y = 20,10 moveu rápida e suavemente para a posição X,Y =
21,10. Repetindo várias vezes os Passos 1 até 5, você pode mover a figura
(ou ponto) em qualquer lugar da tela gráfica.
O seguinte programa curto demonstra cada um dos sete passos aci­
ma animando um ponto de um lado para o outro e para baixo na tela
gráfica. Digite e rode (RUN) o programa.

100 GR : HOME : COLOR = 15


120 X = 0:Y = 0: PLOT X.Y
140 X1 = X:Y1 = Y
160 X=X+1
180 IF X > 39 THEN X = 0:Y = Y + 1:
IF Y > 39 THEN TEXT : HOME : END
200 COLOR = 0:PLOTX1,Y1
220 COLOR 15.PLOTX.Y
240 GOT0140

Se você quiser gravar este programa para o disco, digite “SAVE


DEMO.ANIM”.
Gráficos e Animação 23

A linha 100 inicializa a tela de baixa resolução e a janela de texto e


ajusta a cor inicial. Os sete passos de animação começam na linha 120
com o Passo 1, ajustando as coordenadas iniciais (X,Y = 0,0) e desenhan­
do o ponto inicial na tela. A linha 140 (Passo 2) guarda a posição corrente
do ponto. A linha 160 (Passo 3) calcula a nova posição, que no caso é um
ponto para a direita da posição antiga. A linha 180 (Passo 4) certifica que
o ponto não saia da tela, pois quando a coordenada X atinge o extremo
direito do lado da tela, seu valor é ajustado de volta para zero e Y é
aumentado para a próxima linha de baixo. A linha 200 (Passo 5) apaga a
posição do ponto antigo ajustando a cor para zero (preto) e desenhando
(PLOT) na posição antiga (X1,Y1). A linha 220 (Passo 6) desenha (PLOT)
o ponto na nova posição. E, finalmente, a linha 240 (Passo 7) faz com que
o processo comece de novo na linha 140 (Passo 2). Os programas-exem-
plos deste livro demonstram várias vezes esta técnica de animação e
como ela é aplicada em um programa de jogo.
A animação nos gráficos de alta resolução segue essencialmente os
mesmos fundamentos, como explicado no Capítulo 13. Os gráficos de
alta resolução serão totalmente explicados nos Capítulos 13 até 17.
Com a introdução para a criação de programas no Capítulo 2 e o
entendimento de gráficos e animação deste capítulo, você está pronto
para aplicar estas técnicas na criação de jogos para computadores.
CAPITULO 4
SNAKE
Snake 25

0 primeiro jogo-exemplo, Snake, é curto e simples, mas rápido e de­


safiador. Você é uma serpente que cresce a cada segundo que passa. Seu
objetivo é sobreviver por 60 segundos sem colidir com nenhuma barreira
ou com você mesmo. Se você vencer a corrida contra o tempo, você ven­
ce o jogo. Mas se você bater em uma barreira, você se autodestrói!
Este programa demonstra vários conceitos ou técnicas importantes
no desenvolvimento de jogos de computador: organização geral de pro­
grama; gráficos e animação; o ciclo principal; controle de teclado; efeitos
simples de som; o cronômetro do jogo; e o término do programa.

COMO JOGAR SNAKE

Digite o programa em Applesoft BASIC dado na Listagem 4.1. Se você


é novo em programação BASIC, releia o Capítulo 1, sobre como digitar e
gravar programas em Applesoft BASIC. Grave o programa em seu disco
Jogos de Ação, digitando “SAVE SNAKE” e teclando <RETURN>.
Para começar o jogo, digite “RUN” se o programa estiver na memó­
ria, ou digite “RUN SNAKE” se o programa precisar ser carregado do dis­
co. Você também pode selecionar Snake do menu do STARTUP quando
você primeiro carrega o disco Jogos de Ação.
Quando o programa é executado, ele vai imediatamente para os grá­
ficos de baixa resolução, barreiras aparecem na tela, e o jogo começa.
Você verá uma serpente que cresce cada vez mais, começando-se no
canto superior esquerdo da tela e movendo-se da esquerda para a direi­
ta. Você controla a direção do movimento com as seguintes teclas:

, (vírgula) : Mover para a esquerda


. (ponto) : Mover para a direita
A : Mover para cima
Z : Mover para baixo

Seu objetivo é guiar a serpente ao redor da tela por 60 segundos, sem


colidir em uma barreira ou em você mesmo.
Se você perder, você será avisado sobre seu tempo corrente, que é o
número de segundos que resta no relógio. Após o término do jogo, você
será perguntado se quer jogar novamente. Tecle “S” para sim ou “N”
para não.
Enquanto digita e roda o programa, você irá sem dúvida encontrar
erros causados por falhas em sua digitação. Se você precisar de ajuda
para achar e corrigir estes erros, leia Como Corrigir Programas em Apple­
soft BASIC no Apêndice A.
Você pode achar que o jogo é muito difícil, uma vez que você tenha
digitado e rodado o programa. A seção Melhorias e Modificações no final
deste capítulo dá várias sugestões em como tornar o jogo mais fácil.
26 Jogos de Ação para o Apple

EXPLICAÇÃO DO PROGRAMA
Snake segue a Organização Geral de Programas dada no Capítulo 2,
mas não inclui uma seção de introdução.
O Quadro 4.1 dá as variáveis chaves em Snake.

QUADRO 4.1
VARIÁVEIS PRINCIPAIS EM SNAKE
VARIÁVEL EXPLICAÇÃO
MX Movimento de X; quantia somada a X para a próxima
posição
MY Movimento de Y; quantia somada a Y para a próxima
posição
TL Contador de tempo do ciclo; usado para contagem
correta de tempo
TM Tempo restante no jogo
X Posião (horizontal) X da tela de baixa resolução da
serpente
Y Posição (vertical) Y da tela de baixa resolução da
serpente

Organização do Programa
As linhas 10-90 são declarações REM com o título do jogo e o aviso
de copyright. O Arranjo do Programa começa na linha 500, limpando a
tela de texto com um comando HOME. Então o Arranjo do Programa vai
para os gráficos de baixa resolução com o comando GR. Finalmente, ele
ajusta duas variáveis associadas com o cronômetro do jogo. A primeira
destas é TM, que é ajustada para 60, o número inicial de segundos do cro­
nômetro. A segunda variável controladora do tempo é TL, que conta o nú­
mero de vezes através do ciclo principal. Como dez vezes através do ciclo
principal do programa demoram aproximadamente um segundo, TM é di­
minuída de 1 quando TL aumenta para 10 (veja linha 2140).
A linha 520 move o indicador da tela para a linha 23 da tela de texto
(VTAB 23), que é a segunda linha de baixo, e então mostra o vaflor inicial
do tempo. A linha 560 desenha duas barreiras verticais na tela; isto au-
rhenta significativamente a dificuldade do jogo.
X linha 600 desenha uma borda ao redpr da tela. Isto serve como uma
barreira para não deixar que a serpente sala da extremidade da tela. As
linhas 640 e 660 desenham a posição inicial da serpente na tela de baixa
resolução, ajustando então as variáveis de movimento MX e MY para seus
valores iniciais. Se você entender a função dé MX e MY, você entenderá
como a animação é programada na maioria dos jogos deste livro.
Snake 27

Animação
Para mover a serpente na tela de gráficos, o programa segue a ver­
são simplificada dos sete passos da animação resumidos no Capítulo 3.
Não precisamos guardar as coordenadas antigas (Passo 2) ou apagar a
posição antiga (Passo 5), pois a serpente mais cresce, preferivelmente, do
que se move (anima). Além do mais, porque a tela de baixa resolução está
envolvida em uma borda, apenas verificamos se ela se choca com uma
barreira. Não precisamos verificar os limites da serpente que cresce cada
vez mais.
A posição inicial (X e Y) da serpente é fixada e a serpente é desenha­
da na linha 640. No ciclo principal, a nova posição é calculada, então o
novo ponto é desenhado. Isto é feito com as declarações “X = X + MX:
Y = Y + MY” na linha 2000, e “PLOT X,Y” na linha 2120. Em Snake, a
nova posição é sempre adjacente à posição corrente para a direita, es­
querda, acima ou abaixo. Quando você quer mover para a direita, mas
não mover para cima ou para baixo, o novo valor de X deve ser igual ao
X antigo mais 1, por isso MX deve ser igual a 1. Ao mesmo tempo, o novo
valor de Y deve ser igual ao Y antigo, desde que a serpente não se mova
para cima ou para baixo. Por isso, MY deve ser igual a 0. Estes são os
valores iniciais de MX e MY ajustados na linha 660. Para mudar a direção
da serpente, o programa muda MX e MY, como será explicado mais
adiante.

Ciclo Principal

A linha 1000 começa o ciclo principal. Como foi mencionado no Capí­


tulo 2, o ciclo principal é a seção do programa contendo instruções para
a ação do jogo. Em Snake o ciclo principal contém programação para as
entradas do jogador via teclado, o movimento da serpente e o cronômetro
do jogo.

Entradas Via Teclado


Na linha 1000 o programa lê (PEEK) a posição de memória - 16384.
Esta posição de memória é um endereço especial de hardware no compu­
tador Apple. O valor lá armazenado depende da tecla mais recentemente
pressionada. Se lá o valor é menor que 128, nenhuma tecla foi pressiona­
da. Em Snake, se nenhuma tecla for pressionada, a serpente continuará
movendo-se em sua direção corrente e o cronômetro continuará correndo.
Se uma tecla foi pressionada, a linha 1020 recebe este caractere e o
atribui à variável AS. As linhas 1040 a 1100 mudam os valores de MX e
MY, e, portanto, mudam a direção da serpente, de acordo com a tecla que
foi pressionada.
As linhas 2000 e 2120 movem a serpente. A linha 2100 verifica a cor
da tela onde a serpente irá se mover. Se a cor for 0, a tela será preta e á
serpente estará livre para se mover. Se a cor for um número que não 0,
uma barreira (ou a própria serpente) já estará nesta posição, e então
28 Jogos de Ação para o Apple

uma colisão ocorrerá. A colisão faz com que o programa vá para a linha
15000, a seção “perder jogo”. Se não há colisão, a linha 2120 desenha a
nova posição da serpente.

Efeitos Sonoros
A linha 2120 também dá ao jogo efeitos sonoros simples. O diafragma
do alto-falante do Apple se move para dentro e para fora para produzir
som. Lendo (PEEK) a posição especial de memória - 16336 move o dia­
fragma do alto-falante para dentro (se ele estiver fora) ou para fora (se ele
estiver dentro). Todo outro acesso ao alto-falante produzirá um clique au­
dível porque o alto-falante faz um som somente quando o diafragma se
move para fora. Então você deve dar dois PEEKs cada vez através do ciclo
principal para fazer um clique.

Cronômetros de Jogos
A linha 2140 controla a contagem de tempo do programa como foi
explicado acima. Na declaração “PRINT TM;“ ” ” você deve imprimir um
espaço seguindo imediatamente o tempo para apagar o zero quando o
tempo vai de 10 para 9. Sem imprimir “ ”, o tempo do programa aparece­
ría contar regressivamente de 10 para 90.
O ciclo principal acaba com a linha 5000, que faz com que o progra­
ma retorne à linha 1000 para verificar novamente por entrada via teclado.
Finalmente, as linhas 10000 a 20040 mostram os resultados do jogo.

MELHORIAS E MODIFICAÇÕES

Se o jogo for muito difícil no inicio, você poderá modificá-lo de três


maneiras:
1. Apague a linha 560 digitando “560” < RETURN >. Isto remove as duas
barreiras verticais da tela.
2. Você normalmente tem sessenta segundos para manter a serpente viva.
Diminuindo o tempo, para trinta segundos por exemplo, você pode ven­
cer mais facilmente. Para fazer isto, fixe TM — 30 na linha 500.
3. Se o fogo for muito rápido, adicione “2160 FOR J = 1 TO 50: NEXT J”.
Isto causará um pequeno atraso no ciclo principal. Para fazer um atra­
so maior, mude o 50 para um número maior, como, por exemplo, 100.
Outras melhorias possíveis incluem o seguinte: fazer o jogo para dois
jogadores; usar o joystick como o periférico de entrada para guiar a ser­
pente; e incluir melhores efeitos sonoros. Nós lhe mostraremos como pro­
gramar estas melhorias em capítulos posteriores.
Snake 29

Listagem 4.1: SNAKE

10 REM ************************
20 REM * SNAKE *
30 REM * BY SCOTT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM
90 REM
490 REM

ARRANJO:

500 HOME : GR :TM = 60:TL = O


520 VTAB 23: PRINT ,,TEMPO=!I; TM
550 REM

BARREIRAS:

560 COLOR= 1: VLIN 8,30 AT 10: VLIN 8,30 AT


30
590 REM

BORDA:

600 COLOR= 12: VLIN 0,39 AT O: VLIN 0,39 AT


39: HLIN 0,39 AT 0: HLIN 0,39 AT 39
630 REM

INICIALIZA SERPENTE:

640 X = 1:Y = 1: COLOR= 15: PLOT X,Y


660 MX = 1:MY = 0
990 REM

CICLO PRINCIPAL:

1000 IF PEEK ( - 16384) < 128 THEN 200Q


1020 GET At
1040 IF M = 11 ■ THEN MX
It = 1:MY - 0
1060 IF At = ft
5 THEN MX
11
= - 1:MY = 0
1080 IF At = "A" THEN MX = O:MY = - 1
1100 IF At = 11Z ” THEN MX = O:MY = 1
1990 REM
30 Jogos de Ação para o Apple

MOVE SERPENTE:

2000 X = X + MX:Y = Y + MY
2100 IF SCRNt X»Y) < > 0 THEN 15000
2120 PLOT X,Y:S = PEEK ( - 16336) + PEEK (
— 16336)
2130 REM

CRONOMETRO DO JOGO:

2140 TL = TL + 1: IF TL = 10 THEN TM = TM - 1:
TL = O: VTAB 23: HTAB 7: PRINT TM; " ":
IF TM = 0 THEN 10000
4990 REM

FIM DO CICLO PRINCIPAL:

5000 GOTO 1000


9990 REM

FINAIS DE PERDER E GANHAR:

10000 CALL - 198: TEXT : HOME : PRINT "VOCE


GANHOU!": GOTO 20000
15000 TEXT : HOME : PRINT "TEMPO»";TM: PRINT "VOCE
PERDEU!"
20000 CALL - 198: VTAB 5: HTAB 1: PRINT "QUER
JOGAR DE NOVO? ";: GET AT
20020 IF AT = "S" THEN 500
20040 IF AT < > "N" THEN 20000
CAPÍTULO 5
WIPEOUT
32 Jogos de Ação para o Apple

Você é o comandante de uma nave estelar do século 21. Suas ordens


são as de proteger a galáxia dos maliciosos alienígenas atacantes. Cin-
qüenta Kloryons invadiram o seu setor da galáxia e soltaram minas espa­
ciais mortais que impedem sua missão. Você deve evitar colidir com as
minas espaciais e destruir todos os Kloryons em sessenta segundos ou
você e o restante do universo estão condenados!
Wipeout introduz os fundamentos e melhorias de jogos de contadores
de jogo, inimigos aleatórios, usando as teclas de seta como entrada e
usando o mouse do Apple. Este jogo também .demonstra as técnicas de
programação que você aprendeu nos Capítulos 2 e 3.

COMO JOGAR WIPEOUT

Digite Wipeout (Listagem 5.1) no seu computador. Se você ainda tem


dúvidas sobre como entrar programas Applesoft releia o Capítulo 1. Se
você ainda tem dúvidas sobre como corrigir programas Applesoft, releia
o Apêndice A. Grave o programa para o seu disco Jogos de Ação digitan­
do “SAVE WIPEOUT”.
Para começar Wipeout, digite “RUN” se o programa está na memó­
ria, ou digite “RUN WIPEOUT” se o programa precisa ser carregado do
disco, ou selecione Wipeout do menu de STARTUP de seu disco Jogos de
Ação.
Você verá primeiro a página de título do programa Wipeout seguindo-
se a mensagem “PRESSIONE A BARRA DE ESPAÇO -> ” na base da pá­
gina. Pressione a barra de espaço para começar o jogo. O programa irá
então para gráficos de baixa resolução e a tela se encherá de pontos de
baixa resolução. Os cinqüenta pontos brancos representam os Kloryons e
os dez pontos vermelhos representam as minas espaciais. Um único pon­
to verde no centro inferior da tela representa sua nave estelar. Se você
não tem um monitor a cores, pode ainda distinguir entre estes pontos por
causa dos seus diferentes modelos de display.
A nave estelar se move automaticamente da esquerda para a direita
quando o programa começa. Para mudar a direção do movimento, pres­
sione as seguinte teclas (as mesmas teclas usadas em Snake, Capítulo 4):

, (vírgula) : Mover para esquerda


. (ponto) : Mover para direita
A : Mover para cima
Z : Mover para baixo

O objetivo do jogo é guiar sua nave para que ela colida com os Klo­
ryons e a todos destrua antes que o tempo se esgote. O programa-registra
na base da tela o número de Kloryons e o tempo restante.
Conforme você navega com sua nave estelar, você perceberá que
quando a nave estelar sai de um lado da tela, ela aparece imediatamente
no outro lado. Isto se chama “wrap-around”. Você pode usar o “wrap­
around” como uma vantagem no seu plano de ataque aos Kloryons. Mas
Wipeout 33

tome cuidado! Você pode ser morto em uma mina espacial, se ultrapassar
a tela cegamente.
Ganhando ou perdendo o jogo, você fica sabendo o número de Klo­
ryons restantes (zero Kloryons significa que você ganha) e o tempo res­
tante (zero tempo significa que você perde). Você será perguntado tam­
bém se quer jogar novamente. Pressione “S” para sim ou *‘N” para não.

EXPLICAÇÃO DO PROGRAMA
Wipeout segue a Organização Geral de Programas dada no Capítulo
2, incluindo uma seção introdução. As linhas 10-90 são declarações REM
com o nome do jogo e o aviso de copyright. A linha 200 certifica que o
programa começa no modo texto e limpa a tela de texto. '
As variáveis-chaves de Wipeout são dadas no Quadro 5.1.

QUADRO 5.1
VARIÁVEIS PRINCIPAIS EM WIPEOUT
VARIÁVEL EXPLICAÇÃO
KL Número de Kloryons restantes na tela
MX Movimento de X; quantia somada a X para a próxima
posição
MY Movimento de Y; quantia somada a Y para a próxima
posição
S Variável temporária para soar o alto-falante
SM Número de minas espaciais
SN Constante igual a -16336, o endereço do alto-falante
SP Posição da tela; verifica por colisões
TL Contador de tempo do ciclo; usado para contagem
correta do tempo
TM Tempo restante no jogo
X Posição X (horizontal) da tela de baixa resolução da
nave estelar
X1 Coordenada X antiga da nave estelar
Y Posição Y (vertical) da tela de baixa resolução da nave
estelar
Y1 Coordenada Y antiga da nave estelar

Animação

Wipeout ilustra cláramente os sete passos da animação descritos em


detalhes no Capítulo 3.-
34 Jogos de Ação para o Apple

1. As coordenadas iniciais de sua nave estelar são ajustadas na linha 800.


Aqui a cor da nave estelar é ajustada para 12 (verde), os valores de X e
Y são ajustados para 20,39, que é o centro inferior da tela e a nave este­
lar é desenhada. (Além disso, as variáveis de movimento, MX e MY, são
ajustadas para 1 e 0, respectivamente. Isto é explicado no Passo 3
abaixo).
2. Antes de a nova posição da nave estelar ser desenhada, as coordena­
das correntes (que se tornam as coordenadas antigas quando as novas
são calculadas) são guardadas na linha 2000 usando as variáveis X1 e
Y1 (ver Quadro 5.1).
3. As novas coordenadas são calculadas na linha 2020. Isto é feito adicio­
nando MX para o valor corrente de X e MY para o valor corrente de Y.
Os valores verdadeiros de MX e MY dependem, é claro, da direção çor-
rente do movimento de sua nave estelar. Se a nave vai'se mover para a
direita, o valor X deve aumentar e Y deve permanecer o mesmo; portan­
to, MX é 1 e MY é 0. Esta é a direção do movimento no início do jogo e
os valores para os quais MX e MY foram ajustados inicialmente na linha
800. Conforme você mudar a direção de sua nave pressionando uma
tecla, os valores de MX e MY mudam de acordo. O Quadro 5.2 mostra
quais valores de MX e MY correspondem a cada direção do movimento.

QUADRO 5.2
VALORES DE MX E MY PARA O MOVIMENTO
DA NAVE ESTELAR
Difeção do Movimento MX MY
DIREITA 1 0
ESQUERDA -1 0
PARA CIMA 0 -1
PARA BAIXO 0 1

4. A nave estelar faz o wrap-around na tela, significando que quando ela


passa uma borda, reaparece na borda oposta. Isto é executado checan­
do os limites nas linhas 2040 e 2100.
5. A nave estelar é apagada de sua posição antiga na linha 2140.
6. A nave estelar é desenhada também na sua nova posição na linha 2140.
Apagando,e redesenhando a nave estelar na mesma linha do programa,
a animação é suave e sem vibração. É claro, você poderia economizar
um pouco de memória e código de programa apagando a nave dá posi­
ção antiga na linha 2000 ao invés de guardar lá as coordenadas antigas,
mas a animação teria uma vibração considerável por causa do tempo
entre os comandos de apagar e redesenhar.
7. Finaimente, o processo de animação continua com a declaração GOTO
na linha 5000.
Wipeout 35

Os sete passos da animação em Wipeout têm outro código de progra­


mação intercalado entre os passos pois outros eventos no programa acon­
tecem enquanto a animação prossegue.

Contadores de Jogos

Em muitos jogos de ação, você deve registrar atentamente o número,


de inimigos o tempo todo. Por exemplo, em Wipeout, você começa com
cinqüenta Kloryons na tela e ganha destruindo-todos os cinqüenta Klo­
ryons. Conseqüentemente, você deve registrar continuamente quantos
ainda restam na tela. Para isso, o programa usa a variável KL, que é üm
exemplo de um contador de jogo.
Contadores de jogos não são difíceis de programar. Em Wipeout, o
código se inicia verificando as colisões entre sua nave estelar e Kloryons.
Na linha 2120, o comando SP = SCRN (X,Y) ajusta SP para a cor da tela
onde sua nave está para se mover. (Os valores novos de X e Y foram ajus­
tados acima na linha 2020). Se a cor em X,Y é 15 (branco), sua nave estelar
: colidirá com um Kloryon.
A linha 2180 verifica esta colisão e executa o efeito seguinte da coli­
são. Se SP é igual a 15, ós seguintes eventos ocorrerão: um som é gerado
(no ciclo FOR NEXT) para dar a você um suporte auditivo de seu sucesso
em eliminar um Kloryon, o número novo de Kloryons é mostrado na tela
(com as declarações VTAB, HTAB e PRINT); finalmente, o número de Klo­
ryons é verificado (com o comando IF KL = 0) para ver se você os apagou
todos. Se o número de Kloryohs é zero, o programa vai para a linha 10000,
a indicar que você venceu o jogo. Assim, KL é usado no jogo para contar
o número corrente de Kloryons.
A variável TM é também um contador de jogo, como ela controla a
contagem do limite de tempo no jogo (calculado na linha 2200). Explica­
mos contagem de tempo no Capítulo 4. Contadores dé jogos podem con­
trolar também escores de jogos, como você verá mais adiante em outros
jogos.

Inimigos Aleatórios

Depois de jogar Wipeout várias vezes, você observará que as posi­


ções dos Kloryons e das minas espaciais são diferentes em cada jogo.
Isto exemplifica um aspecto de muitos jogos: randomização.
As posições aleatórias dos Kloryons são determinadas nas linhas 520
a 600. A linha 520 ajusta a cor (branco = 15) dos Kloryons e inicia um ci­
clo FOR NEXT. A contagem do ciclo é igual a KL, que foi ajustado para
50 nílinha 500. Na linha 540, o comando RND (1) pega aleatoriamente um
valor no limite de 0.0 a 0.99999, isto é, uma fração decimal maior ou igual
a zero e menor que 1. Quando RND(1) é multiplicado por 39, o valor alea­
tório tem o limite de 0 a 38.99999, mas o valor nunca alcança 39.0. Quan­
36 Jogos de Ação para o Apple

do o comando INT escolhe o inteiro do número decimal, ele trunca (corta


fora) a fração decimal, deixando um inteiro no limite de 0 a 38. Portanto,
o valor X aleatório será sempre escolhido para que ele fique na tela de
gráficos de baixa resolução. Um Kloryon nunca é desenhado na coluna
da extrema direita (X = 39). Se você quiser Kloryons lá, mude o 39 para
40 na linha 540.
De uma maneira parecida, o valor aleatório Y é selecionado do limite
de 0 a 38. Neste caso, entretanto, deixamos de propósito Kloryons fora da
última linha para que a nave estelar tenha espaço para mover-se no início
do jogo e para evitar o problema do desenho inicial da nave estelar ater­
rissar em um Kloryon. O programa não contém códigos para verificar esta
possibilidade. Se você quer que Kloryons sejam desenhados na última li­
nha, você tem que mudar 39 para 40 na linha 560 e adicionar código de
programação antes da linha 800 para verificar se um Kloryon está em X,
Y = 20,39 onde a nave estelar é desenhada.
Conforme os Kloryons novos sejam desenhados na tela, você deve
certificar-se de não desenhar Kloryons um em cima do outro. Portanto, na
linha 580, o programa certifiea-se de que nenhum Kloryon está na nova
posição aleatória X,Y antes do Kloryon ser desenhado na linha 600. Se a
tela não for preta (cor 0) nesta posição (veja linha 580), o programa volta­
rá para a linha 540 para selecionar outra posição X,Y.

MELHORIAS E MODIFICAÇÕES
Várias melhorias e modificações podem tornar Wipeout mais diverti­
do, dando-lhe futuras dicas na programação de jogos de computadores.

Mudando a Dificuldade do Jogo

Este jogo pode parecer muito difícil no início, mas à medida que você
vai se tornando um adepto, pode parecer muito fácil. Você pode fazer mo­
dificações de três maneiras:
1. Digite a seguinte linha: ‘‘5000 FOR J = 1 TO 50: NEXT J: GOTO 1000”.
Assim você torna mais lento ou acelera o jogo, aumentando ou dimi­
nuindo o tamanho do ciclo de atraso, que é ajustado para 50 na linha
acima.
2. Ajuste a contagem do tempo na linha 2200. Você pode tornar o jogo
mais difícil diminuindo o ajuste de tempo do ciclo (TL = 10, por exem­
plo) ou torná-lo mais fácil aumentando o ajuste (TL = 20).
3. Aumentar ou diminuir o número de Kloryons (KL) e minas espaciais
(SM) na tela.
Você pode usar estas três modificações para fazer uma melhoria que
permita ao jogador selecionar o nível de dificuldade. Para tanto, ajuste o
tamanho do ciclo de atraso na linha 5000 alterada para um variável CA
(para ciclo de atraso). Depois ajuste o parâmetro tempo para uma outra
Wipeout 37

variável-TT (para tamanho do tempo). Então, no início do programa, você


pode deixar que o jogador selecione o nível de dificuldade que é usado
para calcular os valores apropriados de CA, TT, KL e SM. Damos um
exemplo de seleção do nível de dificuldade no Capítulo 6 (Race Car).

Usando as Teclas de Seta como Entrada


Você pode também usar as teclas de seta do Apple //e e //c para
controlar o movimento da nave estelar. As teclas de seta são chamadas
de teclas de controle, não as teclas normais de caracteres. Por exemplo,
a seta direita é <CTRL-U> (control-U). Você pode testar isto indo para
o Applesoft BASIC e pressionando a tecla <U> enquanto aperta a tecla
<CTRL>. O cursor age exatamente da mesma maneira se você pressio­
nar a tecla da seta direita. As outras teclas de seta também têm suas te­
clas equivalentes de <CTRL>: a seta esquerda é <CTRL-H>, a seta
para cima é <CTRL-K> e a seta para baixo é <CTRL-J>.
Como você verifica no programa para saber se estas teclas de con­
trole foram pressionadas? O Manual de Referência do Programador de
Applesoft BASIC contém um quadro que fornece o código ASCII para ca­
da uma das teclas no teclado do Apple. Por exemplo, “A” é o código
ASCII 65. Você podería, por exemplo, imprimir um “A” digitando “PRINT
CHRS(65)”. Isto tem o mesmo resultado que se digitar “PRINT “A” Esta
informação é raramente necessária para caracteres normais, mas ela de­
monstra como você pode lidar com caracteres de controle: CHR$(21) é a
seta direita, CHRS(8) é a seta esquerda, CHR$(11) é a seta para cima e
CHRS(10) é a seta para baixo.
Agora, vá para Wipeout e faça as modificações necessárias nas linhas
1060 — 1120:

Mude Para: Nova Tecla:


u >>
CHRS(21) Seta direita
lí »>
> CHR$(8) Seta esquerda
“A” CHR$(11) Seta para cima
CHRS(10) Seta para baixo

Usando o Mouse do Apple como Entrada

O Apêndice F explica como usar o Mouse do Apple como um contro­


lador de jogo. O apêndice também dá a listagem completa de Wipeout, no
qual o mouse é usado para guiar sua nave estelar.

Outras Melhorias
Você pode também melhorar o jogo incluindo melhores efeitos sono­
ros (veja Criador de Som no Capítulo 7) usando paddles (veja Race Car
no.Capítulo 6) ou um joystick (veja Space Hunter no Capítulo 10) para en-
38 Jogos de Ação para o Apple

tratías-do usuário e usando gráficos de alta resolução (veja Wipeout dè


Alta Resolução no Capítulo 13). Aprendendo a programar o jogo Wipeout
em baixa resolução, você ficará acostumado com os muitos comandos ne­
cessários à programação mais difícil envolvida no jogo em alta resolução.
O jogo em baixa resolução não é só mais fácil de programar mas também
roda mais rápido e de muitas maneiras, mais divertido de jogar que o de
alta resolução.
Wipeout 39

Listagem 5.1: WIPEOUT

10 REM ************************
20 REM * WIPEOUT *
30 REM * BY SCOTT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM ************************
90 REM
190 REM

INTRODUÇÃO:

200 TEXT : HOME


220 VTAB 10: Ait = " WIPEOUT ": INVERSE : GOSUB
6000: NORMAL
240 VTAB 12: At- = "BY S. SCOTT ZIMMERMAN":
GOSUB 6000: VTAB 14:At = "COPYRIGHT CC)
1985": GOSUB 6000
320 VTAB 23: PRINT "TECLE <ESPACO> -> "; :
GET At
490 REM

ARRANJO:

500 GR : HOME :TM = 60:TL = O:KL = 50:SM =


10:SN = - 16336
510 REM

DESENHA KLORYONS:

520 COLOR= 15: FOR I = 1 TO KL


540 X = INT ( RND (1) * 39)
560 Y = IhlT ( RND (1) * 39)
5S0 IF SCRNÍ X,Y) < > 0 THEN 540
600 PLOT X,Y: NEXT I
610 REM

DESENHA MINAS ESPACIAIS:

620 COLOR= 1: FOR I = 1 TO SM


640 X = 'INT ( RND (1) * 39)
660 Y = INT ( RND (1) * 39)
40 Jogos de Ação para o Apple

680 IF SCRNÍ X,Y) < > 0 THEN 640


700 PLOT X,Y: NEXT I
790 REM

DESENHA NAVE ESTELAR, ETC.

800 C0L0R= 12;X = 20:Y = 39:MX = 1:MY - 0:


PLOT X,Y
S20 VTAB 22: PRINT "KL0RY0NS=”;KL
840 VTAB 22: HTAB 29: PRINT "TEMP0= ";TM
990 REM

CICLO PRINCIPAL:

1000 IF PEEK ( - 16384) < 128 THEN 2000


1020 GET AS
1060 IF AS = 11 H THEN MX = 1:MY = 0: GOTO 2000
1080 IF AS = U It THEN MX = - 1:MY = 0: GOTO
2000
"Á"
1100 IF AS = THEN MX = O:MY = - 1: GQTO
2000
1120 IF AS = H H THEN MX = O:MY = 1
1990 REM

CALC. MOV. DA NAVE ESTELAR:

2000 XI = X:Y1 = Y
2020 X = X + MX:Y = Y + MY
2030 REM

VERIFICA BORDA DA TELA:

2040 IF X < 0 THEN X = 39: GOTO 2120


2060 IF Y < 0 THEN Y « 39; GOTO 2120
X
2080 IF X z 39 THEN X = 0: GOTO 2120
X
2100 IF Y z 39 THEN Y = 0
2110 REM

PEGA COR EM X,Y NOVO:

2120 SP = SCRN( X,Y)


2130 REM

APAGA VELHO, DESENHA NOVO:

2140 CDLOR= O: PLOT X1,Y1: COLOR= 12: PLOT


.Wipeout 41

X,Y:S = PEEK (SN) + PEEK (SN)


2150 REM

VERIFICA POR COLISOES;

2160 IF SP = 1 THEN 15000


2180 IF SP = 15 THEN FOR J = 1 TO 80:S =
PEEK (SN): NEXT :KL = KL - 1: VTAB 22:
HTAB 10: PRINT KL; " ": IF KL - 0 THEN
10000

2190 REM

CRONOMETRO:

2200 TL = TL + Is IF TL = 15 THEN TM = TM -
1:TL = O: VTAB 22: HTAB 35: PRINT TM;
" ": IF TM = O THEN 15000
5000 SOTO 1000
5990 REM

SUBR. CENTR. IMPRESSÃO:

6000 HTAB (40 - LEN (AS)) / 2: PRINT AS: RETURN

9990 REM

FINAIS DE PERDER E GANHAR:

10000 CALL - 198: TEXT : HOME : VTAB 10: HTAB


14: PRINT "VOCE VENCEU!!": GOTO 20000
15000 CALL - 198: TEXT : HOME : VTAB 10: HTAB
14: PRINT "VOCE PERDEU!”
20000 VTAB 18: PRINT "KLORYONS="; KL: PRINT ,tTEMPD="TM
20020 VTAB 22: CALL - 958: PRINT "JOGAR DE NOVO?
(S/N) ";: GET AS: PRINT AS
20040 IF AS = "S" THEN 500
20060 IF AS < > "N" THEN 20020
CAPÍTULO 6
RACE CAR
Race Car 43

Chegou sua vez, a corrida que você sempre sonhou — as 500 de In-
dianápolis! Você dá uma olhada nos mostradores e instrumentos do pai­
nel de seu carro, ajusta seu capacete, agarra na direção e espera a ban­
deira cair. E você larga!
Você larga para aprender sobre seleção de níveis de dificuldade, pad­
dles e movimentar a tela de baixa resolução. Estes são todos os aspectos
da criação de jogos que trazem divertimento e excitação.

COMO JOGAR RACE CAR

Digite o programa Race Car dado na Listagem 6.1 e grave o progra­


ma no seu disco Jogos de Ação digitando “SAVE RACE.CAR”.
O objetivo do jogo é chegar até o fim da pista (a base da tela) sem
bater seu carro numa parede. Cada vez que você joga, recebe uma nova
pista com um novo percurso a seguir. Você vira o carro para a esquerda
e para a direita com o paddle 0 ou com o joystick. A dificuldade do per­
curso determina a largura da pista (0 a 9, com 0 sendo o mais fácil). A ve­
locidade do carro não varia. Se você alcançar a base da tela (o fim do
percurso), você ganha! Depois de terminar um jogo, você pode começar
outra corrida em qualquer nível de dificuldade. Se você bater, você pode
começar novamente no mesmo nível ou em um mais fácil.

EXPLICAÇÃO DO PROGRAMA

Race Car segue a Organização Geral de Programas dada no Capítulo


2, com as modificações indicadas abaixo. As variáveis-chaves em Race
Car são dadas no Quadro 6.1.

QUADRO 6.1
VARIÁVEIS PRINCIPAIS EM RACE CAR
VARIÁVEIS EXPLICAÇÃO

CD Dificuldade do percurso; determina a largura da pista


CD$ A variável string de entrada para CD
CO Contador para a distância percorrida pelo carro de cor­
rida
OX Valor X antigo do carro de corrida; usado para ani­
mação
PD Valor do paddle; calculado da leitura do paddle
R Indicador do ciclo; vai de 1 a 20; o carro move um espa­
ço para baixo depois de 20 vezes através do ciclo prin­
cipal
44 Jogos de Ação para o Apple

QUADRO 6.1 (Continuação)


VARIÁVEIS PRINCIPAIS EM RACE CAR
VARIÁVEL EXPLICAÇÃO
RC Cor do “ponto” onde o. carro de corrida vai mover-se:
usado para verificar colisão
RX Posição X (horizontal) da tela de baixa resolução do
carro de corrida
RY Posição Y (vertical) da tela de baixa resolução do car­
ro de corrida
SC Escore final
SN Som; endereço de memória do alto-falante do Apple
TW Largura da pista (em “pontos” de baixa resolução)
X Posição X da pisfa (borda esquerda)
XM Movimento do carro na direção X

Seleção dos Níveis de Dificuldade

Os jogos de ação serão mais interessantes se o jogador puder jogar


em um nfvel fácil enquanto aprende o jogo, então aumentar o nível de di­
ficuldade conforme se adquire experiência.
As linhas 500-600 contêm código para a seleção do nível de dificul­
dade. A linha 500 imprime a frase que pergunta ao jogador a dificuldade
do percurso (0-9), ou para parar. A declaração CALL-868 limpa a tela de
texto do cursor até a borda direita da janela de texto. Esta declaração é
usada no caso de erro de entrada como explicado no próximo parágrafo.
A linha 500 também pega (GET) a dificuldade do percurso e atribuí esta à
variável string CDS. Se a entrada for “P” o programa termina na linha 520.
Se a entrada via teclado for um erro, isto é, menos que 0 ou mais
que 9 (ver a linha 540), ou não numérica, o programa volta para a linha
500 e solicita novamente a entrada. (O CALL-868 na linha 500 Jimpa a li­
nha e portanto remove o erro da tela.) A linha 560 muda o valor string para
um valor numérico e ajusta a largura da pista (de 2 a 11 pontos de baixa
resolução de largura) de acordo com a entrada do jogador, deste modo
ajustando a dificuldade do percurso.

Paddles

As linhas 600-620 determinam a posição do paddle. O comando Ap­


plesoft PDL (0) fornece um número correspondente à posição do paddle
0. O número está no limite de 0 a 255, com PDL(0) •= 0 se o paddle está
todo virado para a esquerda (anti-horário) e PDL(O) = 255 se o paddle está
todo virado para a direita (horário).A linha 600 lê o valor inicial do paddle
Race Car 45

e o ajusta (dividindo por 6.5) para estar dentro do limite de 0 a 39, as di­
mensões da tela de baixa resolução. A leitura corrente torna-se a posição
inicial do carro. A linha 620 ajusta a .pista para que ela comece na frente
do carro; assim evita-se o problema do carro bater antes dele chegar na
pista.

Movimentando a Tela de Baixa Resolução

Para mover toda a pista da corrida na tela de baixa resolução, usare­


mos um truque de programação que tira vantagem do fato de que a tela
de baixa resolução, e a tela de texto estão ambas localizadas na mesma
região de memória no computador Apple (veja o Apêndice C). Qualquer
comando que movimenta a tela de texto também movimentará a tela grá­
fica se a janela de texto se sobrepõe à tela gráfica. O comando GR ajusta
o topo da tela de texto para a linha 20, que está abaixo da tela de gráficos
de baixa resolução. Isto impede o texto e os gráficos de interferirem um
com o outro. Entretanto, queremos que o texto interfira. Então na linha
640, o POKE 34,0 reajusta o topo da janela de texto para o topo da tela
de baixa resolução. Assim, a qualquer hora èm que a janela de texto subir
(o que acontecerá na linha 1300 por causa da declaração PRINT); os grá­
ficos de baixa resolução aparecem na tela ao invés de caracteres de texto.
Para ver como isto funciona digite o seguinte no modo imediatç:

GR
POKE 34,0

Agora tecle < RETURN > várias vezes. Observe como o texto da base
da tela passa por dentro da tela gráfica, converte-se em pontos de baixa
resolução e continua subindo pela tela conforme você tecla <RETURN >.
Esta mesma técnica é utilizada nas linhas 640 e 1300 onde o PRINT tem
a mesma função de teclar < RETURN >. Desta maneira, movimentar a tela
de baixa resolução é simples, rápido e eficaz.

Ciclo Principal Modificado

Como a entrada do jogador é via paddle e hão via teclado, o resumo


geral do programa dado no Quadro 1.2 deve ser modificado. Uma decla­
ração FOR é usada na linha 1000 para que, após a pista de corrida ter
subido vinte linhas, o carro de corrida se mova uma linha para baixo. A
linha 1020 soma 1 ao contador de número de espaços viajados para bai­
xo da pista pelo carro de corrida. A linha 1040 move aleatoriamente a pis­
ta horizontalmente para que a pista se curve e faça zigue-zague. As linhas
1060-1080 certificam que á pista permaneça na tela.
A linha 1100 apaga uma linha na tela desenhando uma linha de bai­
xa resolução com COLOR = 0 (preto). Isto desenha a pista de corriçja. A
linha 1120 começa a animação guardando a coordenada X antiga do car­
ro de corrida. A linha 1140 verifica o valor do paddle e ajusta o número
46 Jogos de Ação para o Apple

PD para caber na tela de baixa resolução (PD determina o movimento do


carro de corrida). As linhas 1160-1200 atribuem 1 a XM (valor do movi­
mento do carro de corrida) se o carro for se mover para a direita, -1 se o
carro for se mover para a esquerda e 0 se o carro for manter a mesma
coordenada X, baseada no valor de PD.
A linha 1220 acessa a posição de memória do alto-falante do Apple
para fazer soar um tique. A linha 1240 calcula a nova posição do carro de
corrida adicionando ó valor XM determinado nas linhas 1160-1200. A linha
1260 ajusta RC (cor da pista de corrida) para a cor da tela onde o carro
estâ para se mover, isto será usado adiante para ver se o carro colidiu
com o lado da pista de corrida. A linha 1280 apaga a posição antiga do
carro de corrida; a linha 1300 sobe a tela (e por isso a pista) e a linha
1320 desenha a nova posição do carro de corrida.
A linha 1340 verifica a cor da pista de corrida (RC) para ver se o car­
ro está ainda na pista (qualquer cor, exceto o preto, quer dizer uma coli­
são). Se o carro bater, o programa vai para a linha 15000, onde está a
seção “você perdeu”.
Se não houver batida, o programa descé para a linha 1360, embaixo
do ciclo FOR NEXT. Se o ciclo foi executado vinte vezes, o programa des­
ce para a linha 1380, caso contrário, o programa volta para o início do
ciclo na linha 1000.
,A linha 1380 calcula a nova posição Y do carro de corrida para que
ele se mova para baixo uma linha, cada vez que a pista sobe vinte linhas.
(Se o carro se movesse para baixo uma linha, cada vez que a tela subisse,
o jogo seria muito difícil e muito rápido). As linhas 1400-1420 apagam o
valor do carro antigo e verificam se o carro está na base, então o progra­
ma vai para a linha 10000, onde está a seção “você ganhou”. Se você ain­
da não ganhou, a linha 1440 faz o programa voltar e recomeçar o ciclo
principal.

MELHORIAS E MODIFICAÇÕES

Mesmo sem um paddle ou joystick, você pode ainda jogar Race Car
fazendo várias mudanças no programa. Estas alterações permitem a você
usar o teclado como entrada. Pressione o ponto (.) para mover o carro
para a direita, a vírgula para mover para a esquerda e a barra de espaço
para manter o carro indo reto. As seguintes linhas deveriam ser digitadas
como indicadas abaixo, ao invés de como mostradas na Listagem 6.1:

600 PD = 20
1140 IF PEEK (-16384) < 128 THEN 1220
1160 GET A$: IF AS = THEN XM = 1: GOTO 1220
1180 IF AS = THEN XM = - 1: GOTO 1220
1200 IF AS = “ ” THEN XM 0

No Capítulo 15, mostraremos a yocê como dar ao jogador uma esco­


lha de entrada via paddle ou via teclado de dentro do programa.
Race Car 47

Listagem 6.1: RACE.CAR

10 REM *** *********************


20 REM * RACE.CAR *
30 REM # BY BRENT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM ************************
90 REM

INTRODUÇÃO:

200 TEXT : HOME


220 VTAB 3: HTAB 15: INVERSE : PRINT " RACE
CAR ": NORMAL : VTAB 5: HTAB 11: PRINT
“BY BRENT ZIMMERMAN"
240 VTAB 7: HTAB 11: PRINT "COPYRIGHT (C)
1935"
490 REM

ARRANJO:

500 VTAB 18: PRINT "TECLE P PARA PARAR": VTAB


16: CALL - 868: PRINT "DIFICULDADE DO
PERCURSO (0-9) ->";s GET CD$: PRINT
CD£
520 IF CD$ = "P" THEN HOME : END
540 IF CDS > "9" OR CDÍ < "0" THEN PRINT
CHR$ (7);: GOTO 500
560 CD = VAL (CD$):TW = 11 - CD:XM = O
590 REM

LEITURA INICIAL DO PADDLE:

600 PD = INT ( PDL (0) / 6.5)


620 X = PD - INT <TW / 2)
640 GR : POKE 34,0
680 SN — - 16336:CO = 0:RX = PD:RY = 1
990 REM

CICLO PRINCIPAL:

1000 FOR R 1 TO 20
48 Jogos dé Ação para o Apple

1020 CO = CO + 1
1040 X = X + INT ( RND (1) * 3) - 1
1060 IF X + TW > 38 THEN X = 38 - TW
1080 IF X < 1 THEN X = 1
1100 COLOR® 0: HLIN X,X + TW AT 39
1Í20 OX = RX
1140 PD » INT ( PDL (0) / 5.2) - 5
1160 IF PD > OX + 5 THEN XM = 1: GOTO 1220
1180 IF PD < OX - 5 THEN XM = -is GOTO 1220
1200 XM = O
1220 S = PEEK (SN)
1240 RX = RX + XM
1260 RC = SCRN( RX,RY + 2)
1280 PLOT OX,RY
1300 PRINT
1320 COLOR® 15; PLOT RX,RY
1340 IF RC >0 THEN 15000
1360 NEXT R
1380 RY = RY + 2
1400 COLOR® O: PLOT RX,RY - 2
1420 IF RY ® 39 THEN 10000
1440 GOTO 1000
9080 REM

VOCE GANHOU:

10000 TEXT : HOME :CD = 13 - TW:SC = CO * CD:


VTAB 4: PRINT "ESCORE="SC: HTAB 16: VTAB
10: PRINT "VOCE GANHOU"
10020 FDR R = 1 TO 5: PRINT CHR$ (7) J : NEXT
R
10040 GOTO 500
14980 REM

VOCE PERDEU:

15000 FOR K = 1 TO 100


15020 S = PEEK (SN)
15040 NEXT K
15060 CD = 12 - TW:SC = (CO - 20) * CD
15080 TEXT : HOME : VTAB 4: PRINT "ESCORE®"SC
15100 GOTO 500
CAPÍTULO 7
MÚSICA E EFEITOS
SONOROS
50 Jogos de Ação para o Apple

Os efeitos sonoros em Snake, Wipeout e Race Car são limitados a


simples cliques e zumbidos. O comando “S = PEEK (—16336) + PEEK
(-16336)” move o diafragma do alto-falante para dentro e para fora para
produzir um clique. Colocando os cliques em um ciclo, você pode fazer
zumbidos. Mas para muitos jogos de ação, você quer efeitos sonoros mais
variados e excitantes. O Applesoft, entretanto, é muito lento para fazer
sons bem definidos e música de computador. Então o que você faz?
A resposta é o Criador de Som, uma rotina em linguagem de máqui­
na que pode adicionar música e efeitos sonoros completos para seus jo­
gos de computador em Applesoft. Ele é poderoso e fácil de usar.

COMO DIGITAR O CRIADOR DE SOM

A linguagem de máquina é a “língua nativa” de um computador. To­


das as linguagens de alto nível — BASIC, Pascal, Logo, etc. — devem ser
traduzidas para linguagem de máquina antes que elas possam ser execu­
tadas. Estas linguagens de alto nível são relativamente fáceis de se pro­
gramar, mas porque elas devem ser traduzidas, são relativamente lentas.
Para alcançar a velocidade necessária e produzir efeitos sonoros comple­
tos e música, o programa gerador de som deve ser escrito em linguagem
de máquina ou em seu parente próximo, linguagem “assembly” (de mon­
tagem).
A Listagem 7.1 dá o código de linguagem assembly e de máquina
para o Criador de Som. Se você está acostumado com a linguagem as­
sembly e possui um “assembler” (montador), você pode digitar e “tradu­
zir” o código fonte como está listado. Se você não tem um assembler, terá
que digitar o código de máquina no seu Apple. Como o código de máqui­
na é usado como um arquivo binário, você deveria consultar o Apêndice
B sobre como digitar arquivos binários, juntamente com as explicações
dadas abaixo. O código de máquina começa na página 58.
As quatro colunas do lado esquerdo das páginas 58-60 dão os ende­
reços de memórias e os valores dos bytes para o arquivo binário Criador
de Som. A primeira coluna esquerda é o endereço de memória no qual
você digitará os valores dos bytes. As três colunas próximas são os pró­
prios valores dos bytes. Seguindo o procedimento descrito no Apêndice
B, digite primeiro “CALL-151” para entrar no monitor. Depois digite “300:”
para indicar que o primeiro byte deve estar localizado no endereço de
memória $300 (onde o sinal de $ quer dizer que o número é hexadeci­
mal). Agora digite os valores dos bytes “A9 4C” e tecle <RETURN >. Isto
posiciona $A9 no endereço $300 e $4C em $301. Continue entrando com
o programa digitando “302:8D F5 03” depois “305:A9 00” e assim por dian­
te, até que você digite todas as linhas, finalizando com “3CE:60”.
Quando você acabar de digitar todo o arquivo binário, tecle <CTRL-
C> e <RETURN> para sair do monitor e voltar para o BASIC. Então di­
gite “CALL 768” para inicializar o gerador de som. Agora digite e
< RETURN >. Você deverá ouvir uma nota clara (esta é dó central, como
é explicado abaixo no Tutor do Criador de Som. Tente outra nota digitan­
do “&212” <RETURN> que é ré acima do dó central).
Música e Efeitos Sonoros 51

Se tudo soar certo, grave o programa digitando “BSAVE CRIADOR.


SOM,A768,L207” como explicado no Apêndice B. Se o programa não fun­
cionar corretamente, volte para o monitor digitando “CALL-151”. Então
“desmonte” o código digitando “300L”. Verifique cada byte de sua lista­
gem com a Listagem 7.1, corrigindo quando necessário.

EXEMPLOS DE EFEITOS SONOROS

Para dar a você uma idéia do tipo de efeitos sonoros que você pode
criar usando o Criador de Som, digite o programa Applesoft Exemplos de
Sons, dado na Listagem 7.2. Depois de você dar entrada ao código em
Applesoft BASIC no seu computador, grave o programa em seu disco
Jogos de Ação digitando “SAVE EXEMPLOS.SOM”. Se você ainda tem
o programa na memória, digite “RUN”, ou rode o programa do disco digi­
tando “RUN EXEMPLOS.SOM”. Alternativamente, você pode selecionar
Exemplos.Som do menu de STARTUP do disco Jogos de Ação.
Quando você rodar (RUN) o programa, você verá imediatamente na
tela um menu como este:

EXEMPLOS DE SONS DE JOGOS


BY S. SCOTT ZIMMERMAN
COPYRIGHT © 1985
0 : MARCAR UM PONTO
1 : TIRO DE UM ALIENÍGENA
2 : CHILRO DE PASSARINHO
3 : MEDIDOR GEIGER
4 : TELEFONE
5 : ASSOBIO’
6 : SIRENA EUROPÉIA
7 : TIQUE-TAQUE
8 : MARCHA FÚNEBRE
9 : RUMO ÀS CORRIDAS
PRESSIONE UM NÚMERO 0-9, OU P PARA PARAR

Tecle um número para ouvir o efeito sonoro correspondente. A cada


um dos sons foi dado um nome arbitrário, mas você deveria usar a pró­
pria imaginação em como o som deve ser usado. Por exemplo, o som
“Marcar um ponto” poderia ser usado em um jogo onde o jogador marca
um ponto, mas poderia ser usado também para indicar o aniquilamento
de um alienígena ou a aterrissagem de uma espaçonave. Reciprocamen­
te, muitos outros efeitos sonoros poderíam ser usados facilmente quando
um jogador marca um ponto.
52 Jogos de Ação para o Apple

Os sons 8 e 9 são melodias curtas. O primeiro é a conhecida “Mar­


cha Fúnebre" usada nos jogòs de aventura quando um guerreiro morre.
O segundo é. a conhecida fanfarra de corneta usada nas corridas de ca­
valo. Estes são apenas dois exemplos do tipo de música apropriado para
jogos de ação.
Olhe novamente a Listagem 7.2, o programa Applesoft Exemplos de
Sons. Se você estudar cuidadosamente a listagem, aprenderá o seguinte:,
o Criador de Som é rodado (BRUN) de dentro de um programa Applesoft
(outros exemplos aparecerão em programas posteriores); o Criador de
Som é usado para produzir efeitos sonoros variados; e como Exemplos de
Sons, um programa que à primeira vista parece muito diferente de um jo­
go em Applesoft, usa os mesmos fundamentos da organização de progra­
mas como os jogos neste livro (ver Capítulo 2). Em particular, observe o
uso do ciclo principal na Listagem 7.2. Ele é um conceito importante de
programação que pode ser aplicado a uma grande variedade de projetos
de software.

TUTOR DO CRIADOR DE SOM

Ligue o seu computador com o disco Jogos de Ação no drive 1,


tecle <ESC> para sair do menu de STARTUP, então digite “BRUN CRIA-
DOR.SOM”. Observe que você deve rodar (BRUN) enão carregar (BLOAD)
o programa Criador de Som. Isto inicializa o sistema para que a rotina de
som possa ser usada corretamente.
Agora, novamente do modo imediato, digite “&” e depois tecle < RE­
TURN >, como de costume. O caractere “&” é chamado de “símbolo e”
ou ampersand. Quando um programa Applesoft encontra um ampersand,
o programa pula para um programa de linguagem de máquina cujo ende­
reço está armazenado nas posições de memória 1014 e 1015. Quando
você roda (BRUN) o Criador de Som, o “pulo do &’’ está arranjado para
você.
O tom que você acabou de ouvir é a nota musical dó central. Agora
digite “FOR I = 1 TO 10:&: NEXT I” para tocar a nota dez vezes em série.
Colocando notas em ciclos FOR NEXT, você poda criar efeitos sonoros
interessantes.

Pitch

Para mudar o pitch de dó central para ré, digite “&212”. O número


(ou expressão) imediatamente seguinte ao ampersand é o pitch. O limite
permitido é de 0 a 255; valores negativos ou maiores que 255 produzirão
um erro “7ILLEGAL QUANTITY”. Um valor 0 de pitch produz um resto de
mesma duração que uma nota comum.
Agora tente isto: digite “& 206: & :& :& 21 ?:&:&: & 216:&: &”.
Isto demonstra o. conceito do pitch default (de omissão). O pitch
default é o pitch que tocará quando você não especificar um pitch. O
Música e Efeitos Sonoros 53

default é ajustado automaticamente para dó central (&206) quando você


roda (BRUN) pela primeira vez o Criador de Som.
Você pode ouvir a variação completa das notas digitando o seguinte:
“FOR I = 1 TO 255 : & I : NEXT I”. Executando esta linha demonstram-se
dois outros pontos sobre o Criador de Som. O parâmetro pitch seguindo
imediatamente o ampersand pode ser uma variável ao invés de um número
puro (constante). De fato, ele pode ser qualquer expressão Applesoft
que resulta em um número no limite de 0 a 255 (o número não precisa
ser inteiro).
Em segundo lugar, a não ser que contrariamente seja especificado,
a duração é a mesma para todas as notas, não importando o pitch. (Enrr
alguns geradores de tom, a duração diminui conforme o pitch aumenta.
Discutiremos duração, em detalhes, na próxima seção.)
Outro exemplo irá demonstrar o uso de uma expressão no parâmetro
pitch: “A = 50: & RND (1)* A + 100” resulta em um tom com um pitch
escolhido aleatoriamente no limite de 100 a 149.

Duração

Até agora a duração (período de tempo) de todas as notas deste


tutorial foi a mesma. Para variar a duração, você deve completar dois
passos: especificar um segundo parâmetro e especificar urri número (ou
expressão Applesoft) no limite de 0 a 255, imediatamente após o pitch.
Os parâmetros pitch e duração devem ser separados por uma vírgula:
“& 206,10: & 212,20: & 216,40: & 219,80: & 223,160”. Isto mostra que se
você dobrar o parâmetro duração, dobrará a duração do tempo do tom.
Parecido com o pitch, a duração, se omitida, recebe o valor especi­
ficado mais recentemente. Assim “& 206,100: & 212: & 216,50: & 219” toca
as duas primeiras notas com duração de 100 e as duas outras com dura­
ção de 50. Quando você roda pela primeira Vez (BRUN) o Criador de
Tom, a duração default é 100.
Uma duração de zero não produz som. Outros valores de pequena
duração, como 1 e 2, podem também não produzir um som, ou produzirão
um som uma vez sim, outra não, quando forem usados. Se a duração
é muito pequena, o alto-falante pode ser ativado apenas uma vez quando
a nota é tocada. Isto move o diafragma para fora (se ele está dentro) ou
para dentro (se ele está fora). Como um som é gerado apenas quando o
diafragma é movido para fora, uma nota sim e outra não fica silenciosa
e as outras geram um clique curto.

Ritmo
A duração mais longa possível, 255, toca tons à razão de aproxima­
damente 76 batidas por minuto (admitindo que cada nota é uma batida),
ou aproximadamente 0,8 segundos por nota. Você pode criar tons mais
longos usando o parâmetro ritmo do Criador de Som. Digite o seguinte
54 Jogos de Ação para o Apple

par-a-démonstrar isto: “& 206,100: & 206,100,2: & : & 206,100,1”. Você pode
adicionar um terceiro parâmetro, o ritmo, se você incluir conjuntamente
o pitch e a duração. O ritmo também é um número no limite de 0 a 255.
O valor do ritmo aumenta a duração por este fator. Por exemplo, se você
muda o ritmo para 2, a duração aumenta por um fator de 2 e a nota dura
duas vezes mais. Uma nota com duração de 255 e um ritmo de 255 irá
soar por três minutos!
Uma nota com um ritmo de 0 não irá soar. Isto pode ser usado para
desligar o som no seu programa. Se o programa possui vários coman-
dos-& de efeitos sonoros, mas nenhum especifica o ritmo (que é freqüen-
temente o caso), você pode desligar todos os sons colocando o comando
“& 0,0,0” no começo do programa ou digitando-o no modo imediato antes
de você rodar o programa. Entretanto, uma maneira melhor de desligar
o som de dentro de um programa é dada na próxima seção.
O ritmo especificado mais recentemente é o valor default e você não
precisa especificar o ritmo novamente até que você queira mudá-lo. O
ritmo default quando o Criador de Som é pela primeira vez rodado
(BRUN) é 1.
É uma boa idéia reajustar o ritmo para 1 depois de uma seqüência
de notas se o ritmo for modificado. Você pode fazê-lo com o comando
“& 0,0,1”.

Ligando e Desligando o Som

O Criador de Som possui dois comandos auxiliares especiais,


“&STOP” e “&RESUME”. Todas as notas-& após um &STOP serão igno­
radas pelo Criador de Som, como se não houvesse efeitos sonoros ou
músicas no programa. Isto é cômodo se você quiser dar a um jogador
a opção de silenciar os efeitos sonoros. Use o outro comando auxiliar,
“&RESUME” para recuperar o som. O jogo Nuclear Fallout no Capítulo
8 mostra como usar os comandos “&STOP” e “&RESUME”.

EDITOR DE SOM

Uma maneira fácil de se experimentarem os vários pitches, durações


e ritmos disponíveis com o Criador de Som é o programa Editor de Som
dado na Listagem 7.3. Digite o programa e grave-o no seu disco Jogos
de Ação.
O menu do Editor de Som, que aparece tão logo você rode (RUN)
o programa, lista todos os comandos do teclado. Eles são explicados em
detalhe no Quadro 7.1.
Examine cuidadosamente a Listagem 7.3. Você observará que este
programa é outra aplicação da mesma organização de programas expli­
cada no Capítulo 2, fazendo o uso de tais características de criação como
a introdução do programa, o arranjo e o ciclo principal.
Música e Efeitos Sonoros 55

MÚSICA: COMPUTADOR.BACH
i
Combinando o pitch, a duração e o ritmo na maneira apropriada,
você pode criar música verdadeira. O programa Computador Bach dado
na Listagem 7.4 dá um número musical, uma seleção do Inventio VII. de
Bach, para demonstrar um uso do Criador de Som. Digite o programa
Computador Bach e grave-o no seu discó Jogos de Ação. Quando você
roda (RUN) o programa, é-lhe permitido selecionar um parâmetro ritmo,
de 0 a 5. Um ritmo de 0 não produzirá som, 1 será o mais rápido e 5 o
mais lento.
Você achará os Quadros 7.2 e 7.3 muito úteis na criação de sua
própria música. O Quadro 7.2 fornece a relação entre as notas musicais
e o parâmetro pitch e o Quadro 7.3 dá a relação entre o ritmo de música
e o parâmetro duração.
Embora você não use o Computador Bach (Listagem 7.4) nós seus
próprios jogos Applesoft, você pode querer outros tons, como o tema
musical das Olimpiadas, sua música de briga de escola ou uma fanfarra
de cornetas. Com um pouco- de trabalho e criatividade, você pode adi­
cionar efeitos sonoros interessantes e excitantes e música em seus jogos.

QUADRO 7.1
COMANDOS DO TECLADO DO EDITOR DE SOM

<ESPAÇO> Tecle a barra de espaço para escutar a nota cujo


pitch, duração e ritmo estão mostrados na tela.
<RETURN> Muda o parâmetro de edição corrente. A barra em
vídeo inverso indica o parâmetro de edição cor­
rente.
<— —> [Setas direita e esquerda] Ajusta o parâmetro de
edição corrente. Pressiònandõ-se á setá' direita,
aumenta-se o vafór pela quantia de incremento
(ver comando NÚMERO); pressiònahdo-sè a seta
esquerda, diminui-se o valor pela quantia de in­
cremento.
NÚMERO Pressionando-se qualquer número de 0 a 9, muda-
. se o incremento para este valor (exceto 0 que faz
o incremento 10). 0 incremento default é 1, que­
rendo dizer que pressionando-se a tecla de seta
esquerda ou direita diminuirá ou aumentará o pa­
râmetro corrente de edição.
P Pressione para parar o Editor de Som.
56 Jogos de Ação para o Apple

QUADRO 7.2
RELAÇÃO ENTRE AS NOTAS MUSICAS E OS
PARÂMETROS PITCH
NOTA N.° DO NOTA N.° DO
PITCH PITCH

C 60 G 190
C#, D bemol 71 G^, A bemol 194
D 82 A 197
D^, E bemol 91 A#= B bemol 200
E 101 B 203
F 109 C (C menor) 206
F?$=G bemol 117 01^7 D bemol 209
G 125 D 212
G#tA bemol 132 D?t=7 E bemol 214
A 139 E 216
At^B bemol 146 F . 219
B 152 F^, G bemol 221
C (médio) 158 G z 223
CT^D bemol 163 Gj^r A bemol 224
D 168 A 226
Dt^4 E bemol 173 At4^ B bemol 228
E 178 B 229
F ft 182 C (C menor) 231
F/95 G bemol 186

QUADRO 7:3
RITMO DA MÚSICA E PARÂMETROS DE DURAÇÃO
DURAÇÃO BATIDAS POR MIN TERMO MUSICAL

300 — 200 40 — 60 Largo


200 — 180 60 — 66 Lento
180 — 154 66 — 78 Adágio
154 — 110 78 — 108 Andante
110 100 108 — Í20 Moderate
100 — 70 120 — 168 Allegro
70 — 60 168 — 200 Presto
60 — 55 2Ó0 —218 Prestissimo
Música e Efeitos Sonoros 57

Listagem 7.1: CRIADOR.SOM

1 *★**★*★★★★*★★**★*★*★*★★★★*★*****»★★★★★★★★★****★★*★
2 * *
' *
3 SOUND.MAKER *
4 * *
5 ★
By S. Scott Zimmerman ★
6 ★ ★
7 ★
Copyright (c) 1985 ★
8 ★
Computer Expressions ★
9 ★
1129 East 470 North ★
10 *
Orem, Utah 84057 ★
11 * *
12 Jr
Assembler: Merlin *
13 ★ ★
★★*★★★★★**★*★******★★★★*★*★★*★*★***★★★★**★★★★★*★**
14
15
16 ORG $300 ;Start in input buffer
17 * .

19 * Zero page equates: *

21
22 MULTI EQU $0 Multiplicand
23 MULT 2 EQU $2 ;Multiplier
24 DUR EQU $3 ;Temporary duration
25 PITCHI EQU $E3 ;Inverse pitch (rest fig)
26 PITCHCNT EQU $PA 7 Count for sound loop
27 STOPFLG EQU $FC 7 Flag to turn off sound
28 PITCH EQU $FD 7 Sound pitch
29 DURATION EQU $FE 7 Sound duration
30 TEMPO EQU $FF 7 Sound tempo
31 *
32 • ■ 1 1■ ■ ■
33 * Monitor locations and routines: *
34
35
36 CHRGOT EQU $B7 ;Get text character
37 AMPER EQU $3F5 7routine address
38 TXTEND EQU $D995 ;Move TXTPTR to end
39' GETBYTC EQU $E6F5 ;Eval text expression
40 GETBYT EQU $E6F8 7Eval text expression
41 SPEAKER EQU $C030 7 Speaker switch
42
43 *—_ -. —W. 9 — ----- 9 ♦ —— ..
44 * Constants: *
45 *— __ _ — _ _ — —— — — *
46
47 RESUMTOK EQU $A6 ;Applesoft RESUME token
48 STOPTOK EQU $B3 7Applesoft STOP token
49
58 Jogos de Ação, para o. Apple

★=====!3===s====s:3S=======:======2===============*
50
51 * SETUP (connect &, set defaults) *
52
53
0300: A9 4C 54 LDA #$4C ;Get JMP opcode
0302: 8D P5 03 55 STA AMPER ;Stuff at amper vector
0305: A9 20 56 LDA ♦ <START /Point & to start
0307: 8D F6 03 57 STA AMPER+1 ,
030A: A9 03 58 LDA #>START
030C: 8D F7 03 59 STA AMPER+2
030F: A9 CE 60 LDA #206 /Set pitch to middle C
0311: 85 FD 61 STA PITCH
0313: A9 64 62 LDA #100 /Set initial duration
0315: 85 FE 63 STA DURATION
0317: A9 01 64 LDA #1 /Set initial tempo
0319: 85 FF 65 STA TEMPO
031B: A9 00 66 LDA #0 /Set STOP flag to "on"
031D: 85 FC 67 STA STOPFLG
031F: 60 68 RTS /End of SETUP
69
70
71 * START (start of sound routine) *
72 *===============================2======^====^======*

73
0320: C9 B3 74 START CMP #STOPTOK /Is STOP token there?
0322: D0 07 75 BNE CHKRESUM /No, go check RESUME
0324: A9 01 76 LDA #1 /Set the stop flag
0326: 85 FC 77 STA STOPFLG / so no sound is made
0328: 4C 95 D9 78 JMP TXTEND /Exit to end of command
032B: C9 A6 79 CHKRESUM CMP #RESUMTOK ;Is RESUME token there?
032D: D0 07 80 BNE CHKSTOP /No, go check stop flag
032F: A9 00 81 LDA #0 ;Clear the stop flag
0331: 85 FC 82 STA STOPFLG
0333: 4C 95 D9 83 JMP TXTEND ;Exit to end of command
84
0336: A5 FC 85 CHKSTOP LDA STOPFLG /Is stop flag set?
0338: F0 03 86 BEQ GETPARM /No,✓go get parameters
033A: 4C 95 D9 87 JMP TXTEND /Just end (thru line end)
88
033D: 20 B7 00 89 GETPARM JSR CHRGOT /Check if first parm
0340: F0 19 90 BEQ SOUND /No parm, so make sound
0342: 20 F8 E6 91 JSR GETBYT /Get the pitch parameter
0345: 86 FD 92 STX PITCH /Save it
93
0347: 20 B7 00 94 JSR CHRGOT /Check if second parm
034A: F0 0F 95 BEQ SOUND /No parm, so make sound
034C: 20 F5 E6 96 JSR GETBYTC ;Get the duration value
034F: 86 FE 97 STX DURATION ;.Save it
98
0351: 20 B7 00 99 JSR CHRGOT /Check if third parm
0354: F0- 05 100 BEQ SOUND /No parm, so make sound
Música e Efeitos Sonoros 59

0356: 20 F5 E6 101 JSR GETBYTC ;Get the tempo parameter


0359: 36 FF 102 STX TEMPO ;Save it
103
035B: A9 00 104 SOUND LDA *0 ;Zero temporary memory
035D: 85 03 105 STA DUR
035F: 85 04 106 STA DUR+1
0361: 85 05 107 STA DUR+2
0363: 85 01 108 STA MULT1+1
0365: A5 FE 109 LDA DURATION ;Get ready to multiply
0367:. 85 00 110 STA MULTI ; duration times the
0369: A5 FF 111 LDA TEMPO ; tempo
036B: 85 02 112 STA MULT 2
113
036D: A2 08 114 LDX #8 ;8-bit multiplication
036F: 46 02 115 MULTLOOP LSR MULT2
0371: 90 0D 116 BCC NOADD
0373: 18 117 CLC
0374: A5 03 118 LDA DUR ,
0376: 65 00 119 ADC MULTI'
0378: 85 03 120 STA DUR
037A: A5 04 121 LDA DUR+1
037C: 65 01 122 ADC MULT1+1
037E: 85 04 123 STA DUR+1
0380: 06 00 124 NOADD ASL MULTI '
0382: 26 01 125 ROL MULT1+1
0384: CA 126 DEX
0385: D0 E8 127 BNE MULTLOOP
128
0387: A2 07 129 LDX #7 /•Multiply DUR by 128
0389: 06 03 130 MLOOP ASL DUR
038B: 26 04 131 ROL DUR+1
038 D: 26 05 132 ROL DUR+2
038F: CA 133 DEX
0390: D0 F7 134 BNE MLOOP
135
0392: 38 136 SEC ;Invert pitch parameter
0393: A9 00 137 LDA #0 -
0395: E5 FD 138 SBC PITCH
0397: 85 FA 139 STA PITCHCNT ;Save as count
0399: 85 E3 140 STA PITCHI
039B: A5 FD 141 LDA PITCH ;Set the pitch count
039D: 85 FA 142 STA PITCHCNT
143
*
145 * SOUND LOOP: *
1 AA
147
039J1: A5 E3 148 DURLOOP LDA PITCHI ;Is the note a rest? (0)
03A1: D0 05 149 BNE DECPTCH ;No, so go check pitch
03A3: A5 E3 150 LDA PITCHI ;Stall to equal cycles
60 Jogos de Ação para o Apple

03A5: B8 151 CLV ;Force the branch


03A6: 50 04 152 BVC WAIT ;And go wait some more
03A8: C6 FA 153 DECPTCH DEC PITCHCNT ;Ready to tick speaker?
03AA: F0 06 154 BEQ SPKR ;Yes, go click speaker
03AC: A5 E3 155 WAIT LDA PITCHI ;Do some stalling so
03AE: B8 156 CLV ; timing is same whether
03AF: B8 157 CLV ; speaker clicked or not
03B0: 50 07 158 BVC Dl ;(Always) skip click
03B2: 2C 30 C0 159 SPKR BIT SPEAKER •Toggle the speaker
03B5: A5 E3 160 LDA PITCHI ;Get the inverse pitch
03B7: 85 FA 161 STA PITCHCNT rSave as pitch count
03B9: A5 03 162 Dl LDA DUR ;24-bit decrement
03BB: D0 0C 163 BNE D3
03BD: A5 04 164 LDA DUR+1
03BF: D0 06 165 BNE D2
03C1: A5 05 166 LDA DUR+2
03C3: F0 09 167 BEQ QUIT
03C5: C6 05 168 DEC DUR+2
03C7: C6 04 169 D2 DEC' DUR+1
03C9: C6 03 170 D3 DEC DUR
03CB: B8 171 CLV rClear to force branch
03CC: 50 Dl 172 BVC DURLOOP
03CE: 60 173 QUIT RTS ;End of SOUND MAKER

—End assembly, 207 bytes, Errors: 0


Música e Efeitos Sonoros 61

Listagem 7.2: EXEMPLOS.SOM

10 REM ************************
20 REM * EXEMPLOS.SOM *
30 REM * BY SCOTT ZIMMERMAN *
40 REM * COPYRIGHT CO 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
ao REM ************************
90 REM
100 REM

INTRODUÇÃO:

120 TEXT : HOME


140 A$ = ” EXEMPLOS DE SONS DE JOGOS ": INVERSE :
VTAB 2: GOSUB 6000: NORMAL : PRINT :
AT = "BY S. SCOTT ZIMMERMAN": GOSUB 6000?
AT = "COPYRIGHT CO 1985": GOSUB 6000
160 IF PEEK (768) < > 169 THEN PRINT CHRT.
(4 ) : "BRUN CRIADOR.SQM"
490 REM

ARRANJO: '

500 FOR I = O TO 9: READ TCI),ST(I): NEXT


I
520 FOR I = 0 TO 9: VTAB TCI): HTAB 10: PRINT
I;" : “jS$(I>: NEXT I: PRINT :AT = "TECLE
UM N# 0 - 9, OU P PARA PARAR": GOSUB
6000
990 R£M

CICLO PRINCIPAL:

1000 KB = PEEK ( - 16384): IF KB < 176 THEN


1000
1020 POKE - 16368,0: IF KB = 208 THEN 10000
1040 IF KB > 185 THEN 1000
1060 SI = KB — 176: VTAB TCSI): HTAB 10: INVERSE
: PRINT SI: NORMAL
ioao KB = KB - 175: ON KB GOSUB 6020,6040,6060,
6080,6100,6120,6140,6160,6180,6200
1100 VTAB TCSI): HTAB 10: PRINT SI
62 JogOs de Ação para o Apple

1120 GOTO 1000


5990 REM

SUB-ROTINAS

6000 HTAB (40 - LEN (Aí)) / 2: PRINT Aí: RETURN


6020 FOR I - 240 TO 250s 8c IT4,.l: NEXT I: RETURN

6040 FOR I » 1 TO 10s i ( RND (1) * 40 + 200),


8s NEXT s RETURN
6060 FOR I = 255 TO 251 STEP - Is & 1,4: NEXT
Is RETURN'
6080 FOR I = 1 TO 60s 8c 1 , RND (1) * 5s & O,
- RND (1) * 5s NEXT Is RETURN . .
6100 A =230:B = 231s & 0,5,1s FOR I = 1 TO
30s £< As 8c B: NEXT I: RETURN
6120 A = 253:B ;= 252: * 0,4,1: FOR I = 1 TO
30: & A: & Bs NEXT Is RETURN
6140, FOR I- = 1 TO 4: & 170,100,1: & 190,100:
JMEXT I,: RETURN
6160 G = -<223:C .=; 206: FOR 1 = 1 TO.-5: & G,3,
1: 0,80: 8c C,3.s ,8c 0,80: NEXT I: RETURN

6180 8c 82,58,4: & 0,1: & 82*,38: & 0,1: & 82,
18: 8c 0,1: 8c 82,60: 8c 109,-40: 8c 101,’18:
8c 0,1: & 101,40: 8c 82,18: 8c 0,1s 8c 82,
40: 8« 71,20: 8c 82,60: 8c 0,0,1: RETURN

6200 8c 190,5,4s 8c 206: 8c 216: 8c 223,9: 8c 0,


1: 8: ?23,5: 8c 216,9: 8c 0,1: 8c 216,5:
,8c 206: 8c 216: 8c 206: 8c 190,15: 8c 0,5
6220 Sc' 190,5: 8c 206: 8c 216: 8c 223,9: 8c 0,1:
8c 223,5: 8c 216,9: 8c 0,1: 8c 216,5: 8c
190,9: 8c 0,1: 8c 190,5: 8c 206,30: 8c O,
0,1: RETURN
7000 DATA 8,"MARCAR UM PONTO",9,"ZAP DE UM
ALIENÍGENA",10,"CHILRO DE PASSARINHO",11,
“CONTADOR GEIGER",12,"TELEFONE",13,"ASSOB10", 14,
"SIRENA EUROPEIA",15,"TIQUE-TAQUE",16,"MARCHA
FÚNEBRE",17,"PARA AS CORRIDAS"
lOOOO, HOME. : END
Música e Efeitos Sonoros 63

Listagem 7.3: EDITOR.SOM

10 REM ************************
20 REM * EDITOR.SOM *
30 REM * BY SCOTT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM ************************
90 REM
190 REM.

INTRODUÇÃO:

200 TEXT : HOME


220 VTAB 2:A$ = " EDITOR DE SOM ": INVERSE
: GOSUB 6000: NORMAL
240 VTAB 4:A* = "BY S. SCOTT ZIMMERMAN": GOSUB
6000: VTAB 5: AS = "COPYRIGHT (C) 1985":
GOSUB 60ÓQ
260 IF PEEK (768) < >169 THEN PRINT CHRÍ
(4);"BRUN CRIADOR.SOM"
490 REM

ARRANJO:

500 VTAB 8: HTAB 7: PRINT "PITCH DURACAO


RITMO": VTAB 9: HTAB 5: FOR I = 1 TO
26: PRINT NEXT I
520 P(l) = 206:P(2) = 100:P(3) = 1:IC = Is IN
= 1
540 VTAB 11: HTAB 5: PRINT HTAB 13:
PRINT HTAB 24: PRINT GOSUB
7000
560 VTAB 15: HTAB 2: INVERSE : PRINT "ESPACQ"::
NORMAL : PRINT " = TOCAR NOTA": VTAB 16:
HTAB 2: INVERSE : PRINT "RETURN";: NORMAL
: PRINT " = SELECIONA NOVO PARAMETRO"
580 VTAB 17: HTAB 3: INVERSE : PRINT
: NORMAL : PRINT " INVERSE : PRINT
"->";: NORMAL : PRINT " = DIMINUIR/AUMENTAR
PARAM."
600 VTAB 18: HTAB 2: INVERSE : PRINT "NUMERO”;
; NORMAL : PRINT " = MUDA INCREMENTO:":
GOSUB 6400
64 Jogos de Ação para o Apple

620 VTAB 19: HTAB 7: INVERSE : PRINT "P";:


NORMAL : PRINT " = PARAR"
990 REM

CICLO PRINCIPAL-í

1000 KB = PEEK ( - 16384): IF KB < 128 THEN


1000
1020 GET At
1040 IF At = CHRt (8) THEN 2200
1060 IF At = CHRt (21) THEN 2300
1080 IF At CHRt (13) THEN 2400
1100 IF At = " " THEN 2500
1120 IF At > = »0” AND At < = ,h9" THEN 2600
2000 IF At = "P" THEN 10000
2200 P(IC) = P(IC) - IN: IF P(IC) < 0 THEN P(IC)
= 255
2220 GOTO 2320
2300 P(IC) = P(IC) + IN: IF P(IC) > 255 THEN
P(IC) = 0
2320 ON IC GOSUB 6100,6200,6300: GOTO 1000
2400 IC = IC + 1: IF IC > 3 THEN IC = 1
2420 GOSUB 7Õ0Q: GOTO 1000
2500 & P(l),P(2),P(3): GOTO 1000
2600 IN = VAL (At): IF IN = 0 THEN IN = 10
2620 GOSUB 6400: GOTO 1000
5000 GOTO 1000
5990 REM

SUB-ROTINAS:

6000 HTAB (40 - LEN (At)) / 2: PRINT At: RETURN

6100 IF IC - 1 THEN INVERSE


6120 VTAB 11: HTAB 8: PRINT P(l);: NORMAL :
PRINT " ": RETURN
6200 IF IC = 2 THEN INVERSE
6220 VTAB 11: HTAB 17: PRINT P(2);: NORMAL
: PRINT " ": RETURN
6300 IF IC = 3 THEN INVERSE
6320 VTAB 11: HTAB 27: PRINT P(3);: NORMAL
: PRINT " ": RETURN
6400 VTAB 18: HTAB 28: INVERSE : PRINT IN;:
NORMAL : PRINT " RETURN
7000 GOSUB 6100: GOSU& 6200: GOSUB 6300: RETURN

10000 HOME : END


Música e Efeitos Sonoros 65

Listagem 7.4: COMPUTADOR.BACH

10 REM ************************
20 REM * COMPUTADOR.BACH *
30 REM * BY SCOTT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM ************************
90 REM
190 REM

INTRODUÇÃO:

200 TEXT : HONE


220 AS = ” COMPUTADOR BACH ”: INVERSE : VTAB
5: SOSUB 6000: NORMAL : VTAB 7: AS = "BY
S. SCOTT ZIMMERMAN": GOSUB 6000:AS =
"COPYRIGHT (C) 1985": VTAB 9: GOSUB 6000
240 VTAB 15:AS = "INVENTIÕ VII BY J. S. BACH":
GOSUB 6000: VTAB 17:A^ = "PROGRAMADO
USANDO CRIADOR.SOM": GOSUB 6000
260 IF PEEK (768) < > 169 THEN PRINT CHRS
(4);"BRUN CRIADOR.SOM"
340 DIM P(104),D(104)
490 REM

LE DADOS DA MUSICA:

500 NN = 104: FOR I = 1 TO NN: READ P(I) : NEXT


I: FOR I = 1 TO NN: READ D(I) : NEXT I
990 REM

SELECIONA TEMPO:

1000 VTAB 23: CALL - 958: PRINT "SELECIONE TEMPO


(0-5) -> GET AS: PRINT AS: VTAB 23:
CALL - 958
1020 IF AS < ”0" AND AS > "5" THEN GOTO 1000
1040 TEMPO = VAL (AS)
1090 REM

TOCA NOTAS:

1100 & 0,0,TEMPO: FOR I = 1 TO NN: & P(I),D(I):


NEXT I
66 Jogos de Ação para o Apple

2000 VTAB 23: PRINT “TOCAR DE NOVO OU PARAR? (T/P)


-> GET AS: PRINT A*: VTAB 23; CALL
- 958
2020 IF AS = "P” THEN HOME : END
2040 IF AS = “T" THEN 1000
2060 GOTO 2000
5990 REM

SUB-ROTINA:

6000 HTAB (40 - LEN (AS)) / 2: PRINT AS: RETURN

7990 REM

DADOS DO PITCH:

8000 DATA 182,197,182,206,182,219,216,212,206,


212,206,200,197,200,197,l?0
8020 DATA 182 , 197,206,197,219,206 ,*226,231 ,
228,231,226,231 ,228,231,22*6,231,228,231
8040 DATA 219,226,223,226,219,226., 223,226,219,
226,223,226,212,219,216,219,212,219,216,
219,212,219,216,219
8060 DATA 203,190,212,203,2Í9,212,223,226,223,
219,216,219,216,212,206,212,206,200
8080 DATA 197,212,206,203,206,203 197,190,197,
190,182,178,182,178,Í68,158,206,203,206,
178
8100 DATA 182,206,178,206,168,203,206,0
8990 REM

DADQS DÁ QURÁCAO:

9000 DATA 20,20,20,20,20,20.10,10,10,10,10,


10,10,10,10,10
9020 DATA 20,20,20,20,20,20,10,10,10,10,10,
1.0,10,10, 10,10,10,1.0
904Q DATA 10,10,10,10,10,10,10,10,10,10,10
10,10,10,10,10,10,10,10,10,10,10,10,10
9060 DATA 20,20,20,20,20,20,10,10,10,10,10,
10,10,10,10,10,10,10
9080 DATA 20,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,20,10,10,20,20
9100 DATA 20,20,20,20,20,20,80,40
CAPÍTULO 8
NUCLEAR FALLOUT
68 Jogos de Ação para o Apple

Alienígenas inimigos estão despejando na terra partículas radioativas


mortais. Como Chefe do Controle de Resíduos Nucleares, você é a única
pessoa viva que pode salvar a terra! Sua missão é pegar cada partícula
radioativa usando seu “prato” de controle nuclear antes que a partícula
caia na terra. Para cada partícula que você pegar, você ganha cem
pontos. Mas o seu prato de controle se encolhe a cada cinco partículas
que você pegar e continua a diminuir e diminuir até ficar da largura de
uma única partícula.
O prato será restaurado ao seu tamanho original depois de você
pegar mais cinco partículas, mas as partículas caem com uma velocidade
muito maior! Se você fracassar em pegar uma partícula, um de seus três
pratos de controle é confiscado. Uma vez que você tenha perdido todos
os três pratos, a terra está condenada e você perde o jogo.
Neste capítulo, você aprenderá as técnicas valiosas de usar o Cria­
dor de Som para efeitos sonoros de jogos; programar posições aleatórias;
estabelecer níveis de dificuldade automáticos de dentro do jogo e variar
a velocidade do jogo.

COMO JOGAR NUCLEAR FALLOUT

Digite o programa Nuclear Fallõut (Listagem 8.1) no seu còmputador


e grave-o em seu disco Jogos de Ação digitando “SAVE NUCLEAR.
FALLOUT”.
Como o programa usa o Criador de Som (Listagem 7.1), certifique-se
que você leu o Capítulo 7 e digitou e gravou (BSAVE) a rotina de som em
seu disco Jogos de Ação.
Quando você rodar o programa Nuclear Fallout, você verá a página
do título e será requisitado a pressionar qualquer tecla para começar o
jogo. Depois de pressionar uma tecla, você ouve um tom e o jogo começa.
Uma partícula aparece no topo da tela de baixa resolução e começa a
cair. O escore inicial do jogo (ESCORE = Q) também é mostrado na base
da tela na janela de texto.
Para mover seu prato de controle, pressione a tecla do ponto para
ir para a direita, ou a tecla da vírgula para ir para a esquerda. Pressione
a barra de espaço para parar seu prato. Tecle <S> para desligar o som.
Tecle <RETURN> para ligar o som novamente.

EXPLICAÇÃO DO PROGRAMA

O Nuclear Fallout obedece a mesma Organização Geral de Progra­


mas que nós demos no Capítulo 2. O Quadro 8.1 explica as variávéis-
chaves em Nuclear Fallout.
Nuclear Fallout 69

QUADRO 8.1
VARIÁVEIS PRINCIPAIS EM NUCLEAR.FALLOUT
VARIÁVEL EXPLICAÇÃO
LN Comprimento do prato de controle
MX Movimento do prato ao longo da coordenada X
ND Número de pratos (começa com ND = 3)
NUM Número de partículas pegas entre cada mudança no
tamanho do prato
OP Coordenada Y antiga da partícula
OX Coordenada X antiga do prato
PF Indicador (“flag”) da partícula; PF = 1 se a partícula
está caindo, 0 se não
SC 'Escore do jogo
SP Velocidade do prato (movimento com incremento)
SY Velocidade da partícula em queda na direção Y
XD Coordenada X do prato
XP Coordenada X da partícula
YD Coordenada Y do prato
YP Coordenada Y da partícula

Usando o Criador de Som

Efeitos sonoros adicionam atração e excitação a qualquer jogo de


computador e os sons em Nucíear Fallout não são nénhuma exceção.
Para incluir as capacidades de efeitos sonoros avançados do Criador de
Som no seu programa, siga estes passos.
1. Na seção Introdução no início de seu programa, inclua a declaração,
“BRUN CRIADOR.SOM” para carregar e inicializar a rotina de som em
linguagem de máquina (ver linha 260 do Nuclear Fallout). Observe
especialmente que você deve rodar (BRUN) o programa e não apenas
carregá-lo (BLOAD). Para evitar ter que rodar (BRUN) o programa se
ele já está ativo na memória, a linha 260 primeiro espia (PEEK) a posi­
ção de memória 768, o endereço inicial da rotina de som. Se o ende­
reço 768 contém o valor 169, então é provável que a. rotina esteja pre­
sente e ativa e você não terá que recarregá-la. Se 768 não contém 169,
■ entretanto, então o Criador de Som não está presente e você deve
rodá-lo (BRUN). Se você rodar o Nuclear Fallout e não conseguir som,
você pode ter que sair do jogo (pressionando “CTRL-C”); então digite
“BRUN CRIADOR.SOM” do modo imediato; finalmente digite “RUN”
para começar o Nuclear Fallout novamente.
2. Inclua também, na seção Introdução de seu programa, a declaração
“& RESUME” para certificar-se que o som está ligado. Isto é só uma
precaução no caso de o Criador de Som já estar ativo na memória mas
o som ter sido desligado antes com um comando “& STOP”.
70 Jogos de Ação para o Apple

3. Um oatro comando do Criador de Som, o geralmente incluído na seção


Introdução, é um comando “&” contendo todos os três parâmetros de
som — pitch, duração e ritmo. O ritmo freqüentemente permanece cons­
tante no jogo. Portanto, o ritmo precisa somente ser inicializado (na In­
trodução) e então ser excluído do resto dos comandos do jogo. Por
esta razão e para dar um tom inicial no começo do jogo, o comando
“& 200,80,1” é incluído na linha 280 do Nuclear Fallout.
4. Alguns dos jogos neste livro, incluindo o Nuclear Fallout, permitem ao
jogador ligar e desligar o som durante o curso do jogo como uma
característica opcional. Nós a programamos no jogo nas linhas 1100 -
1120 do Nuclear Fallout. Quando o jogador tecla <S>, o programa
executa o comando “& STOP”, (linha 1100), desligando o som do jogo.
Quando o jogador tecla <RETURN >, o programa executa o comando
“& RESUME”, ligando novamente o som.
5. Para ajudá-lo a selecionar quais efeitos sonoros ou tons que quer no
seu jogo, examine a demonstração de efeitos sonoros no programa
Exemplos de Sons; experimente sons variados com o programa Editor
de Som e jogue o Nuclear Fallout e outros jogos deste livro para ter
uma idéia dos tipos diferentes de sons disponíveis. Com experiência,
você desenvolverá a habilidade de usar e combinar os comandos
do Criador de Som para produzir uma variação enorme de efeitos so­
noros interessantes.
6. Os efeitos sonoros de um jogo podem ser colocados onde você quiser.
Em Nuclear Fallout, o som ocorre quando uma partícula atinge a terra
(linha 6000); quando uma partícula é pega por um prato de controle
(linha 7000); quando o tamanho do prato muda (linha 8000) e quando o
jogo acaba (linha 15000). Nenhum som é produzido enquanto uma par­
tícula está caindo, nem enquanto o prato está se movendo, pois isto
atrasaria significativamente a ação do jogo.
Seguindo estes seis passos, você poderá colocar sons dramáticos e
eficientes em seus próprios jogos de ação.

Posições Aleatórias

Programar a ocorrência de eventos e posições aleatórias é um con­


ceito importante na criação de jogos. Em Nuclear Fallout, cada partícula
deve começar a cair de uma posição aleatória da tela. Isto é programado
usando-se o gerador de número aleatório do Apple.
O código Applesoft para começar uma partícula em uma posição alea­
tória é muito simples. Na linha 2500, uma nova partícula é inicializadã em
uma posição X aleatória da tela de baixa resolução. XP, a coordenada X
da partícula, é ajustada usando o código “XP = INT (RND (1) *40)”. Como
a função RND (1) fornece um número aleatório entre 0 e 0.99999, a decla­
ração RND(1)*40 fornece um número aleatório entre 0 e 39.99999. Pegan­
do o valor inteiro desses números (com o comando INT), um número
aleatório entre 0 e 39 é gerado. Por isso, cada partícula começa em
alguma posição aleatória no topo da tela.
■ Nuclear Fallout 71

Aumentando Automaticamente os Níveis de Dificuldade

No Capítulo 6 (Race Câr), demonstramos umâ técnica pata variar o


nível de dificuldade de um jogò. Nesté caso ô jogador foi capaz de séle-
cionar o nível no início do jogo.
É possível variar automaticamente o nível de dificuldade para que
depois que o jogador atinja um determinado escore ou realize uma certa
tarefa, a dificuldade aumente; O Nuclear Fallout é um exemplo excelente
de como aumentar automaticamente níveis de dificuldade.
Na linha 7060, o programa verifica .se o número de partículas pegas
(NUM) é maior que quatro; se for, a sub-rotina da linha 8000 é chamada.
Nesta sub-rotina NUM é reajustado para zero e o comprimento (LN). do
prato de controle, que começa com LN = 5, é diminuído de um ponto.
Conforme o programa continua, o tamanho do prato diminui em toda
quinta partícula que é pega. Desta maneira a dificuldadé do jogo aumenta
automaticamente conforme aumenta a habilidade do jogador.

Velocidades Diferentes

Mas isto não p tudo. Uma vez que o prato se encolhe pára um ponto
e depois que cinco partículas são pegas com o prato neste tamanho, a
linha 8020 reajusta o prato para cinco pontos de comprimento mas au­
menta a velocidade do proçjrama. Isto é feito aumentando os valores de
SP e SY. Como SP é o incremento pelo qúal o prato se move e SY o
incremento pelo qual uma partícula cai durante uma passagem pelo ciclo
principal (ver as linhas 2000 e 3000) ambos os objetos animados movem-
se mais rápido. A velocidades mais rápidas, o prato não se encolhe para
um ponto, mas se encolhe somente para um ponto menos que o valor de
SP (ver a declaração IF da linha 8020).
O método que usamos aqui para aumentar a velocidade do jogo pode
ser aplicado a qualquer outro jogo de ação. Apenas lembre-se de que a
velocidade de um objeto animado aumenta,conforme você aumentq o
incremento pelo qual ele se move durante cada passagem pelo ciclo prin­
cipal. Há, entretanto, um limite para quão grande o incremento possa ser
e ainda manter uma animação suave. Experiência e prática ajudá-lo-ão
a programar seus jogos com uma velocidade de animação adequada.

MELHORIAS E MODIFICAÇÕES

Três melhorias que você poderá querer incorporar ao seu Nuclear


Fallout são: incluir uma declaração print para mostrar o número de pratos
de controle restantes; aumentar o núrriero de pontos ganhos pegando
uma partícula em um nível de dificuldade mais alto e incluir uma decla-/
ração print para dar o nível de dificuldade corrente. Você deve ser capaz
de fazer estas modificações sozinho.
Como vócê já devé ter déscoberto, mélhorar e modifidar estes jogos
é tão divertido quanto’jogá-los.
72 Jogos de Ação para o Apple

Listagem 8.1: NUCLEAR.FALLOUT

10 REM ************************
20 REM * NUCLEAR.FALLOUT *
30 REM & BY STEPHEN ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM 1129 EAST 470 NORTH *
70 REM * □REM, UTAH 84057 *
SO REM ************************
90 REM
190 REM

INTRODUÇÃO:

200 TEXT BB HOME


220 VTAB 5: HTAB 11: INVERSE : PRINT
FALLOUT : NORMAL
240 VTAB 8: HTAB 9: PRINT "BY STEPHEN ZIMMERMAN";
VTAB 10: HTAB 11: PRINT "COPYRIGHT (C)
1985"
260 IF PEEK (768) < > 169 THEN PRINT CHRT
(4);"BRUN CRIADOR.SOM"
280 & RESl/ME : VTAB 23: PRINT "TECLE ALGO
P/ CONTINUAR --> GET AT: & 200,80,1
490 REM

ARRANJO

500 HOME : GR
520 SC = O:XD = 18:YD = 39:PF = O:NUM
540 LN = 5:SY = 1:SP = 1:ND = 3:MX = 0
560 COLOR= 15
580 VTAB 23: HTAB 15: PRINT "ESCORE =
990 REM

CICLO PRINCIPAL:

1000 IF PEEK ( - 16384) < 128 THEN 2000


1020 GET AT
1040 IF AT = H 5 H THEN MX = SP: GOTO 2000
1060 IF AT = II H THEN MX = SP: GOTO 2000
1080 IF AT = H tl THEN MX = 0: GOTO 2000
1100 IF AT = “S” THEN & STOP : GOTO 2000
1120 IF AT = CHRT (13) THEN & RESUME
1990 REM
Nuclear Fallout 73

MOVE PRATO:

2000 OX = XD:XD - XD + MX
2020 GOSUB 9000
2060 COLOR= 0: HLIN OX,(OX + LN) AT YD
2080 COLDR- 15: HLIN XD,(XD + LN) AT YD
2100 IF PF = 1 THEN 3000
2490 REM

COMECA A CAIR:

2500 PF = 1:XP = INT ( RND (1) * 40)


2520 ¥P = 0
2990 REM

MOVE PARTÍCULA:

3000 OP = ¥P:YP = YP + SY
3020 IF YP < 39 THEN 3080
3040 IF SCRN( XP,39> = 15 THEN GOSUB 7000:
SOTO 5000
3060 GOSUB 6000: GOTO 5000
3080 COLOR= 0: PLOT XP,OP
3100 CDLOR= 5: PLOT XP,YP
5000 GOTO 1000
5990 REM

PARTÍCULA ATERRISSOU:

6000 COLOR= 0: PLOT XP,OP:ND = ND - 1: i 130,


20: & 50: IF ND = 0 THEN 15000
6020 PF = 0: RETURN
6990 REM

PARTÍCULA PEGA:

7000 & 245,10: & 170:PF = 0: COLOR= 0: PLOT


XP,OP
7020 NUM = NUM +■ 1:SC = SC + 100
7040 VTAB 23: HTAB 15: PRINT “ESCORE = "; SC
7060 IF NUM > 4 THEN GOSUB 8000: RETURN
7080 COLGR= 0: PLOT XP,OP
7100 RETURN
7990 REM
74 Jogos de Ação para o Apple

MUDA TAMANHO DO PRATO:

6000 NUM = 0: & 236,10: & 241: & 245: COLQR=


0: HLIN XD,(XD + LN) AT YD:LN = LN -
1
8020 IF LN < SP - 1 THEN LN = 5: FOR I = 1
TO 255 STEP 10: & 1,3: NEXT :SY = SY
+ 1:SP = SP + 1: IF SP > 6 THEN SP =
6:SY = 6: FOR I = 1 TO 255: & 1,2: NEXT
: GOSUB 9000
6040 OX = O: RETURN
8990 REM

VERIFICA BORDAS:

9000 IF XD > 39 THEN XD = Ó


9020 IF XD < 0 THEN XD = 39 - LN
9040 RETURN
14990 REM

GAME OVER:

15000 FOR I = 250 TO 50 STEP ’ 50: 1,15:


NEXT : TEXT : HOME
15020 VTAB 10: HTAB 5: PRINT "SEU ESCORE: ”;
SC
20000 VTAB 20: HTAB 1: PRINT "JOGAR DE NOVO (SZN)?
J ■ GET AS: IF AS = ”S " THEN 500
20020 IF A$ < > "N" THEN 20000
CAPÍTULO 9
INVADERS
76 Jogos de Ação para o Apple

Discos voadores extraterrestres invadiram a atmosfera da terra e


ameaçam aniquilar a humanidade. Se duas bombas alienígenas tocarem
o chão no mesmo local, elas penetrarão a crosta terrestre e o mundo
explodirá. Você deve atirar nos invasores e interceptar tantas bombas
quanto possível. Apenas certifique-se de não ser atingido por uma bomba
ou deixar que as bombas penetrem a crosta terrestre. Boa sorte!
Invaders usa muitos dos fundamentos aprendidos em capítulos ante-:
riores e introduz as técnicas de soltar bombas e atirar balas; programar
eventos aleatórios; e animar objetos múltiplos.

COMO JOGAR INVADERS


A Listagem 9.1 fornece o programa em Applesoft BASIC para o
Invaders. Digite-o no seu computador e grave-o no seu disco Jogós de
Ação digitando “SAVE INVADERS”. Como no jogo anterior (Nuclear
Fallout), você precisa usar o Criadpr de Som (Capítulo 7), então certifi­
que-se que ele também se encontra no seu disco Jogos de Ação.
Use a vírgula para mover sua nave para a esquerda, o ponto para
mover para a direita e a barra de espaço para parar sua nave. Além disso,
sua nave dispara um míssil quando você tecla <X>. Disparar um míssil
custa cinco pontos (a não ser que você já esteja em zero). Acertando um
alienígena você ganha dez pontos. Acertando um disco voador de um.
invasor você ganha trinta pontos.
Há sempre um invasor no topo da tela de baixa resolução enquanto
sua nave está localizada na base da tela. Abaixo da nave estão duas linhas
horizontais que representam duas camadas da crosta terrestre. Dando à
nave e a cada camada da crosta uma cor diferente, o programa pode
facilmente verificar qual destes objetos é atingido por uma bomba inva­
sora que cai.

EXPLICAÇÃO DO PROGRAMA

Invaders segue a Organização de Programas dada no Capítulo 2.


A animação dos objetos gráficos de baixa resolução está conforme os
sete passos da animação dados no Capítulo 3. Para ajudá-lo a entender
a listagem do programa, as variáveis-chaves usadas em Invaders são
dadas no Quadro 9;1.

QUADRO 9.1
VARIÁVEIS PRINCIPAIS EM INVADERS
VARIAVEL EXPLICAÇÃO

FB Indicador da bomba invasora; 1 para ativo, 0 para


inativo
FM Indicador do míssil; 1 para ativo, 0 para.inativo
Invaders 77

QUADRO 9.1 (Continuação)


VARIÁVEIS PRINCIPAIS EM INVADERS
VARIÁVEL EXPLICAÇÃO
Ml Movimento do invasor na coordenada X
MS Movimento da nave na coordenada X
OB Coordenada antiga Y da bomba
OI Coordenada antiga X do invasor
OM Coordenada antiga Y do missel
OS Coordenada antiga X da nave
PL Posição do pivô; coordenada X onde o invasor
muda de posição
SC Escore do jogo
SN Variável de som
SP Posição da tela; para verificar por colisão na tela
XB Coordenada X da bomba
XI Coordenada X do invasor
XM Coordenada X do míssil
XS Coordenada X da nave
YB Coordenada Y da bomba
Yl Coordenada Y do invasor
YM Coordenada Y do míssil
YS Coordenada Y da nave

Soltando Bombas e Atirando Balas

Para soltar uma bomba ou atirar uma bala, o seu programa tem que
seguir os mesmos sete passos da animação (ver Capítulo 3) usados para
animar qualquer tipo de objeto. A única diferença é que você completa
os passos 1 e 2 (inicializar e gravar as coordenadas iniciais e desenhar
a figura inicial) na seção do Ciclo Principal ao invés de na seção Arranjo
do programa.
Por exemplo, em Invaders, a bomba é solta inicialmente na linha
2200 e o míssil é lançado inicialmente na linha 1100 como urna chamada
para a sub-rotina 9000. O evento aleatório de soltar uma bomba e da
própria animação da bomba _e do míssil é explicado nas seções abaixo.

Eventos Aleatórios
Em Nuclear Fallout (o capítulo anterior), explicamos a técnica sim­
ples de programar posições aleatórias, usando o gerador de número alea­
tório do Apple. As partículas começam em uma coordenada aleatória Y
antes de se moverem para baixo na tela de baixa resolução. Agora, esten-
78 Jogos de Ação para o Apple

demos o uso do gerador de número aleatório para a técnica da progra­


mação de eventos aleatórios. Em Invadérs o disco voador muda de dire­
ção em tempos àléatórios durante o curso do jogo.
Há três maneiras para esta programàijão:. selecione uma hòra alea­
tória na qual o invasor mudará de direção.e então faça* a mudança quando
o cronômetro do jogo atingir o valor apropriado; decida aleatoriamente
se a direção mudará conforme ó invasor faça Cada passo de movimento;
selecione uma posição aleatória na tela é faça com'que o invasor mude
de direção quando ele-atingir esta.determinada posição. Invaders usa
o último método.
Quando o invasor está para ser desenhado na tela, sua posição inicial
(coordenada X) na tela de baixa resolução é selecionada aleatoriamente
(ver linha 7500) e então sua posição pivô, a Coordenada X na qual o:
invasor mudará de direção, é selecionada aleatoriamente (ver linha 6500).
Conforme o invasor se move, ele continua na rpesma direção até que
atinja a posição pivô (ver linhas 2140-2160). Desta maneira, o jogadpr
nunca Sabe quando o invasor mudará de dirèção.
Outro evento aleatório em Invaders, é quando o alienígena solta a
bomba. Este evento aleatório é programado usándo-se o segundo método
mencionado acima. Cada vez, atraVés do ciclo principal, a linha 2200
verifica se uma bomba já está na tela (ver FB no Quadro 9.1) e se não,
decide aleatoriamente se uma bomba deve ser soltà. A expressão na
linha 2200, “IF INT (RND (1) * 50) = 0 THEN...” será verdadeira aproxi­
madamente uma vez a cada cinqüenta passagens pelo ciclo principal
(enquanto nenhunna bomba está atíva). Quándò verdadeira, o indicador
da bomba FB é ajustado para 1, querendo dizer que uma bomba está
ativa agora é a nova bomba é desenhada na tela.

Animação de Objetos Múltiplos

( Como yocê escreve um programa ém Applesoft .BASIC,de maneira


que vários objetos na tela se movam de uma só vez? Você não pode! O
jcômputador Applé só pode fazer, uma coisa de cada vez; portanto,
somente um objeto pode estar se movendo a qualquer instante.
Mas é. possível criar a ilusão de vários objeto? se .movendo de uma
s,Õ vez como fizemos em Nuclear Fallout (Capítulo 8). Uma partícula e seu
prato de cqhtrole pareçiam se mover ao mesmo tempo.
,Para anipiar-vários objetos na tela de uma só véz, você deve escrever
seu programa de modo que cada objeto mova um incremento (onde um
incremento é geralmente um a quatro pontos na tela) durante cada pas­
sagem do ciclo principal.- Examine a Listagem 9.1 de Invaders. Durante
o ciclo principal (linhas 1000-5000), a nave se move, (nas linhas
2000-2080); o invasor.se move (nas linhas 21Q0-21.80); o míssil se move
(nas linhas 2200-230Ò); e a bomba se move (rias linhas 2320-240.0).. Cada
uma destas quatro seções,de código são parecidas, envolvendo basica­
mente ps ipesmos. passos de animação que demos no Capítulo 3. A única
Invaders 79

adição aos sete passos da animação é que eis duas últimas seções (para
o míssil e a bomba) devem primeiro verificar se o objeto está ativo na
tela. Se nenhuma bomba está caindo, ou nenhum míssil está atirando, a
seção correspondente do ciclo principal é pulada.
Você perceberá que o programa usa alguns códigos estranhos .para
o incremento de,movimento do invasor (ver linhas 2100-21.Ç0). Normal­
mente, o incrpmento é.uma integral (número inteiro), como urh ou dois,
Mas aqui ò incremento é 0.1. O Applesoft aceita nãó-intégráis (frações
decimais) para as coordenadas X,Y em um cornando “PLOT.’,’ de baixa re­
solução. A parte fracional é simplesmente truncada (cortada fora) quando
o PLOT é executado. Um incremento de Q.1 terri o efeito de mover o inva­
sor apenas um ponto a cada dez passagens pelo ciclo principal. Este
movimento lento é necessário para ter alguma esperançà de se acertar
um.alienígena còm o seu míssil.

MELHORIAS E MODIFICAÇÕES

A melhoria principal que vpcê desejaria fazer a Invaders é. torná-lo


mais rápido. Os objetos no jogo movem-se um pouco vagarosamente,
pois há quatro objetos movendorse de uma só vez e o incremento de
movimento para os quatro objetos é um Ou m,ènos. Pode, parecer um
assunto trivial aumentar á velocidade da animação simplesmente aumen­
tando o incremento do movimento, mas em Invaders, não é tão simples
assim.
O problema apárece porque s.e você aumentar a velocidade do inva­
sor, vócê terá dificuldade em, acertá-ío com um míssil.' Além do mais,
se você aumentar a velocidade do míssil mudando o incremento de um
para dois óu três, então o míssil pode pular por sobre a bomba ou por
sobre b invasor sem acertá-los. De modó parecido, se você aumentar o
incremento da bomba que cai, ela também pode pular por sóbre o míssil
ou por sobre as duas camádàs do chão, causando problemas no jogo.
Então sem fazer algumas mudanças drásticas no projeto do jogo, você
terá que, aceitar sua velocidade corrente. A não ser que você conheça
alguns outros-truques,..

Acelerando o Applesoft

Você talvez tenha lido algúmas das sugestões pata aóelerar o Apple­
soft dadas no Manual de Referência do Programador de Applesoft BASIC.
Sugerimos que você tente algumas delas, mas achamos que as sugestões
do Manual de Referência do Programador têm pouco efeito percebível na
velocidade dos jogos de. ação. A Organização de Programas dada no
Capítulo 2 deste livro permite a você produzir programas claros, fáceis
de se escreverem que também aumentam a velocidade de execução
do programa.
80 Jogos de Ação para o Apple

Compilando o Applesoft

Se você sente que seus jogos de Applesoft são muito lentos e acele­
rá-los parece um trabalho difícil ou impossível, você talvez queira usar um
compilador Applesoft.
O Applesoft BASIC é uma linguagem interpretada. Cada linha de có­
digo BASIC deve ser traduzida, uma linha de cada vez, em código de má­
quina conforme o programa está sendo executado. Mesmo estas linhas
Applesoft que são executadas muitas vezes (como estas em um ciclo
FOR-NEXT ou estas no ciclo principal do programa) devem ser traduzidas
toda vez através do ciclo. Este processo de tradução é lento.
Se houvesse uma maneira de se fazer a tradução do Applesoft BASIC
para código de máquina apenas uma vez — antes do programa ser exe­
cutado — o programa rodaria muito mais rápido. Isto é o que um compi­
lador Applesoft faz — traduz código Applesoft BASIC em linguagem de
máquina.
Vários compiladores Applesoft estão disponíveis. Usamos o compi­
lador chamado TASC (uma abreviação de The Applesoft Compiler), que
você pode adquirir da Microsoft, Inc., 400 108th Ave. NE, Suite 200, Bel­
levue, WA 98004, U.S.A.
TASC torna Invaders rápido! De fato, muito rápido. Portanto você
tem que modificar a Listagem 9.1 para ter um bom programa fonte parà
compilar.
Para usar TASC para compilar Invaders, faça o seguinte:
1. Certifique-se que o arquivo do programa Invaders está em um
disquete formatado com DOS 3.2 ou 3.3, visto que TASC não é
compatível com ProDOS neste momento.
2. Você precisa apagar todas as referências no programa para o
Criador de Som, pois TASC não permite o uso de comandos
para chamar sub-rotinas. Para fazer isso, apague a linha 240 e
mude todos os comandos para “J = PEEK(— 16336)”. Desta
maneira, Invaders ficará com pelo menos alguns efeitos sonoros.1
3. Se você compilar esta versão de Invaders, o jogo ainda será
muito rápido para ser jogado. Mas se você diminuir a taxa na
qual as bombas caem do céu, o jogo será jogável. Para fazer
isso, mude as linhas seguintes como indicado:

2360 YB = YB + .2
2380 COLOR = 0: PLOT XB,OB:SP = SCRN( XB,YB):
IF SP > 0 THEN FB = 0 :GOSUB 8000:GOTO 1000
2400 COLOR = 3: PLOT XB.YB

4. Depois de fazer estas mudanças, teste o programa modificado


antes d.e compilá-lo, para ter certeza que ele não tem erros.
Ele rodará muito mais lento que antes, mas isto é o que você
quer.
Invaders 81

5. Grave Invaders de volta para o disco usando o nome “INVA­


DERS.F” (para não escrever por sobre a versão original de In­
vaders).
6. Agora coloque o disquete TASC no Drive =fj=1 e seu disco con­
tendo Invaders.f no Drived 2 e digite “RUN TASC.D1”.
7. Quando o programa perguntar a você pelo arquivo fonte, digite
“INVADERS.F,D2” e quando perguntar a você pelo nome do
arquivo objeto, digite “lNVADERS.OBJ,D2”.
8. Tecle < RETURN > quando perguntadas as outras questões em
TASC. Isto aceita os defaults do compilador.
9. Quando acabar de compilar, você está pronto para rodar a ver­
são compilada de Invaders. Para fazer isso, digite “BLOAD
RUNTIME,D1" para carregar as rotinas runtime de TASC do
disco para a memória. Então digite “BRUN INVADERS.OBJ".
10. Você está agora pronto para jogar! É um jogo rápido e desa­
fiante, mas não impossível.
Talvéz haja outras maneiras de se resolverem os problemas de velo­
cidade em jogos Applésoft, mas elas estão além do objetivo deste livro.
32 Jogos de Ação para o Apple

Listagem 9,1: JNVADERS

10 REM *#*********************,*
20 REM * INVADERS , , *
30 REM *. BY BRENT ZIMMERMAN *
40 , REM * COPYRIGHT (C), 1985. .*
,50. REM * COMPUTER EXPRESSIONS ’*
60 REM * 1129 EAST 470 NORTH . *
/O REM OREM, UTAH 84057
80 REM ******#**^********#»****.
90 REM
190 REM

INTRODUÇÃO:

200 TEXT s HDMÉ


220 VTAB 5: HTAB 15s INVERSE : PRINT
" INVADERS NORMAL t VTAB 7: HTAB 11::
PRINT "BY BRENT ZIMMERMAN": VTAB 9t '
HTAB 11: PRINT "COPYRIGHT (C) 1985"
240 IF PEEK C768) < > 169 THEN PRINT CHR$
(4);"BRUN CRIADOR.SOM"
260 VTAB 23: PRINT "TECLE <ESPACO> -> ”: :
’ GET A$: PRINT AT
490 REM

ARRANJO

500 GR : HOME :SC = 0:FM = O:FB = O:MS « 0


520 & RESUME :XS = 19:YS = 37: YI = 0: COLOR=
15: HLIN 0,39 AT 38; COLOR= 5: HLIN 0,
39 AT 39
540 GOSUB 7500
580 COLOR= 10: HLIN XS - 1,XS + 1 AT YS: PLOT
XS,YS - 1
600 VTAB 23: HTAB 15: PRINT "ESCORE GOSUB
6000
620 & 150,3,1: GOSUB 8500
990 REM

CICLO PRINCIPAL:

1000 IF PEEK < - 16384) < 128 THEN 2000


1020 GET AT
1040 IF AT = THEN MS = -is GOTO 2000
1060 IF AT = "." THEN MS = 1: GOTO 2000
Invaders 83

1080 IF A$ = " " THEN MS = Ós GOTO 2100


1100 IF = "X" THEN GOSUB 9000
2000 OS = XS
2010 IF MS = 0 THEN 2100
2020 XS = XS + MS
2040 IF XS < 2 THEN XS = 1: MS = Os GÚTO 2080
2060 IF XS > 38 THEN XS-= 38: MS. = Ò '
2080 COLOR» 0: HLIN OS - 1,OS+ 1 AT YS: PLOT
OS,YS - 1: COLOR» 10: HLIN XS - 1TXS
+ 1 AT'YS: PLOT XS,YS -i 1 '
2100 01 = XI
2120 XI = XI + MI
2140 IF MI = - .1 AND XI < PL THEN Ml .= -
MI: GOSUB 6500: GOTO 2120
2160 IF MI = .1 AND XI > PL THEN Ml = ' - MI;
GOSUB 6500: GOTO 2120
2180 COLOR» O: HLIN 01 - 1,01 +.1 AT YÍ: COLOR»
1: HLIN XI - 1,XI + 1 AT YI
2200 IF NOT FB THEN IF INT ( RND <1) * 50)
= 0‘ THEN FB = 1:XB = XI:YB = 1: COLOR»
1 PLOT XÉ,YB'
2220 IF NOT FM THEN 2320
2240 OM = YM '
2260 YM = YM - 1: IF YM = - 1 THEN COLOR»
0: PLOT XM,OM:FM = Ó: GOTO 2320
2280 SP = SCRNC XM,YM)S: IP SP > O THEN GOSUB
7000: GOTO 2320
2300 COLOR» 0; PLOT XM,QM: COLOR» 2: PLOT XM,
YM • 3 ‘ ’
2320 IF NOT FB THEN1 100Ô
2340 OB = YB
2360 YB = YB + 1
2380 SP = SCRN( XB,YB): IF SP > O THEN COLOR»
O: PLOT XB,OB:FB = 0: GOSUB 8000: GOTO
1Õ00
2400 COLOR» OS PLOT XB;OB: COLOR» 3: PLOT XB,
YB : •' ?
5000 GOTO 1000 ■
5990 REM

SUB-ROTINAS:

6000 IF SC < 0 THEN SC » 0


6020 HTAB 23: PRINT SC"
6040 RETURN
84 Jogos de Ação para o Apple

6500 PL = INT ( RND (1) * (37 - XI) + XI):


IF MI = - .1 THEN PL = INT ( RND (1)
* XI) + 2
6520 RETURN
7000 IF SP = 3 THEN COLOR= 0: PLOT XB,YB;
GOSUB 8500s PLOT XM,OM:SC = SC + 10;FM
= OsFB = 0: GOSUB 6000: RETURN
7020 FOR SN = 1 TO 25: 8c RND (1) *50 + 200
NEXT SN: COLORS 0: HLIN XI - 1,XI +
1 AT YI: PLOT XM,OM:FM = 0: SC = SC +
30: GOSUB 6000: GOSUB 7500: RETURN
7500 MI = ( INT ( RND (1) * 2) * 2 - 1) / 10;
XI = INT ( RND (1) * 34) + 3: GOSUB
6500: RETURN
8000 IF SP = 10 OR SP = 5 THEN 15000
8020 IF SP = 15 THEN CQLOR= O: PLOT XB,YB:
FDR SN = 1 TO 25: & RND (1) * 100 +
1: NEXT SN:SC = SC - 5: GOSUB 6000: RETURN
8040 GOSUÈ 8500: COLDR= 0: PLOT XM,YM;FM =
O:SC = SC + 10: GOSUB 6000; RETURN
8500 FOR SN = 150 TO 255 STEP 5: 8c SN: NEXT
SN: RETURN
9000 IF FM THEN COLOR= 0: PLOT XM,YM
9020 FM = 1
9040 XM = XS:YM = 35:SP = SCRN( XM,YM): IF
SP > 0 THEN GOSUB 7000: RETURN
9060 FOR SN = 100 TO 255 STEP 35: 8c SN: NEXT
SN
9080 COLOR= 2: PLOT XM,YM
9100 SC = SC - 5: GOSUB 6000: RETURN
14990 REM

GAME OVER:

15000 FOR SN = 1 TO 80: & 255 - SN: NEXT SN:


TEXT ; HOME : PRINT “ESCORE FINAL « "SC
15020 VTAB 5: PRINT "JOGAR DE NOVO? (S/N) ";
15040 GET AS: IF A$ = "S" THEN 500
15060 IF AS < > "N" THEN 15040
CAPÍTULO 10
SPACE HUNTER
86 Jogos de Ação para o Apple

Parabéns! -Você acaba de receber o posto de oficial e piloto de nave


estelar da Tropa Galáctica, com a graduação de 2.° tenente. Sua missão
é encontrar e destruir alienígenas inimigos dentro do seu setor da galá­
xia. Enquanto movimenta sua nave estelar, você deve observar cuidado­
samente sua tela de visão de longo alcance para detectar naves aliení­
genas dentro do seu setor; persiga qualquer alienígena até que este esteja
na sua tela de visão de curto alçance; então persiga e destrua-o..Fique
sabendo, entretanto, que os alienígenas tentarão escapar do seu raio
laser; e que os seus canhões laser gastam energia preciosa. Você deve
completar a missão espacial antes de retornar" à nave-.mãe para reabas­
tecer. Se você ficar sem energia antes de recarregar, você ficará enca­
lhado no espaço para sempre!
Esse jogo excitante e desafiante mostrará a você várias técnicas
novas de programação, incluindo: ciclos principais duplos, a janela de
texto como gráficos, controle do joystick, entrada via botão do paddle e
explosões de baixa resolução.

COMO JOGAR SPACE HUNTER

Digite o programa Space Hunter (Listagem 10.1) no seu computador


e grave-o no seu disco Jogos de Ação. Este jogo não usa o Criador de
Som.
Space Hunter requer o uso de um joystick. Quando você começar,
verá primeiro a página do título. O programa principal começa depois de
você pressionar a barra de espaço. A tela de gráficos de baixa resolução
contendo os visores do seu canhão representa sua tela de visão de curto
alcance. O quadrado em vídeo inverso no canto inferior direito (no texto)
representa sua tela de visão de longo alcance. A tela de longo alcance
tem um “+” no centro para representar a posição de sua nave estelar, e
um “*” que se move para representar a posição relativa de uma nave
alienígena. Você deve usar o joystick para dirigir sua nave estelar quando
o alienígena estiver em curto alcance. Então o “*” desaparece do visor
de longo alcance e um bloco aparece no visor de curto alcance. Lembre-
se de que o joystick move sua nave estelar, e não a nave do alienígena.
Para disparar seus lasers, pressione o botão do paddle ou do joys­
tick (eles são equivalentes neste jogo). Os lasers dispararão de sua nave
estelar na direção de qualquer alvo no centro dos visores de seu canhão.
Disparar um laser gasta 100 unidades de energia, como indicado no canto
inferior direito da tela.
Após completar cada missão, você pode reabastecer-se em sua na-
ve-mãe, que é representada por um ” na tela de longo alcance. O re­
abastecimento é automático, uma vez que você tenha aportado na sua
nave-mãe. Para aportar, coloque a nave-mãe nos seus visores do canhão.
Depois de completar com sucesso cada missão e reabastecer sua nave,
você será promovido para um posto superior.
Space Hunter 87

EXPLICAÇÃO DO PROGRAMA

Space Hunter não segue a Organização Padrão dé Programas pois


tem dois ciclos principais, como é explicado abaixo. Outras característi­
cas do projeto do programa, entretanto, são as mesmas dà Organização
Padrão de Programas que demos no Capítulo 2. O Quadro 10.1 dá as
variáveis-chaves de Space Hunter.

QUADRO 10.1
VARIÁVEIS PRINCIPAIS EM SPACE HUNTER
VARIÁVEL EXPLICAÇÃO
EG Energia restante na sua nave estelar
H Valor HTAB para objeto a longo alcance
PB Posição de memória do botão 0 do,paddle; o
botão 1 do paddle é PB + 1
RA Graduação do jogador (valor numérico)
RAS Graduação do jogador (norríe)
SF Indicador da nave; SF = 1 para inimigo, 0 para
nave-mãe
SK Número de naves inimigas derrubadas
TN Posição de memória do alto-falante,
V Valor VTAB para objeto em longo alcance
X Coordenada X do inimigo ou da nave-mãe
X$ Equivalente ASCII às posições X da explosão
XE( ) Coordenadas X da seqüência da explosão de baixa
resolução
XM Movimento do inimigo ou da nave-mãe ao longo da
coordenáda X
Y Coordenada Y para objeto a longo alcance
YS Equivalente ASCII das coordenadas Y da explosãd
YE( ) Coordenadas Y da séqüência da explosão dé baixa
resolução
YM Movimento do inimigo ou da nave-mãe ao longo dá
coordenada Y

Antes de introduzir os novos conceitos demonstrados por Space Hun­


ter, explicaremos como o programa lida com a posição do inimigo' alièní-
gena a curta e lónga distâncias.
Na seção Arranjo, a posição original do inimigo é determinada alea­
toriamente (veja linha 640). As cpordenadas X e Y podem assumir valores
de —40 a +80, como se houvesse uma grande tela de gráficos do tamanho
de 9 telas normais de baixa resolução em uma rede de 3 telas por 3 telas.
A terça parte esquerda da tela vai de X = -40 a X - -1. A terça parte
88 Jogos de Ação para o Apple

do meio (que é o limite para a tela verdadeira de baixa resolução usada


no jogo) vai de X = 0 a X = 39. A terça parte da direita vai de X = 40 a
X = 80. Do mesmo modo, a terça parte de cima da tela grande vai de Y =
-40 até Y = —1. A terça parte do meio vai de Y = 0 até Y = 39 (o limite
para a tela verdadeira de baixa resolução), e a terça parte inferior vai de
Y = 40 até Y = 80.
Se as coordenadas X,Y do alienígena estão fora das coordenadas
normais da tela de baixa resolução (0 — 39,0 — 39), então o visor de longo
alcance (explicado abaixo) está ativo. Se, por outro lado, as coordenadas
X,Y estão dentro dos limites normais da tela de baixa resolução, então o
visor de curto alcance está ativo.

Ciclos Principais Duplos


A seção Ciclo Principal é a seção mais importante de um jogo de
ação e a idéia do ciclo principal é o conceito mais importante no desen­
volvimento de jogos para computadores (como foi mencionado no Capí­
tulo 2). Todo jogo de ação precisa de um ciclo principal, no qual a ação
principal do jogo acontece. Em Space Hunter, há duas fases distintas dõ
jogo: procurando o alienígena (ou a nave-mãe) usando o visor de longo
alcance; e perseguindo e atirando no alienígena (ou aportando na nave-
mãe) usando o visor de curto alcance. Cada uma dessas fases tem seu
próprio ciclo principal separado: as linhas 1000-1380 para o inimigo a
longa distância e linhas 2000-2200 para o inimigo a curta distância.
No primeiro ciclo principal (linhas 1000-1380, chamado “INIMIGO A
LONGA DISTÂNCIA”) o programa verifica se o inimigo está dentro de
curta distância (veja linha 1000), e se for o caso, vai para o segundo ciclo
principal (linhas 2000-2200, chamado “INIMIGO A CURTA DISTÂNCIA”).
No segundo ciclo principal, o programa verifica se o alienígena (ou a
nave-mãe) sai alguma vez do curto alcance (veja linha 2120), e se for o
caso, vai de volta ao primeiro ciclo principal.
Os dois ciclos principais fazem muitas coisas iguais: verificam a
entrada via joystick; animam o alienígena ou a nave-mãe (dependendo
do indicador SF na sub-rotina chamada “INIMIGO OU NAVE DE COM­
BUSTÍVEL”); e verificam os limites da tela para moverem entre animação
de curta e longa distância. Além disso, o ciclo de curta distância (veja
linha 2000) verifica se um botão do joystick foi pressionado e chama as
sub-rotinas que disparam os lasers, verificam choques e fazem as ex­
plosões.
Se os seus jogos de ação têm várias fases, cada uma com um tipo
diferente de ação ou de tela gráfica, você talvez queira colocar mais de
um ciclo no seu programa. A Organização Padrão de Programas dada no
Capítulo 2 é apenas um guia, não um mestre. Mude à vontade o projeto
sugerido para que se adapte às suas necessidades de programação.

Usando a Janela de Texto para Gráficos


Os programadores freqüentemente não percebem o fato de que os
efeitos gráficos não são limitados a uma das telas gráficas. Desenhos
Space Hunter 89

simples de matemática e gráficos de barras, por exemplo, são melhor


desenhados nos gráficos de alta resolução, mas podem também ser dese­
nhados na tela normal de texto. Em Space Hunter, precisamos de duas
telas gráficas diferentes para serem vistas de uma só vez. A solução: usar
parte da janela de texto para gráficos.
A idéia é simples. Uma tela de longa distância é representada por
um bloco de vídeo reverso no canto inferior direito da janela de texto. Se
as coordenadas X,Y de uma nave alienígena caem fora da tela normal de
baixa resolução, então um caractere de texto é mostrado dentro do bloco
inverso para mostrar a posição do alienígena com relação à sua nave
estelar. As linhas 1020-1120 calculam as posições HTAB (usando a variá­
vel H) e VTAB (usando a variável V) para o caractere de texto que repre­
senta o alienígena. Então o caractere do alienígena (* em vídeo inverso)
é mostrado na linha 1160. (Se você está procurando sua nave de combus­
tível, um 4^ em vídeo inverso é mostraçio na linha 1180).
Com sua própria engenhosidade e criatividade, você será capaz de
pensar em outros jogos nos quais a tela de texto pode ser usada como
uma tela gráfica. Com a aplicação certa e programação correta, esta
técnica pode ser bem eficiente.

Controle do Joystick

No Capítulo 6, você aprendeu a programar a entrada via paddle que


é tão fácil quanto programar a entrada via joystick. De fato, um joystick
não é nada mais nada menos do que dois paddles. A posição corrente do
joystick é lida no seu computador com os comandos em Applesoft BASIC,
“PDL(0)” e “PDL(1)”. Movendo o cabo de seu joystick para a extrema
esquerda obtém-se uma leitura PDL (0) de 0 e movendo-o para a extrema
direita obtém-se uma leitura PDL(0) de 255. Do mesmo modo, movendo o
cabo do joystick para cima obtém-se uma leitura PDL(1) de 0, e moven­
do-o para baixo, obtém-se uma leitura PDL(1) de 255. Na maioria dos
programas, movendo um joystick para a esquerda ou para a direita mo-
ve-se um objeto na tela na direção X (horizontal) e movendo o joystick,
para cima e para baixo move-se um objeto na direção Y (vertical). A dire­
ção X do joystick é, portanto, determinada pela leitura PDL(0) e a direção
Y é determinada pela leitura PDL(1).
Por exemplo, em Space Hunter, o movimento de sua nave estelar
na direção horizontal é determinado pela sua posição PDL(0). Se você
mover seu joystick para a direita, sua nave estelar também o faz, com o
resultado de a posição do alienígena no seu visor de curto ou longo
alcance se mover para a esquerda. Isto pode lhe parecer às avessas,
então analise o seguinte: se você está em um carro, e um poste de luz
está à sua direita, você vê o poste de luz pelo lado direito do pára-brisa.
Agora, conforme você vira para a direita, você vê o poste de luz mais
para o centro do pára-brisa. $e você continuar virando para a direita, o
poste de luz aparece mais e mais para a esquerda no seu pára-brisa.
Então, virando-se para a direita faz com que o poste de luz pareça se
mover para a esquerda.
90 Jogos de Ação para o Apple

Isto é progrâmado nas linhas 1220-1280 da seção de longa distância,


e nas linhas 2040-2100 da seção de curta distância. Se o paddle 0 (o con­
trole horizontal do joystick) está apontando para a direita, com sua leitura
maior que 191 (veja linha 2040), o movimento X do alienígena, XM, diminui
de um, e o alienígena parece mover-se para a esquerda. Se o paddle 0
está apontando para a esquerda, com sua leitura menor que 64 (veja
linha 2060), o alienígena parece mover-se para a' direita. O controle ver­
tical do joystick funciona da mesma maneira.
Mesmo que os detalhes de como a sua nave estelar se move com
relação à nave alienígena possam ser difíceis de entender, a idéia prin­
cipal é simples: Para programar a entrada via joystick, use o comando:
PDL(0) para conseguir o valor X (horizontal) e PDL(1) para conseguir o;
valor Y (vertical).

Entrada dos Botões do Paddle


Atirar com um bôtão de paddle ou com um botão de joystick é tão
fácil quanto atirar balas pressionando uma tecla (veja Capítulo 9). Na
linha 2000, o programa usa os comandos PEEK para verificar as posições
de memória - 16287 (dada como sendo a variável PB, para o botão do
paddle 0) e - 16286 (PB +-1, para o bôtão do paddle 1). Se o valor em
uma dessas posições de memória é maior que 127, o botão do respectivo
paddle foi pressionado. Se o valor é menor ou igual a 127, então o botão
não está sendo pressionado.
Em Space Hunter, se qualquer um dos botões for pressionado, p pro­
grama dá um GOSUB da linha 2000 para a linha 7000, onde se localiza a
rotina que dispara o laser. Depois do GOSUB, o programa usa o comando
SCRN para verificar se um inimigo foi atingido. Se foi, o programa dá um
GOSUB para a linha 7200 para executar a explosão.

Explosões em Baixa Resolução

Explosões adicionam excitação para quase todos os jogos de ação.


A idéia básica de uma explosão é criar uma seqüência de passos durante
a qual uma figura diferente é mostrada na tela e um efeito sonoro é gera­
do. Para fazer e programar estes passos, faça o seguinte:
1. Planeje a seqüência gráfica para a explosão. Por exemplo, em
Space Hunter, cada passo da seqüência consiste de um grupo
de pontos de baixa resolução na tela. O primeiro passo mostra
um emaranhado de poucos pontos centralizados em torno da
posição da explosão da navé alienígena.: Os próximos passos
mostram os pontos afastados e mais para baixo, corpo a explo­
são ocorre para fora e cai. Finalmente, ó conjunto de pontos é
apagado e a explosão acaba.
2. Ajuste matrizes com as coordenadas X,Y da tela para todos os
pontos dos passos da explosão, Em Space Hunter, há quatro
Space Hunter 91

passos de explosão, e sete pontos em cãda passo; portanto,


uma matriz de 7 x 4 é inicializada na seção Introdução do pro­
grama. Estas matrizes são DIMensionadas na linha 160 como as
matrizes XE(7,4) e YE(7,4) e então inicializadas na linha 260.
Á inicialização usa um truque rápido. Cada uma das sete coor­
denadas. X para cada um dos quatro passos da seqüência da
explosão foi codificada em um caractere ASCII. Estes códigos
foram juntados na string X$ (veja a linha 200 da Listagem 10.1).
Por exemplo, o primeiro caractere é B, que tem o valor ASCII
igual a 66. O programa subtrai 48 de 66 para obter a coordenada
correta X. O valor 66 — 48 — T8 torna-se então o valor da coor­
denada X para o primeiro ponto da primeira figura da explosão.
O segundo caractere em X$ é C, que tem o valor ASCII igual a
67. Isto é transformado para 67 - 48 = 19, o valor da coorde­
nada X para o segundo ponto da primeira figura da explosão.
. A linha 26Ó usa os çomandos Applesoft BASIC MIDS e ASC para
traduzir a string de caracteres ASÇII de volta às coordenadas
corretas X e Y nas matrizes XE e Y.E. Você talvez tenha que ver
códigos de caracteres ASCII no seu manual de Applesoft BASIC
e examinar atentamente a lógica da linha 260.
3. Programe uma sub-rotina de explosão. Em Space Hunter, isto é
encontrado nas linhas 7200. a 7420. A linha 7200 começa dando
um GOSUB para a linha 6500, onde a nave alienígena é apagada
(como COLOR = 0). SK é incrementado para indicar que uma
nave alienígena foi destruída. Depois de toda terceira nave des­
truída, o indicador SF da nave é fixado em 0, para a nave-mãe
aparecer na próxima rodada do jogo. A linha 7220 dá um GOSUB
para 7520 que apaga os visores de laser de curto alcance da tela
(de baixa resolução), e a linha 7240 gera um efeito sonoro. A se­
qüência da explosão se inicia na linha 7260, que começa o ciclo
das quatro figuras da explosão. Cada figura é desenhada na
tela nas linhas 7280-7320, e apagada nas linhas 7340-7380. Logo
após cada figura ser desenhada ou apagada, um pequeno atraso:
(o ciclo DL) é executado e o alto-falante do Apple emite um cli­
que para os efeitos sonoros (veja a linha 7300 e 7360).
Se você acha que programar explosões é complicado e demorado,
você está certo. Mas a recompensa de aprender a técnica vale a pena.

MELHORIAS E MODIFICAÇÕES
Várias melhorias e modificações que você talvez queira tentar são:
1. Usar o Criador de Som para os efeitos sonoros. Não há nada de
errado com o som usado no jogo, mas você pode sentir que eles
podem ser melhorados.
2. Fazendo a sua própria seqüência de explosão. Você pode ser ôu
não capaz de melhorar a explosão corrente, mas você ganharia
prática de programação se você tentasse fazer a sua própria.
92 Jogos de Ação para o Apple

3. Fazer a dificuldade do programa aumentar mais devagar. Como


está, a dificuldade aumenta muito rápido conforme você é pro­
movido, e promoções tornam-se quase impossíveis depois que
você se torna Capitão. Isto é programado na linha 2020, na qual
o movimento da nave alienígena aumenta com RA, a variável da
sua graduação. Mude RA cada vez que aparecer na linha 2020
para (N * RA), onde N é algum valor como 0.5 (para tornar o jogo
um pouco mais fácil) ou 0.2 (para tornar o jogo muito mais fácil).
4. Incluir um escore. Agora, o seu único objetivo é subir de posto,
então você podería programar um sistema baseado em pontos
para quão rápida cada missão seja completada ou para o total
de alienígenas mortos em cada posto.
5. Adicionando minas espaciais. Esta melhoria seria um trabalho
mais difícil de se programar, requerendo alguma engenhosidade,
mas muito divertido e instrutivo. Você teria que colocar minas
espaciais aleatórias na tela de baixa resolução e obrigar a nave
estelar a se dirigir sem esbarrar nelas.
Uma melhoria que este jogo, não requer é maior velocidade. A nave
alienígena e a nave-mãe se movem tão rápido quanto você queira em um
jogo destes, e o tiro do laser é bem rápido. De fato, este é um bom
exemplo de projeto de jogo no qual a velocidade lenta do Applesoft
BASIC não é uma limitação.
Space Hunter 93
Listagem 10-1: SPACE.HUNTER

10 REM ***^^*******************
20 REM * SPACE.HUNTER *
30 REM * BY BRENT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
SO REM
90 REM

INTRODUÇÃO:

100 TEXT i HOME


120 VTAB 3: INVERSE : Aí = " SPACE HUNTER :
GOSUB 6000: NORMAL : VTAB 10: AÍ = "BY
BRENT ZIMMERMAN”: GOSUB 6000: VTAB 12:
AÍ = "COPYRIGHT (C) 1985": GOSUB 6000
140 VTAB 23: PRINT "TECLE <ESPAGO> -> ”;:
BET AÍ
160 DIM RAÍ(14),XE(7,4),YEC7,4)
180 DATA 2# TENENTE,!# TENENTE,CAPITAO,
MAJOR,CORONEL TN,CORONEL,GENERAL BG,GENERAL
MJ,GENERAL TN,GENERAL,GENERAL 5*,
MARECHAL ESPACIAL,COMANDANTE,IMPERADOR
200 XÍ = "BCCEEFFABCEFFGAACEGGHAADEGGH"
220 Yí = "DBEADCEEAGFADEBGHGCHFEIJHDÍG"
230 REM

LE CARGOS:

240 FOR I = 1 TO 14:sREAD RAÍ(I): NEXT I


250 REM

DADOS DA EXPLOSÃO:

260 FOR I = p TO 3: FOR J = 1 TO 7:XE(J,I


+ 1) = ASC ( MIDÍ (Yi,I * 7 + J,l>)
-- 49: NEXT J, I: FOR I ® O TO 3: FOR J
= 1 TO 7:YE(j,I + 1) = ASC ( MIDÍ (YÍ,
I * 7 + J,1D - 48: NEXT J, I
490 REM

ARRANJO:

500 SK 0:RA 1: CL 16336:PB = 16287


94 Jogos de Ação para o Apple

520 HOME : GR
540 GOSUB 7500
560 INVERSE : PRINT s HTAB 37s PRINT " ":
HTAB 37; PRINT " + : HTAB 37: PRINT
tl Fl «
580 HTAB 1: VTAB 22: NORMAL : PRINT "CARGO:
"RAt-(RA)
600 VTAB 24: HTAB 1: PRINT "ENERGIA: 1000Ô";
:EG = 10000
620 SF = 1
640 X = INT ( RND (1) * 120) - 40:Y = INT
( RND (1) * 120) - 40
990 REM

INIMIGO A LONGA DISTANCIA:

1000 IF X < 38 AND X > 1 AND Y < 38 AND Y >


1 THEN PRINT CHRT (8)" ";: GOTO 2000
1020 OH = H:OV = V: IF X < 2 THEN H = 0: GOTO
1080
1040 IF X > 37 THEN H = 2: GOTO 1080
1060 H = 1
1080 IF Y < 2 THEN V = 0: GOTO 1140
1100 IF Y > 37 THEN V = 2: GOTO 1140
1120 v -- 1
1140 EG = EG - 20: HTAB 10: VTAB 24: NORMAL
PRINT EG" IF EG < 1 THEN 15000
1160 INVERSE : HTAB 37 + OH: VTAB 22 + OVS
PRINT " HTAB 37 + H: VTAB 22 + V:
IF SF THEN PRINT GOTO 1200
1180 PRINT
1200 XM - ' INT ( RND (1) * 11) - 5:YM = INT
( RND (1) * 11) - 5
1220 IF PDL (0) > 191 THEN XM = XM - 3: GOTO
1260
1240 IF PDL (0) < 64 THEN XM = XM + 3
1260 IF PDL (1) >191 THEN YM = YM - 3: GOTO
1300
1280 IF FpL (1) < 64 THEN YM » YM + 3
1300 X = X + XM: IF X < - 40 THEN X = - 40:
GOTO 1340
1320 IF X > 80 THEN X = 80
1340 Y = Y + YM: IF Y < -40 THEN Y = - 40:
GOTO 1380
1360 IF Y > 80 THEN Y = 80
Space Hunter 95

1380 SOTO 1000


1990 REM

INIMIGO A CURTA DISTANCIA:

2000 IF SF = 1 THEN IF PEEK (PB) > 127 OR


PEEK (PB + 1) >127 THEN GOSUB 7000:
IF SCRN( 19,19) < >0 THEN GOSUB
7200: GOTO 640
2020 M = INT ( RND (1) * (RA * 2 + 1)) -• RA:
YM = INT ( RND (1) * (RA * 2 + 1) ) -
RA
2040 IF PDL (0) > 191 THEN XM == XM - 1: GOTO
2080
2060 IF PDL (0) < 64 THEN XM = XM + 1
2080 IF PDL (1) > 191 THEN YM == YM - 1: GOTO
2120
2100 IF PDL (1) < 64 THEN YM = YM + 1
2120 IF X + XM > 37 OR X + XM < 2 OR Y + YM
< 2 OR Y + YM > 37 THEN COLOR= 0: GOSUB
6500:X = X + XM: Y = Y + YM: GOTO 1020
2140 CDLDR= 0: GOSUB 6500:X = X + XM:Y = Y
+ YM: COLOR= 5: GOSUB 650Ó: IF SF THEN
2180
2160 IF X > 16 AND X < 22 AND Y > 16 AND Y
< 22 THEN 10000
2180 COLOR= 15: GOSUB 7520:EG = EG - 20: HTAB
10s VTAB 24: NORMAL : PRINT EG" ";: IF
EG < 1 THEN 15000
2200 GOTO 2000
5990 REM

SUB-RDTINAS:

6000 HTAB <41 - LEN (A$)) / 2: PRINT A$: RETURN

6490 REM

INIMIGO OU NAVE DE COMBUSTÍVEL:

6500 IF SF THEN PLOT X,Y: PLOT X + 1,Y + 1:


PLOT X + 1,Y: PLOT X,Y + 1; RETURN
6520 PLOT X,Y: PLOT X - 1,Y - 1: PLOT X + 1,
Y - Is PLOT X + 1,Y + 1: PLOT X - 1,Y
+ 1: RETURN
96 Jogos de Ação para o Apple

6990 REM

TIRD LASER:

7000 FOR I « 17 TO 1 STEP - 4: C0L0R= 12


7020 PLOT 19 + 1,19 + I: PLOT 19 + 1,19 - I:
PLOT 19 - 1,19 - I: PLOT 19 - 1,19 +
I
7040 Z = PEEK (CL) + PEEK (CL)
7060 COLOR= 0: PLOT 19 + 1,19 + Is PLOT 19
+ 1,19 - I: PLOT 19 - 1,19 - I: PLOT
19 - 1,19 + I
70S0 NEXT I
7100 EG = EG - 100: HTAB 9: VTAB 24: NORMAL
: PRINT EG" IF EG < 1 THEN 15000
7120 RETURN
7190 REM

EXPLOSÃO:

7200 COLOR= 0: GOSUB 6500:SK = SK + 1: IF SK


= 3 THEN SF = 0:SK = 0
7220 GOSUB 7520
7240 FOR TN = 1 TO 5: FOR DL = 1 TO TN: NEXT
DL:Z = PEEK (CL): NEXT TN
7260 FOR I = 1 TO 4
7280 COLDR= 5: FOR J = 1 TO 7: PLOT XE(J,I),
¥E(J,I)
7300 FOR DL = 5 TO I * 5: NEXT DL:Z = PEEK
(CL)
7320 NEXT J
7340 COLDR= 0: FOR T = 1 TO 7: PLOT XE(T,I),
YE(T, I)
7360 FOR DL = 5 TO I * 5: NEXT DL:Z = PEEK
(CL)
7380 NEXT T: NEXT I
7400 CDLOR= 15: GOSUB 7520
7420 RETURN
7490 REM

INICIALIZA TELA:

7500 COLOR- 15: HLIN 0,39 AT 0: HLIN 0,39 AT


39: VLIN 0,39 AT 39: VLIN 0,39 AT 0
7520 PLOT 17,17: PLOT 18,17: PLOT 17,18: PLOT
Space Hunter 97

21,17; PLOT 20,17: PLOT 21,18: PLOT 21,


21: PLOT 20,21: PLOT 21,20: PLOT 17,21:
PLOT 18,21: PLOT 17,20
7540 RETURN
9990 REM

ENCOSTOU NA NAVE DE COMBUSTÍVEL:

10000 COLOR= 15: GOSUB 7520: COLOR= 5: GOSUB


6500: FOR I = EG TO 10000 STEP 25: HTAB
10: VTAB 24: PRINT I;:Z = PEEK (CL):
NEXT I:EG = 10000: HTAB 10: VTAB 24: PRINT
EG
10020 TEXT : HOME : HTAB 12: VTAB 5: NORMAL
: PRINT "MISSAO CUMPRIDA"
10040 RA = RA + 1: IF RA > 14 THEN RA = 14
10060 VTAB 9; PRINT " VOCE FOI PROMOVIDO P/
0 CARGO DE": VTAB 12:At = RAt(RA):
INVERSE : GOSUB 6000
10080 FOR I = 1 TO 3000: NEXT I
10100 GOTO 520
14990 REM

ACABOU 0 COMBUSTÍVEL:

15000 PRINT CHRt (7) + CHRt (7): TEXT : HOME


: VTAB 10: At = "VOCE ESTA MORTD!!": GOSUB
6000
15020 VTAB 13:At = "SEU CARGO FINAL E " + RÃt(RA):
GOSUB 6000: VTAB 20: PRINT " JOGAR DE NOVO
(S/N) /
15040 GET At
15060 IF At = "S" THEN 500
15080 IF At = "N" THEN END
15100 GOTO 15040
CAPÍTULO 11
GUIA PARA GRÁFICOS DE
ALTA RESOLUÇÃO
Guia para Gráficos de Alta Resolução 99

Todos os jogos tratados nos capítulos anteriores foram feitos em grá­


ficos de baixa resolu.ção. O próximo grande passo na criação de jogos
de computadores é o uso dos gráficos de álta resolução.
A vantagem dos gráficos de alta resolução é que se podem desenhar
figuras tais como: espaçonaves, canhões, monstros, e muitas outras na
tela do computador. Esta força adicional dos gráficos, todavia, tem seu
preço: gráficos de alta resolução são mais lentos que os de baixa e re­
querem mais comandos. Será necessário tanto desenhar as figuras de
alta resolução, como elaborar os programas dos jogos de alta resolução
com o Cuidado de adaptá-los à falta de velocidade e complexidade dos
comandos.
Todos os comandos gráficos do Applesoft são encontrados no seu
manual de Applesoft BASIC que veio com seu computador. Você talvez
queira revisar os capítulos de gráficos de alta resolução. Os preceitos
que se seguem ensinarão como usàr todos os comandos gráficos de alta
resolução do Applesoft. Como complementação, este capítulo abrangerá
alguns truques gráficos que você quererá usar.

PRECEITOS PARA GRÁFICOS DE ALTA RESOLUÇÃO

Introduza o disco Jogos de Ação no drive 1 e ligue seu compu­


tador. Tecle <ESC> para sair do programa STARTUP e entrar no BASIC.
Para entrar no modo gráficos de alta resolução, digite “HGR” (que
significa High-resolution GRaphics) e tecle <RETURN>. O sinal de pronto
dó BASIC (!) e o cursor talvez nãõ estejam visíveis neste momento, ehtão
tecle <RETURN> várias vezes até que apareçam na base da tela.
.0 comando HGR executa várias funções: ele muda o display da tela
do computador de tudo texto (ou de qualquer outro modo) para o modo
gráficos dê alta resolução; ele ajusta a tela de gráficos de alta resolução
para a página 1 ou tela 1 (há também uma tela 2 de alta .resolução); ele
limpa a tela gráfica; e ajusta o display de texto para misto gráficos/texto,
assim chamado pois há quatro linhas de texto na base da tela. Ò seu
cursor deveria estar aí agora. Ao contrário do comando GR de gráficos
de baixa resolução, HGR não posiciona o cursor automaticamente na
janeía de' texto, e não ajusta a cor gráfica.
Em gráficos de alta resolução, só seis cores estão disponíveis: preto,
verde,, violeta, branco, vermelho (na realidade alaranjado ou .coral) e azul.
Mas existem dois brancos diferentes (branco 1 e branco 2), e dois pretos
diferentes (preto 1 e preto 2). Agora digite “HC0L0R=3” para ajustar a
cor para branco 1. O Quadro 11.1 dá as cores de alta resolução do Apple
e seus respectivos números.
100 Jogos de Ação para õ Apple

QUADRO 11.1
CORES DE ALTA RESOLUÇÃO DO APPLE E SEUS
RESPECTIVOS NÚMEROS
0= preto 1 4 = preto 2
1 - verde 5 = vermelho
2= violeta 6 - azul
3= branco 1 7 = branco 2

Agora você está pronto para desenhar pontos e linhas na tela gráfica.
Digite “HPLOT 5,15” para desenhar um ponto. Isto acende o pixel das
coordenadas X = 5eY = 15. O limite de X é de 0 a 279, e no modo misto
gráficos/texto, o limite de Y é de 0 a 159. Por exemplo, “HPLOT 0,0:
HPLOT 279,0: HPLOT 279,159: HPLOT 0,159” desenha um ponto efn cada
canto da tela de alta resolução.
Você pode usar também o comando HPLOT para desenhar uma linha
na tela de alta resolução. Por exemplo “HPLOT 0,0 TO 279,159” desenha
uma diagonal pela tela. Digite “HPLOT 50,50 TO 80,50 TO 80,80 TO 50,80
TO 50,50” para desenhar uma caixa.
Agora, digite “HPLOT TO 20,20”. Isto demonstra o conceito de um
cursor interno de gráficos. Este é similar ao cursor de texto no qual ele
avisa a você onde a próxima saída será colocada na tela. O cursor de
gráficos, todavia, é interno; ele nunca é visto pelo usuário. Este cursor
está sempre localizado nas coordenadas X,Y do último ponto desenhado
na tela de alta resolução. O comando HPLOT TO X,Y desenha uma linha
a partir da posição do cursor interno até as novas coordenadaé X,Y.
Combinando diversos comandos HPLOT, você pode desenhar cenas
e figuras na tela de alta resolução. Este método pode ser suficiente para
desenhar imagens estáticas, mas é muito lento e incômodo para animação
de jogos de ação. Por isso mesmo usaremos outro método envolvendo os
comandos DRAW è XDRAW (definidos abaixo e descritos em detalhes no
próximo capítulo) para desenhar espaçonaves, alienígenas, balas e outras
figuras de jogos de ação.
Além da tela 1 de alta resolução, que estivemos usando, o Apple tem
também uma tela 2 de alta resolução. O comando “HGR2” limpa e inicia­
liza a tela 2. Embora parecido com o comando HGR, o comando HGR2
sempre coloca o Apple em modo só gráficos, como o modo misto gráfi­
cos/texto não está disponível na tela 2. O limite de Y para comandos
HPLOT é de 0 a 192 (ao invés de 0 a 159 como no modo misto gráficos/
texto) e não há janela de texto na base da tela. O limite de X é o mesmo,
tanto no modo só gráficos como no misto gráficos/texto. Os comandos de
gráficos de alta resolução HPLOT e HCOLOR executam na tela 2 do mes­
mo modo que na tela 1.
Antes de tratar dos comandos de gráficos dé alta resolução envolvi­
dos no desenho de figuras, precisamos discutir PEEKs, POKEs, e CALLs.
Guia para Gráfjcos de Alta Resolução 101

PEEKS, POKES e CALLs

Todos os dados e. códigos de programa necessários para rodar o


seu programa Applesoft BASIC, estão contidos na memória do seu compu­
tador Apple. Dados tais como posição do cursor de texto, tamanho da
janela de texto, o endereço inicial e o final do seu programa BASIC, e
,a tela corrente de gráficos de alta resolução estão todos em algum lugar
da memória do computador. Similarmente, todas as rotinas de linguagem
de máquina que fazem tais tarefas, como limpar a tela de texto, soar o
alto-falante do Apple e interpretar os programas Applesoft, devem estar
também situadas em algum lugar da memória. Estas rotinas são perma­
nentemente armazenadas na ROM (read only memory = memória apenas
de leitura), localizadas na memória no enderçço SC000 a SFFFF (deci­
mal 41952 a 65535); veja o mapa no Apêndice C.
Normalmente, programadores BASIC não precisam se preocupar com
as posições de memória destas posições de dados e rotinas ROM. Mas
muitas operações no Apple não podem ser controladas com um comando
simples de BASIC Applesoft. Deste modo, o programador deve usar
PEEKS, POKES e CALLs para acessar diretamente a memória do Apple.
O comando PEEK é usado para espiar a memória do Apple para
encontrar o valor corrente em uma posição da memória. Para ver como
isso funciona, certifique-se de que você está em BASIC. (Se necessário,
carregue seu disco Jogos de Ação, então tecle <ESC> para entrar em
BASIC.) Agora digite “PRINT PEEK(34)” e o computador responderá mos­
trando um 0. A posição de memória 34 contém o valor da linha superior
da janela de texto. Se a janela de texto estiver no topo da tela, o valor
armazenado na posição 34 da memória será 0.
O comando POKE é usado para inserir um novo valor na memória
do Apple. Digite "POKE 34,20” por exemplo. Isto coloca o valor 20 na
posição 34 da memória, substituindo o 0 que lá estava. Agora digite
“LIST” para listar seu programa STARTUP que ainda deveria estar na
memória. Como você pode ver, uma vez que a listagem do prqgrama
atinja abaixo da linha 20, o resto da listagem se move só nas quatro
últimas linhas da tela.de texto (linhas 20, 21, 22 e 23). Qualquer operação
com texto agora manterá o cursor nesta pequena janela de texto.
Você não deveria usar o comando POKE indiscriminadamente por­
que inserir um número errado no endereço errado poderia fazê-lo perder
seu programa Applesoft ou mesmo danificar os dados do seu disquete
no drive.
O comando CALL é usado para chamar uma rotina de linguagem de
máquina que se encontra na memória. Chamar (CALL) uma rotina implica
em executá-la. A rotina chamada (CALL) pode ser uma que tenha sido
carregada do disco para a RAM (random-access memory = memória de
acesso aleatório) ou uma que seja encontrada na ROM (read-only me­
mory — memória apenas de leitura). Para ver como isto funciona, pri­
meiro digite “TEXT” para ajustar a janela de texto para toda a tela (em
outras palavras, o comando TEXT reajusta o endereço 34 da memória
102 Jogos de Ação para o Apple

para 0). Agora digite “LIST” só para encher a tela com texto, e então
“CALL 64600”. Você acabou de chamar a rotina de linguagem de máqui­
na da ROM usada para limpar a tela de texto.
O endereço 64600, que é o início da rotina HOME, pode também ser
expresso como um número negativo. Para determinar o equivalente nega­
tivo de qualquer endereço, você simplesmente subtrai 65536 (que é equi­
valente ao número hexadecimal SFFFF + 1). Assim, 64600 = -936. Então
quando digitar “CALL -936” vòcê terá o mesmo efeito que quando digitar
“CALL 64600”.

PEEKS, POKES e CALLS Gráficos do Apple

A maioria dos PEEKS, POKEs e CALLS usados com os gráficos do


Apple estão relacionados abaixo. Outros serão explicados no capítulo
sobre tabelas de figuras do Apple.
Há um conjunto de oito POKEs Applesoft chamados chaves gráficas.
Nós os explicaremos em detalhes aqui, para ajudá-lo a compreendê-los e
aplicá-los em seus próprios programas.

POKE -16304,0 Ajusta um modo gráficos (de alta ou baixa resolução,


dependendo da posição das outras chaves). Quando
você primeiro carrega um disco com o Apple II +,
o computador está no rnodo texto Applesoft BASIC.
Você pode ver e digitar texto na tela de 40 colunas
(ou 80 colunas).do vídeo. Você pode entrar um modo
gráfico com o comando, GR, HGR, ou HGR2, mas estes
comandos também apagam a tela gráfica. POKE
—16304,0 muda para o modo gráfico sem apagar a
tela. Se você executar o comando HGR, por exemplo,
e mais tarde o comando TEXT, você pode voltar aos
gráficos de alta resolução com este POKE. Todavia,
se você não executou um GR, HGR, ou HGR2 previa­
mente, você talvez não consiga o modo gráfico dese­
jado só com um POKE -16304,0.

POKE -16297,0 Especifica gráficos de alta resolução (ao contrário dos


gráficos de baixa resolução, que são especificados por
POKE -16298,0). POKE -16297,0 muda a página de
gráficos de baixa resolução (se for este o modo cor­
rente) para alta resolução. Se você estiver corrente­
mente no modo texto, este PÓKE não terá efeito no
display.

POKE -16300,0 Especifica a página 1 de display (tela 1 de texto ou


gráficos). Quando você POKE —16300,0, o computador
muda da página 2 para a página 1. Se você já estiver
vendo a página 1, nada mlida.
Guia para Gráficos de Alta Resolução 103

POKE -16301,0 Especifica modo misto gráficos/texto. Este comando


assegura que, num modo gráfico, a tela esteja no modo
misto gráficos/texto ao invés de tela só gráfica. (A
chave companheira, POKE —16302,0 ajusta o modo
gráfico para tela só gráfica, sem texto.)
Os quatro comandos acima são freqüentementé usados em conjunto
num programa Applesoft para mudar do modo texto para gráficos de alta
resolução, com texto na base da tela 1 de gráficos.
POKE —16303,0 Seleciona o modo só texto. Se o computador estiver
num modo gráfico, este comando mudará o compu­
tador para modo texto, é parecido com o comando Ap­
plesoft TEXT, exceto que POKE —16303,0 não muda
outros ajustes da tela. [TEXT reajusta a janela de tex­
to para os valores defaults, muda de gráficos para
texto, e posiciona o cursor na base da tela.]
POKE -16302,0 Seleciona tela só de gráficos. Quando você usa este
comando em conjunto com POKE -16304,0 (veja aci­
ma), a tela do monitor inteira é ajustada para gráficos,
sem texto. Compare este com POKE -16301,0 expli­
cado acima.
POKE -16299,0 Ajusta o modo da tela para página 2 (tela 2). Este co­
mando, usado em conjunto com POKE —16304,0, ajus­
ta o modo da tela para página 2 de alta resolução.
Certifique-se de que você esteja no modo gráficos de
alta resolução quando fizer isto. Caso contrário você
verá baboseiras na tela, como a página 2 de texto é
geralmente inacessível.
POKE -16298,0 Este POKE ajusta o modo gráfico para baixa resolu­
ção. Quando você usa este comando junto com PO­
KE -16304,0 (veja acima), o computador é ajustado
para gráficos de baixa resolução. (Compare este com
POKE -16297,0 explicado acima, para ajustar gráficos
de alta resolução.) O POKE não terá efeito algum se
você estiver no modo texto ou gráficos de baixa reso­
lução. Se você estiver em gráficos de alta resolução,
ele fará a tela mudar para gráficos de baixa resolução.

Desenhando ou Apagando uma Tela de Alta Resolução


sem Mostrá-la
Às vezes é bom apagar uma tela de alta resolução enquanto você
está vendo uma tela de texto ou vendo a outra tela de alta resolução. Às
vezes é bom ser capaz de desenhar (HPLOT ou DRAW) numa tela de alta
resolução enquanto se vê a outra (como por exemplo, quando você quer
animação). Os próximos POKEs e CALL permitem-lhe fazer estas coisas:
104 Jogos de Ação para o Apple

POKE 230,32 Especifica que HPLOT, DRAW e outros comandos de


alta resolução serão executados para a tela (ou pági­
na) 1, independente de que tela esteja sendo exibida.
POKE 230,64 Especifica que HPLOT, DRAW e outros comandos de
alta resolução serão executados para a tela (ou pági­
na) 2, independente de que tela esteja sendo exibida.
Nota: Decimal 32 — (hex) S20, que é o início da página da
memória da tela 1 de alta resolução. Decimal 64 =
(hex) $40, que é o início-da.página da memória da
tela 2 de alta resolução. Em outras palavras, a tela 1
de alta resolução começa na posição $2000 (decimal
8192) da memória e a tela 2 de alta resolução começa
no $4000 (decimal 16384); veja o Mapa da Memória do
Apple no Apêndice C.

CALL 62450 Limpa a tela de alta resolução especificada no POKE


230, independente de que tela esteja sendo exibida.

Usando a Janela de Texto com Gráficos de Alta Resolução

Õ comando HGR não reajusta automaticamente a janela de texto (ao


passo que GR sim). Isto é bom porque você pode querer mover entre as
telas de texto e de gráficos de alta resolução, sem danificar o texto e a
tela gráfica. Mas frequentemente você deseja abrir uma janela de texto
embaixo da tela de alta resolução quando você está no modo misto grá-
ficos/texto. Para fazê-lo, você precisa usar um POKE adicional:

POKE 34,20 Ajusta o topo da janela de texto imediatamente abaixo


da tela de alta resolução.

Depois de executar POKE 34,20, um comando HOME apagará somen­


te as quatro últimas linhas de texto e automaticamente posicionará o
cursor no canto superior esquerdo da nova janela de texto.
O programa seguinte mostra como apagar e desenhar (HPLOT) na
tela 2 de alta resolução enquanto você vê a tela 1 de alta resolução:

100 HGR: HCOLOR = 3 : REM APAGA E AJUSTA A TELA 1 DE ALTA


RES. ENTÃO AJUSTA A COR PARA BRANCO
110 POKE -16302,0 : REM MUDA PÂRA TELA SÓ DE GRÁFICOS
120 HPLOT 0,0 TO 279,0 TO 279,191 TO 0,191 TO 0,0 : REM DESE­
NHA UMA BORDA AO REDOR DE TODA A TELA
130 POKE 230,64 : CALL 62450 : REM APAGA TELA 2 DE ALTA RES.
ENQUANTO AINDA VENDO TELA 1 DE ALTA RES.
140 HPLOT 0,0 TO 279,191 : REM DESENHA UMA DIAGONAL DO
CANTO SUPERIOR ESQUERDO DA TELA 2 DE ALTA RES. AO
CANTO DIREITO INFERIOR SEM MOSTRAR A TELA 2
Guia para Gráficos de Alta Resolução 105

150 FOR I = 1 TO 2000 : NEXT I : REM ATRASO PARA VER TELA 1


160 POKE -16299,0 : REM MUDA PARA TELA 2
170 FOR I = 1 TO 2000 : NEXT I : REM ATRASO PARA VER TELA 2
180 POKE 34,20 : HOME : REM AJUSTA O TOPO DA JANELA DE
TEXTO ABAIXO DA TELA DE ALTA RES., APAGA A JANELA DE
TEXTO, COLOCA ALI O CURSOR
190 POKE -16300,0 : REM VOLTA A TELA 1
200 PRINT “TECLE ALGO PÀRA PARAR: ”;:GET AS
220 TEXT : REM VOLTA AO MODO TEXTO, REAJUSTA JANELA DE
TEXTO PARA TODA A TELA

SUMÁRIO DE COMANDOS APPLESOFT PARA GRÁFICOS


DE ALTA RESOLUÇÃO

Existem oito comandos BASIC Applesoft- (além dos PEEKS, POKEs e


CALLs) que são usados com gráficos de alta resolução. Estes estão resu­
midos no Quadro 11.2. Discutimos os quatro primeiros comandos anterior­
mente neste capítulo. Discutiremos os quatro últimos no próximo capítulo.

QUADRO 11.2
SUMÁRIO DE COMANDOS GRÁFICOS DE ALTA
RESOLUÇÃO

SINTAXE DO COMANDO FUNÇÃO

HGR Ajusta o modo gráficos de alta resolução;


apaga e inicializa a tela 1 de gráficos; ajusta
o modo misto gráficos/texto com quatro li­
nhas de texto na base da tela.
HGR2 Ajusta o modo gráficos de alta resolução;
apaga e inicializa a tela 2 de gráficos; ajusta
o modo só gráficos (sem janela de texto).
HCOLOR = expra Seleciona cor de alta resolução. Ajusta a cor
para o valor da expressão Applesoft (expra)
de acordo com o Quadro 11.1. A expra deve
estar compreendida entre 0 e 7.
HPLOT TO expral, expra2 Desenha um ponto (acende um pixel) nas co­
TO expral, expra2 ordenadas expral, expra2 ou, se “TO” estiver
incluso no comando, desenha uma linha do
cursor interno de gráficos (localizado na últi­
ma posição desenhada com HPLOT, DRAW
ou XDRAW). Os termos adicionais “TO ex­
pral, expra2” podem ser incluídos. O limite
106 Jogos de Ação para o Apple

QUADRO 11.2 (continuação)


SUMÁRIO DE COMANDOS GRÁFICOS DE ALTA
RESOLUÇÃO
SINTAXE DO COMANDO FUNÇÃO
correto para expral é‘ de 0 a 279, e para ex-
pra2 é de 0 a 191. Só pontos derrtro do limite
de expra de 0 a 159 aparecerão na tela no
modo misto gráficos/texto.
DRAW expra AT Desenha uma figura cujo número é igual ao
expral, expra2 valor expra, nas coordenadas dadas por ex­
pral ,expra2 (onde estas duas últimas ex­
pressões são as mesmas que para HPLOT).
A figura deve ser parte de uma tabela de
figuras que tenha sido carregada (BLOAD)
ou inclusa (POKE) na memória pelo usuário.
0 endereço da tabela de figuras deve ser in­
cluído nas posições de memória $E8 (232) e
$E9 (233), na forma de byte menos significa­
tivo, byte mais significativo. (Veja o próximo
capítulo para uma explicação completa.)
XDRAW expra AT 0 mesmo que o comando DRAW exceto que
expral, expra2 a figura é “apagada” na tela. Assim, onde o
mesmo é desenhado (XDRAW), os pixels da
tela que estão acesos são apagados, e vice-
versa. Assim, numa tela preta, um comando
XDRAW é idêntico a um comando DRAW.
Num fundo branco todavia, uma figura bran­
ca desenhada com DRAW não aparecerá,
mas uma figura branca desenhada com
XDRAW aparecerá preta.
ROT = expra Causa uma rotação nas figuras desenhadas
com DRAW ou XDRAW na tela de alta reso­
lução. 0 limite correto para expra é de 0 a
255, mas as únicas rotações para SCALE = 1
são as expras iguais a 0, 8, 16, 24, 32, 40, 48
e 56. Outros valores de expra produzem uma
destas rotações, a menos que SCALE seja
aumentado (veja abaixo)., Uma rotação com­
pleta é expra = 64; meia rotação (180°) é 32;
e um quarto de rotação (90°) é 16, etc. Assim
uma rotação de 64 é o mesmo que uma rota-
r ção de 0.
SCALE = expra Ajusta o tamanho da figura. O limite correto
de expra é de 1 a 255. Qualquer valor maior
que 1 expande o tamanho dos vetores na
figura.
Guia para Gráficos de Alta Resolução 107

CONTADOR DE COLISÃO DE ALTA RESOLUÇÃO

Usamos extensamente o comando SCRN nos nossos jogos de baixa


resolução para verificar as colisões entre naves estelares e alienígenas,
ou entre bombas e espaçonaves. Intelizmente, tal comando não existe em
gráficos de alta resolução. Ao invés disso, usamos o contador d^ colisão
localizado no endereço 234 da memória.
A posição de memória 23.4 do contador de colisão contém o valor do
número de pixels (pontos) cobertos por um comando DRAW, ou. o número
de pixels acesos durante um XDRAW. Por exemplo, considere que você
saiba que certa figura, como sua espaçonave, contenha quarenta pixels
(ou seja, 40 pixels são acesos quando a figura é desenhada (DRAW) nu­
ma tela vazia). Seu programa pode verificar se a espaçonave colide com
alguma outra figura, tal como uma mina espacial alienígena, espiando
(PEEK) a posição 234 imediatamente após você desenhar (DRAW ou
XDRAW) a espaçonave na tela de alta resolução. Se você desenha (DRAW)
a figura na tela, seu programa teria uma linha como “2120 IF PEEK (234)
> 0 THEN 2000”. O controle do programa passaria para a linha 2Ò00 se
qualquer parte da espaçonave colidisse com qualquer coisa na tela. Se
você desenha (XDRAW) a figura na tela (esta é a melhor maneira de se
desenhar figuras animadas na tela de alta resolução), então seu programa
teria a linha “2120 IF PEEK (234) < 40 THEN 2000”. Uma colisão da espa-
çonave^com alguma outra figura durante um comando XDRAW eliminaria
parte da outra figura. Por isso o número de pontos da espaçonave dese­
nhados (XDRAW) seria menor que 40.

ORGANIZAÇÃO DE PROGRAMAS COM GRÁFICOS


DE ALTA RESOLUÇÃO

No Capítulo 2, apresentamos um modelo completo para a organiza­


ção de jogos escritos em gráficos de baixa resolução (veja o Quadro 2.1).
Não apresentaremos um modelo separado para gráficos de alta resolução
pois os principais aspectos da organização são os mesmos. Você será
capaz de perceber as diferenças comparando as listagens dos programas
Wipeout (o jogo de baixa resolução dado no Capítulo 5) e HR Wipeout
(o jogo análogo em alta resolução dado no Capítulo 13).
CAPÍTULO 12
EDITOR DE TABELA DE
FIGURAS
Editor de Tabela de Figuras 109

Este capítulo é um guia para o uso de tabelas de figuras Applesoft


e do Editor de tabela de Figuras, um programa utilitário para a criação e
edição de tabetas de figuras Applesoft. O capítulo explicará as capacida­
des (e limitações) do Editor de Tabela de Figuras e dará uma referência
para os diversos comandos.

TABELA DE FIGURAS
O que é uma TABELA DE FIGURAS?

Uma tabela de figuras é uma lista (ou tabela) de dados que .definem
uma ou mais figuras a serem usadas em gráficos de alta resolução. O
Applesoft BASIC possui quatro comandos que manipulam uma tabela de
figuras: DRAW, XDRAW, ROT, SCALE. Assim, se você quiser desenhar
uma figura predefinida na tela de alta resolução, você usa a sintaxe
“DRAW N AT X,Y”, onde N é o número da figura na tabela de figuras, e
X,Y, definem as coordenadas na tela de alta resolução. Por exemplo, se
você tiver uma tabela de figuras com cinco figuras, e quiser desenhar a
figura# 4 na tela na posição X,Y = 120,55, você usa o comando “100
DRAW 4 AT 120,55”. O Applesoft usa então os dados da tabela de figuras
para desenhar a figura na tela de alta resolução.

A questão é: Como você faz a tabela de figuras?


A resposta é: EDITOR DE TABELA DE FIGURAS!

Lógico, você realmente não precisa do Editor de Tabela de Figuras


para fazer uma tabela de figuras, pois os dados necessários podem ser
gerados manualmente usando o método descrito no seu Manual de Ap­
plesoft BASIC. Mas este último método é tedioso e fácil de se errar.

O que é um Editor de Tabela de Figuras?

O Editor de Tabela de Figuras é um programa utilitário que elimina o


trabalho enfadonho é a possibilidade de erro na elaboração de tabelas de
figuras. Com o Editor de Tabela de Figuras, você pode fazer o seguinte:
1. Desenhar figuras usando o teclado e/ou os controladores ma­
nuais. Estas figuras eventualmente serão usadas nos seus pró­
prios programas Applesoft de jogos.
2. Editar uma figura desenhando ou apagando pontos e linhas com
simples comandos de uma só tecla.
3. Criar e editar sua figura na tela de baixa resolução, para melhor
visualização. Mostra a nova figura na tela de alta resolução co­
mo ela aparecerá quando usada no seu programa.
4. Gravar ou carregar tabelas de figuras para o disco e do disco
com simples comandos de .menu.
110 Jogos de Ação para o Apple

5. Inserir uma nova figura numa tabela de figuras já existente.


6. Juntar duas figuras em uma.
7. Apagar figuras de uma tabela de figuras já existentes.
8. Rearranjar a ordem das figuras numa tabela de figuras.
9. Mostrar a figura em todas ac cores Applesoft enquanto Vai sen­
do criada ou editada.
10. Girar a figura na tela de alta resolução_enquanto vai sendo cria­
da ou editada.

Quais são os Usos do Editor de Tabela de Figuras?


Se você usar gráficos de alta resolução em qualquer um de seus
programas Applesoft, você pode beneficiar-se da força do Editor de Ta­
bela de Figuras. Alguns exemplos de aplicações de tabelas de figuras
incluem:
1. Texto na tela de alta resolução: Com o Editor de Tabela de Figu­
ras, você pode definir suas próprias fontes de alta resolução
(conjuntos de caracteres) para escrever texto na tela de alta
resolução. Você pode usar tabelas de figuras Applesoft para as
fontes padrão de ASCII, assim como para fontes especiais, como
Inglês Antigo, Romano, Grego, e letras inversas. O Apêndice D
explica como colocar texto na tela de alta resolução.
2. Símbolos: Você pode usar quadrados, círculos, triângulos, estre­
las, e muitos outros símbolos criados pelo Editor de Tabela de
Figuras para fazer gráficos e desenhos^ Você pode definir e usar
símbolos matemáticos ou químicos, tais como sinal de dividir,
sinal de integração ou uma estrutura química. Você pode fazer
símbolos musicais, tais como pautas, notas e pausas. Você pode
criar partes do corpo, municípios de um estado e partes de equi­
pamento.
3. Figuras: À medida que você escreve jogos de ação, você pode
usar o Editor de Tabela de Figuras para criar espaçonaves, alie­
nígenas, foguetes, balas, minas espaciais e outras figuras. Se vo­
cê escrever um jogo de aventura, você pode usar o Editor de Ta­
bela de Figuras para criar guerreiros, armas, monstros e animais.
Se você escrever outros tipos de jogos, você pode usar o Editor
de Tabela de Figuras para criar cartas, dados, sinais, peças e
outras figuras

DIGITANDO E GRAVANDO O EDITOR DE TABELA


DE FIGURAS

O Editor de Tabela de Figuras consiste do programa Applesoft, Ta-


bela.Figuras.Ed. (Listagem 12.1) e três programas em linguagem de má­
quina, Amper Ase (Listagem 12.2), LR Vector Draw (Listagem 12.3) e
Shape Comp (Listagem 12.4). Será necessário muito tempo e paciência
Editor de Tabela de Figuras 111

para digitar todos estes programas no seu computador, mas a recom­


pensa pelo esforço será valiosa.
Digite o programa Applesoft BASIC Tabela.Figuras.Ed (Listagem
12.1) no seu computador e grave-o no seu disco Jogos de Ação com o
comando “SAVE TABELA.FIGURAS.ED”.
O programa de linguagem assembly Amper Ase é dado na Listagem
12.2. Se você tiver dúvidas sobre como entrar programas de linguagem
assembly ou arquivos binários, reveja o Capítulo 7 e consulte o Apêndice
B. Se você tem um editor assembler, use-o para economizar tempo e
evitar frustração. Se você entrar o código binário através do monitor,
grave o programa para seu disco Jogos de Ação com o comando “BSAVE
AMPER.ASE.A7168.L654 ”.
As Listagens 12.3 e 12.4 dão os outros dois programas de linguagem
assembly, LR Vector Draw e Shape Comp. Entre estes programas no seu
computador ou através do monitor (veja Apêndice B) ou com um editor/
assembler. Para gravar os arquivos binários, use .os comandos “BSAVE
LR.VECTQR.DRAW,A7936,L203 ” e “BSAVE SHAPE.COMP,A2048,L470”.

PRECEITOS PARA O EDITOR DE TABELA DE FIGURAS

O objetivo desta seção é iniciá-lo no Editor de Tabela de Figuras.


Não deve ser tomado como um guia completo para os comandos do pro­
grama (estes serão todos explicados em detalhes mais tarde).
1. Insira o disco Jogos de Ação no drive 1 e ligue seu computador.
Se já estiver ligado, digite “PR4^6” ou “RUN STARTUP”.
2. Quando o menu do STARTUP aparecer, selecione o programa
TABELA.FIGURAS.ED.
3. Espere para que todos os arquivos sejam carregados no com­
putador. Embora a maioria do Editor de Tabela de Figuras este­
ja escrita em Applesoft, a maioria do trabalho no programa é
feita por um conjunto de três programas em linguagem de má­
quina. Estes estão carregados na memória do computador
agora.
4. Após tudo estar carregado (só leva alguns segundos) o Editor
de Tabela de Figuras mostra a tela de baixa resolução. Um
cursor retangular aparece no canto superior esquerdo da tela
e instruções aparecem na base da tela. Você está no modo
“EDITAR FIGURA” (ou equivalente, o modo “CRIAR FIGURA”).
Este modo é usado para criar novas figuras ou editar as velhas.
A figura que você está trabalhando chama-se figura de edição.
5. As quatro linhas de texto na base da tela são chamadas de
janela de texto e são um guia para o uso do Editor de Tabela
de Figuras. A janela de texto não contém todos os comandos,
mas ela mostra a maioria dos principais comandos usados na
criação e edição de uma figura.
112 Jogos de Ação para o Apple

6. Agora tente criar uma figura. Para mover o cursor de edição


na tela, use as teclas U, I, O, J, L, M, a vírgula e o ponto; estes
estão listados no canto inferior esquerdo da janela de texto.
Pressione algumas das teclas de movimento do cursor, só para
se acostumar ao método de mover o cursor na tela. Por exem­
plo, pressionando <L> move-se o cursor para a direita. Pres­
sionando a tecla <,> move-se o cursor para baixo. Como o
programa está correntemente no modo “DOT ÓFF” (a menos
que você tenha pressionado <D> ou <T>), o cursor não
desenha nada na tela enquanto se move. Agora tecle <D>. A
janela de texto indica modo “DOT ON” no canto superior direi­
to da janela de texto. A seguir pressione diversas teclas de mo­
vimento do cursor sucessivamente. Se você tiver seguido as
instruções corretamente, deverá estar desenhando pontos de
baixa resolução na tela.
7. Use o cursor para desenhar qualquer tipo de figura que você
quiser. Teclando <D> você pode ligar ou desligar o desenho
dos pontos à medida que o cursor se move.
8. A figura que você está desenhando está em gráficos de baixa
resolução, mas você está criando uma tabela de figuras de alta
resolução. Para ver como sua forma se parece em gráficos de
alta resolução, tecle <H>. Dez diferentes vistas da figura que
está criando aparecem. As figuras são desenhadas (DRAW), da
esquerda para a direita, em branco (HCOLOR = 3), verde (HCO-
LOR = 1), violeta (HCOLOR = 2), alaranjado (HCOLOR = 5) e
azul (HCOLOR = 6). Cada uma destas cinco cores é desenhada
num valor par e ímpar de X (a posição horizontal de alta reso­
lução). As figuras podem parecer muito diferentes de uma cor
para a outra por causa da maneira em que o Applesoft gera
cor. Você geralmente quererá desenhar (DRAW) figuras de um
HCOLOR (0, 2, 4 e 6) par num valor par de X e desenhar
(DRAW) formas de um HCOLOR (1, 3, 5 e 7) ímpar num valor
ímpar de X. A razão é que valores pares de X não são desenha­
dos com HCOLOR ajustado para um valor ímpar e vice-versa.
9. O Applesoft permite a você girar vetores de figuras. Para tanto,
você precisa ajustar ROT para um valor: ROT = 0 significa ne­
nhuma rotação; ROT = 16 é uma rotação no sentido horário de
90°; ROT = 32 é uma rotação de 180° (desenhando a figura de
cabeça para baixo); ROT = 48 é uma rotação no sentido horá­
rio de 270° (ou anti-horário de 90°); e ROT = 64 é o mesmo que
ROT = 0. Valores intermediários de ROT causam rotações inter­
mediárias. Todavia, considerável distorção da figura resulta de
rotações que não são múltiplos de 16. Para ver como uma figura
girada se parece, pressione as teclas de setas, como indicado
na base da tela. Para voltar ao modo “EDITAR FIGURA”, pres­
sione a barra de espaço.
Editor de Tabela de Figuras 113

10. Depois de criar uma forma, você deve pô-la num arquivo de
tabela de figuras se você quiser gravá-la no disco com outras
figuras em uma tabela de figuras. Para fazê-lo, tecle <F> para
o modo “ARQUIVAR”. Quando você tecla <F> pela primeira
vez, você será avisado que “NÃO HÁ ARQUIVO NA MEMÓRIA”.
Isto é para informá-lo de que a única operação que você será
capaz de fazer no modo “ARQUIVAR” é adicionar uma figura
ao arquivo. Tecle a barra de espaço e você estará no modo
“ARQUIVAR”.
11. Você deverá agora estar olhando para a tela de alta resolução.
Como não há figura no arquivo, você vê uma tela vazia exceto
pelos comandos do modo “ARQUIVAR” ná base da tela na ja­
nela de texto. Não se preocupe agora com todos os comandos.
Simplesmente tecle <A> para adicionar sua figura de edição
ao arquivo de tabela de figuras. Você será perguntado se quer
inserir ou anexar a figura. Tecle <A> para anexar, embora
pressionando <l> para inserir resultasse a mesma coisa por­
que você não tem nenhuma figura presentemente em arquivo.
Quando você tecla <A> (ou <l>) você verá a figura aparecer
na tela de alta resolução. Agora a janela de texto diz a você
que o número de figuras é um e que a figura que você está
vendo no momento é a figurant 1- Discutiremos os outros co­
mandos “ARQUIVAR” mais tarde. Agora, tecle a barra de espa­
ço para retornar ao modo “EDITAR FIGURA”.
12. Sua figura de edição ainda está intacta na tela de baixa resolu­
ção. Se você quiser, você pode editar mais uma figura. Se você
quiser criar diversas figuras que sejam parecidas, você não tem
que desenhar cada uma separadamente. Prepare-se para criar
uma segunda nova figura depois de teclar <C> para apagar a
tela (você será perguntado para certificar-se se realmente quer
a tela apagada).
13. Com uma tela limpa diante de você, crie outra figura.
14. Coloque a segunda figura no arquivo. Tecle <F> para modo
“ARQUIVAR”. Você verá a tela de alta resolução com a primei­
ra figura que você criou. Tecle <A> para juntar a segunda fi­
gura ao arquivo de tabela de figuras. Você agora tanto pode
anexar a segunda figura, ó que a fará figura# 2; ou você pode
inserir a segunda figura que a fará figura# 1 e faz a anterior fi-
gura#2. A janela de texto mostra agora que você tem duas figu­
ras no arquivo. Pressionando as teclas das setas, você pode se­
lecionar a figura que você quer ver. Tecle a barra de espaço
para voltar ao modo “EDITAR FIGURA”.
15. Grave a tabela de figuras para o disco. Para tanto, tecle <S>
para ir para o modo “COMANDO DOS”. No modo “COMANDO
DOS” aparece um menu. Agora simplesmente tecle <S> para
gravar o arquivo da tabela de figuras. Ser-lhe-á perguntado o
nome do arquivo. Digite “FIGURAS.TESTE” e tecle < RE­
TURN >. Seu arquivo de duas figuras está agora gravado no
114 Jogos de Ação para o Apple

disco sob o nome “FIGURAS.TESTE ”. Você pode verificar isto


pressionando <C> para catálogo e <P> para aceitar o pre­
fixo default (/JOGOS.AÇÃO). Depois de você ver o catálogo
você será perguntado com “COMANDO DOS:” (Isto será dis­
cutido mais tarde neste capítulo.) Tecle < RETURN > para vol­
tar para o menu COMANDO DOS.
16. Isto já dá uma idéia da capacidade do Editor de Tabela de Fi­
guras. A esta altura você pode experimentar por conta própria
os comandos ou teclar <Q> para parar.

MODOS PRINCIPAIS DO EDITOR DE TABELA DE FIGURAS

O que se segue é uma explicação detalhada dos comandos do Editor


de Tabela de Figuras. Você não tem que sabê-los todos para estar capa­
citado a usar o Editor de Tabela de Figuras. Agrupamos os comandos de
acordo com o modo pelo qual eles são chamados. Damos notas e expli­
cações com muitos dos comandos e mostramos notas de particular im­
portância nas caixas. Por exemplo:

MODO EDITAR FIGURA

Entrando o Editor de Tabela de Figuras, você verá um cursor piscante


no canto superior esquerdo da tela. O cursor é usado para determinar
onde pontos são desenhados ou apagados. Você pode mover o cursor
tanto pelos comandos do teclado como pelos paddles (joystick). Um
cursor diamante significa movimento do cursor por comandos do teclado.
É mostrado na janela de texto na base da tela. O que se segue é uma
lista completa dos comandos do modo “EDITAR FIGURA”. Note que mui­
tos dos comandos de teclado são chaves articuláveis. Isto significa que
pressionando a tecla, “acende” uma característica se estiver “apagada”
ou “apaga” se estiver “acesa”.

Controle do Cursor

U Move o cursor diagonalmente para cima e para a esquerda.


I Move o cursor para cima.
O Move o cursor diagonalmente para cima e para a direita.
J Move o cursor para a esquerda.
L Move o cursor para a direita.
M Move o cursor diagonalmente para baixo e para a esquerda.
, Move o cursor pára baixo.
Move o cursor diagonalmente para baixo e párã a direita.
P Modo “PADDLE” / modo “TECLADO” (chave articulável). Pressionan­
do <P> muda entre o modo “PADDLE” (Joystick) e o modo “TECLA­
Editor de Tabela de Figuras 115

DO”. No modo “PADDLE” (Joystick), o movimento do cursor é contro­


lado pelos paddles ou joystick; todos os outros comandos do tecla­
do ainda funcionam de maneira normal.
Comandos específicos para o modo “PADDLE”:
Disco do paddle 1: Move o cursor na direção vertical.
Disco do paddle 0: Move o cursor na direção horizontal.
Botão do paddle 1: Desenha um ponto?
Botão do paddle 0: Apaga um ponto.
P ou K: Seleciona o modo “TECLADO”. K sempre seleciona o
modo “TECLADO”; não é uma chave articulável.

Desenhando e Apagando Pontos na Figura de Edição


No modo “EDITAR FIGURA”, pontos são desenhados na tela de grá­
ficos de baixa resolução para gerar pontos de alta resolução na figura de
edição. Editar em baixa resolução permite a você visualizar pontos indi­
viduais mais facilmente. (O comando “H” explicado abaixo permite ver a
tela de alta resolução a qualquer hora durante a edição da figura.) Pontos
desenhados na tela de baixa resolução são verdes num monitor colorido,
e são facilmente distinguidos do cursor branco num monitor colorido ou
branco e preto. Estes pontos verdes de baixa resolução são traduzidos
como pontos de alta resolução para a figura de edição. Esteja atento que
os pontos de baixa resolução são mais largos e mais baixos que as di­
mensões relativas dos pontos de alta resolução; por isso, você deve dese­
nhar figuras algo mais largas e baixas em baixa resolução para fazê-las
parecerem corretas em alta resolução. Isto pode exigir alguma expe­
riência.
Os comandos para desenhar e apagar são os seguintes:
D: DOT ON/OFF. Esta é uma chave articulável se DOT está OFF (apaga­
do), o modo “DOT ON” será selecionado; se DOT está ON (aceso), o
modo “DOT OFF” será selecionado.
T: Idêntico ao “D”, um mnemônico adicional para TURTLE DOWN/UP.
(O cursor pode ser visto como uma tartaruga que desenha pontos
quando para baixo e se move sem desenhar pontos quando para cima.)
No modo “DOT ON”, qualquer movimento do cursor desenhará um
ponto ao longo da trajetória do cursor. No modo "DOT OFF”, o cursor
se move sem desenhar pontos.
1: Modo “PLOT”. No modo “DOT ON”, os pontos são desenhados em
verde, assim gerando pontos na figura de edição.
0: Modo “APAGAR”. No modo “DOT ON”, pontos são apagados.
2: Modo “FUNDO”. No modo “DOT ON”, pontos vermelhos são desenha­
dos. Estes pontos de fundo ajudam o usuário a planejar a figura de edi­
ção mas não traduzem para os pontos de alta resolução na figura de
edição.
NOTA: A janela de texto na base da tela informa se você está
no modo “DOT ON” ou “DOT OFF”, se você estiver no
modo “PLOT”, “APAGAR” ou “FUNDO” e dá a posição
X,Y do cursor.
116 Jogos de Ação para o. Apple

W: Desenha um ponto independente do modo “PLOT”/‘‘APAGAR” corren­


te; um mnemônico para escrever um ponto.
E: Apaga um ponto independente do corrente modo “PLOT”/“APAGAR”.
C: Apaga toda a figura de edição. Como uma precaução, você será requi­
sitado para um sim ou não antes que a tela sejá apagada.

Desenhando Linhas e Caixas

Linhas e caixas podem ser desenhadas usando os seguintes coman­


dos:
A: Ajusta a posição A,B para os correntes valores X,Y do cursor:
X: Desenha uma reta de A,B (ajustada previamente), para a posição X,Y
corrente.
NOTA: Como os comandos HLIN são usados para desenhar
uma linha reta, X deve ser igual a A, ou Y deve ser
igual a B.
B: Desenha uma caixa (retângulo) com A,B como a posição de um dos
cantos e os X,Y correntes como a posição do canto oposto. A posição
X,Y do cursor será o canto diagonalmente oposto à posição A,B.

Movimentando a Figura de Edição

Para mover a figura de edição inteira para uma nova posição na tela
de edição, use os seguintes comandos:
<— (seta esquerda): Movimenta a figura de edição para a esquerda. Se
a figura sair da tela pela esquerda, ela reaparecerá do lado direito.
—> (seta direita):.Movimenta a figura de edição para a direita. Se a figura
sair da tela pela direita, ela reaparecerá pelo lado esquerdo.
CTRL-K ou tecla da seta para cima: Movimenta a figura de edição para
cima. Se a figura sair pela parte superior da tela, ela reaparecerá na
parte inferior.
CTRL-J ou tecla da seta para baixo: Movimenta a figura de edição para
baixo. Se a figura sair pela parte inferior da tela, ela reaparecerá na
parte superior.
Existem diversas razões para movimentar a figura de edição na tela:
1. Se você estiver criando ou editando uma figura e você fica sem
espaço em uma das bordas da tela de edição, você pode movi­
mentar a figura para longe daquela borda para ter mais espaço.
2. Se você quiser juntar duas ou mais figuras em uma única figura,
você pode movimentar a presente figura de edição para uma no­
va posição. Então lance na tela de edição uma figura previamente
definida; A seção dos comandos no modo “ARQUIVAR” explica
como fazê-lo.
Editor de Tabela de Figuras 117

3. Embora você possa desenhar a figura de edição em qualquer lu­


gar da rede de 40 x 40 no modo “EDITAR FIGURA”, a origem
da figura de edição se encontra no canto superior esquerdo da
tela, em X,Y = 1,1. Quando você junta uma figura ao arquivo de
tabela de figuras (veja modo “ARQUIVAR”) ou quando você gra­
va (BSAVE) a figura para o disco (veja modo “COMANDO DOS”),
a figura de alta resolução será gerada a partir do canto superior
esquerdo da tela. Por isso você geralmente quererá mover a
figura o mais alto possível, bem como o mais perto da borda
esquerda na tela. (Uma exceção para isto èstá em criar fontes;
veja o Apêndice D, Texto na Tela de Alta Resolução).
NOTA: Como uma regra geral, qualquer comando pode ser
deixado pressionando <ESPAÇO> ou <RETURN>.
O Editor de Tabela de Figuras tem três modos principais (e alguns
modos secundários, descritos abaixo). Os três principais modos são:
1. Modo “EDITAR FIGURA”: Neste modo, você cria e edita vetores
de figuras Applesoft desenhando pontos na tela de baixa reso­
lução do Apple. Então o Editor de Tabela de Figuras traduz as
figuras de baixa resolução para alta resolução.
2. Modo “ARQUIVAR”: Neste modo, você anexa ou insere figuras
de edição no arquivo de tabela de figuras; vê figuras no seu
arquivo de tabela de figuras; elimina figuras do arquivo; recupera
figuras previamente criadas para o modo “EDITAR FIGURA”
para edição; e executa outras funções de arquivo de figuras.
3. Modo “COMANDO DOS”: Neste modo, você grava o arquivo da
tabela de figuras para o disco; recupera arquivos de tabela de
figuras do disco para vista e edição; e executa outros comandos
de disco.
Quando você entra pela primeira vez o Editor de Tabela de Figuras,
você está no modo “EDITAR FIGURA”.

Saindo do Editor de Tabela de Figuras


Q: Sair do Editor de Tabela de Figuras.
Teclando <Q>, ser-lhe-á perguntado se realmente quer parar. Certi­
fique-se de haver arquivado e gravado sua tabela de figuras antes de
teclar <S> (para sim). Caso contrário você perderá todo seu trabalho.

MODO ARQUIVAR

O modo “ARQUIVAR” é o segundo dos três importantes modos do


Editor de Tabela de Figuras. O comando para entrar o modo “ARQUI­
VAR” é:
118 Jogos de Ação para o Apple

,F: Entre modo “ARQUIVAR”. Este comando só pode ser executado do


modo “EDITAR FIGURA”. Todavia, o modo “ARQUIVAR” é entrado
automaticamente quando se carrega (BLOAD) um arquivo de tabela de
figuras no modo “COMANDO DOS” (veja abaixo).
NOTA: Ao pressionar F para entrar o modo “ARQUIVAR”, ser-
Ihe-á dado um aviso se nenhum arquivo estiver corrente­
mente na memória. Sem arquivo na memória, não será
possível você executar alguns comandos; tal como elimi­
nar uma figura ou carregar um arquivo de figuras para
editar. Após o aviso, simplesmente tecle < ESPAÇO >
para entrar no modo “ARQUIVAR”.
Uma vez que você entra o modo “ARQUIVAR”, você verá uma tela
de alta resolução e uma janela de texto. A janela contém informação sobre
o arquivo de tabela de figuras correntemente na memória, e lista diversos
comandos do modo “ARQUIVAR”. As mensagens de informação mostra­
das são as seguintes:
#FORMAS: Dá a você o número de figuras em arquivo; inicialmente ele
será zero.
VENDOR :• Dá o número da figura que está sendo vista na tela de alta
resolução. Se você não tiver figura em arquivo, você verá uma tela
vazia. Você pode também querer criar uma tabela de figuras com
algumas figuras vazias. Por exemplo, a primeira figura dos arquivos
FONTE é um vazio (veja a explicação abaixo). Por isso, não se
assuste se não vier nada na tela enquanto estiver vendo uma figura
numerada.
Os comandos do modo “ARQUIVAR” são os seguintes:
F: ESTAT. ARQUIVO. Dá o número de figuras no arquivo e o comprimento
do arquivo de tabela de figuras (em bytes).
A: ADICIONAR FIGURA. Teclando <A> você pode adicionar a presente
figura de edição (criada e/ou editada em modo “EDITAR FIGURA”) pa­
ra o arquivo de tabela de figuras. Será comunicado a você o seguinte:
TECLE <l> PARA INSERIR FIGURA EDITADA NO ATUAL NÚME­
RO DE ARQUIVO. A atual figura de edição se tornará o número da
figura que está sendo vista. Todas as figuras subseqüentes no ar­
quivo terão um número de figura acrescido de 1. Por exemplo, se
você estiver atualmente vendo a figura4F3, e teclar <l>, a figura
de edição se tornará figura4#3, e, a que era figura ^3, passará a
ser figura 4# 4, etc.
TECLE <A> PARA ANEXAR FIGURA EDITADA AO FIM DO AR­
QUIVO. Se você tiver oito figuras em arquivo por exemplo, a atual
figura de edição se tornará figura 4K 9 do arquivo de tabela de
figuras.
NOTA: Como com qualquer outro comando, tecle < RETURN >
ou <ESPAÇO> para deixar o comando.
NOTA: Antes de anexar ou inserir uma figura de edição, você
geralmente quererá a figura de edição o mais alto pos­
Editor de Tabela de Figuras 119

sível e o mais perto da borda esquerda da tela de edi­


ção. Use os comandos de movimentação no modo "EDI­
TAR FIGURA” para mover a figura para cima e para a
esquerda na tela. (Existem casos especiais nos quais
você vai querer que a origem seja removida da própria
figura, assim como na criação de fontes.)
<— (seta esquerda): Mostra figura anterior. Se seu arquivo tiver oito figu­
ras e você estiver atualmente vendo a figura 6, a seta esquerda
ocasionará o surgimento da figura 5. Se você estiver vendo a
figura 4|? 1> a seta esquerda fará com que a figura ^#8 seja mostrada.
—> (seta direita): Mostra a figura seguinte. Se seu arquivo tiver oito figu­
ras e você estiver vendo a figura 6, a seta direita fará com que a
figura # 7 seja mostrada. Se você estiver vendo a figura * 8, a seta
direita fará com que a figura 1 seja mostrada.
L: CARREGAR FIGURA DE ARQUIVO P/ EDITAR. A figura de arquivo
exibida no momento será carregada no editor e assim se torna a figu­
ra de edição. A figura que estiver sendo editada no momento (se hou­
ver uma) será apagada. Depois de pressionar <L>, ser-lhe-á per­
guntado "CARREGO A FIGURA EXIBIDA PARA EDIÇÃO? (S/N)”
para certificar se isto é o que você realmente quer fazer.
V: SOBREPOR FIGURA DE ARQUIVO PARA EDIÇÃO. A figura de ar­
quivo exibida no momento será carregada acima da figura de edi­
ção corrente (sobreposta). Este comando junta duas figuras em uma.
Por exemplo, considere que você tem uma figura no formato de um
círculo, e outra no formato da letra R. Se você quiser fazer um R
circunscrito (como o símbolo de “marca registrada”), você primeiro
carregaria a figura do círculo.. Então mova o círculo na tela (veja
abaixo como fazer para mover figuras de edição). Finalmente, reen-
tre o modo “ARQUIVAR” e sobreponha o R. Como outro exemplo,
você poderia fazer toda uma palavra numa única figura, combinan­
do as figuras de letras individuais.
S: SELECIONAR FIGURA#:. Quando você tecla <S>, o programa pe­
dirá para você selecionar o número da figura que você deseja ver.
O programa dará o limite permitido de valores baseado no n.° de
figuras no arquivo.
D: APAGAR. Ao teclar <D>, o programa dará um aviso sonoro e per­
guntará: “APAGO APENAS ESTA FIGURA? <S/N>”. Se você qui­
ser apagar só esta figura, tecle <S>. Se você acidentalmente teclar
<D> e não desejar apagar esta figura, ou se quiser apagar todas
figuras, tecle <N>. O programa então perguntará “APAGO TODO
O ARQUIVO? <S/N>”. Tecle <N> para retornar ào menu do mo­
do “ARQUIVAR”; tecle <S> para apagar todo arquivo.
<ESPAÇO> ou <RETURN>: SAIR DÒ MODO “ARQUIVAR” E RE­
TORNAR PARA O MODO “EDITAR FIGURA”. Este comando não
está relacionado na janela de texto no modo “ARQUIVAR”, mas vai
levá-lo de volta para o modo “EDITAR FIGURA”.
120 Jogos de Ação para o Apple

MODO COMANDO DOS


O terceiro è úítimo modo principal é o modo “COMANDO DOS” usa­
do para acessar o drive. Os comandos associados ao modo “COMANDO
DOS” são:
S: Entre no modo “COMANDO DOS” do modo “EDITAR FIGURA”.
<ESPAÇO> ou <RETURN>: Sair do modo “COMANDO DOS” e re­
tornar para o modo “EDITAR FIGURA”.
No modo “COMANDO DOS”, será mostrado a você um menu com as
seguintes opções:
P: PREFIXO (CORRENTE: --------------------). Quando você tecla <P> ele
mostra “PREFIXO/” que espera você digitar um novo prefixo ProDOS.
Para sair do comando, tecle < RETURN > antes de digitar qualquer
outra coisa.
C: CATALOG (POR DRIVE OU PREFIXO). Isto permite a você catalogar
o drive e dar outros comandos DOS. Quando você tecla pela primeira
vez <C>, o programa pergunta.se você quer catalogar por drive ou
prefixo. Se você teclar <D> para drive, o programa perguntará qual
drive (1 ou 2). Se você teclar <P>, o programa mostrará um catálogo
do drive de prefixo default. Depois do catálogo, será mostrado a você
o seguinte:
COMANDO DOS:
Agora você pode digitar qualquer comando ProDOS. Se o comando
requerer uma vírgula (tal como um comando RENAME), então você de­
ve pôr todo o comando entre aspas. Por exemplo,, você pode travar
(LOCK) ou déstravar (UNLOCK) um arquivo sem pôr o comando entre
aspas, mas para mudar o nome (RENAME) de um arquivo, você pre­
cisará de aspas: “RENAME NOMEARQUIVO.VELHO.NOMEARQUIVO.
NOVO”. Tecle <RETURN> para voltar ao menu COMANDO DOS.
L: CARREGAR UM ARQUIVO DE TABELA DE FIGURAS. Ao teclar <L>,
o programa perguntará o nome do arquivo que você quer carregar
(BLOAD). Se você já tiver um arquivo na memória, o programa dará
um aviso que carregando (BLOAD) um outro arquivo destruirá o atual
arquivo de tabela de figuras. Depois de você digitar o nome do arqui­
vo desejado e teclar <RETURN>, você automaticamente entrará no
modo “ARQUIVAR” (veja acima).
S: GRAVAR UM ARQUIVO DE TABELA DE FIGURAS. Este comando gera
um “NOME DO ARQUIVO —>” pára você digitar o. nome que você
deseja dar ao arquivo de tabela de figuras. Se não houver arquivo de
tabela de figuras na memória, você não terá condições de executar
este comando.
NOTA: O modo “COMANDO DOS” também mostra o atual estado
do arquivo de tabela de figuras na memória, isto é, o nú­
mero de figuras e o comprimento do arquivo (em bytes).
O Apêndice E (“Guia de Referência Rápido para o Editor de Tabela
de Figuras”) dá Um resumo de todos os comandos do Editor de Tabe­
la de Figuras.
Editor de Tabela de Figuras 121

USANDO TABELAS DE FIGURAS


O seu manual de Applesoft BASIC explica como criar e usar figuras
de alta resolução, mas o método que ele descreve é complexo e confuso.
O Editor de Tabela de Figuras acima descrito elimina o trabalho braçal
e a possibilidade de erro na criação de figuras.
Esta seção explica como as tabelas de figuras criadas e editadas
pelo Editor de Tabela de Figuras são usadas em seus próprios programas
Applesoft. Você deveria freqüentemente consultar o Mapa da Memória do
Apple no Apêndice C, ou o Mapa da Memória do Editor de Tabela de
Figuras no final deste capítulo. O procedimento para usar as tabelas de
figuras é o seguinte:
1. Decida onde você quer que sua tabela de figuras resida na me­
mória do Apple. As três posições comuns são as seguintes:
a. Se a tabela de figuras for muito pequena e você não tiver um
programa em linguagem de máquina nesta posição, um bom
local para colocar a tabela de figuras é na posição $300 da
memória (= decimal 768). Isto costuma ser chamado “página
3” da memória; não é usada pelo sistema Applesoft ou pelo
DOS, assim ela está disponível para seu uso (veja Mapa da
Memória, Apêndice C). Se você escolher o uso da página 3 no
seu programa, use a declaração: PRINT CHRS (4); “BLOAD
FIGURAS.ARQUIVO, AT68” ou PRINT CHR$ (4); “BLOAD Fl-
GURAS.ARQUIVO, AS300”. Aqui “FIGURAS.ARQUIVO” deve­
ria ser substituído pelo nome do seu arquivo.
b. Para uma grande tabela de figuras, a mais comum (e mais fá­
cil) posição para carregar (BLOAD) sua tabela de figuras é bem
alto na memória (perto de onde ProDOS reside; veja Mapa da
Memória). Quando você carrega um disco no Apple II+ 48K pe­
la primeira vez, HIMEM (Highest MEMory) é colocado em S9600
(38400). Isto significa que a mais alta posição disponível ria me­
mória para seu programa Applesoft é $9600, que é onde as
strings Applesoft começam. Você pode carregar (BLOAD) sua
tabela de figuras imediatamente abaixo de $9600. Por exem­
plo seu programa poderia ter uma declâração PRINT CHR$
(4); “BLOAD FIGURAS.ARQUIVO, AS7000” ou PRINT CHRS (4);
“BLOAD FIGURAS.ARQUIVO, A28672” para carregar â tabela
de figuras para hexadecimal $7000 — decimal 28672.
Se carregar (BLOAD) sua tabela de figuras bem alto, pró­
ximo do ProDOS, você terá que ajustar HIMEM; caso contrário,
as strings Applesoft irão sobrepor sua tabela de figuras. Por
exemplo, se você carregar (BLOAD) a tabela de figuras para
dec. 28672, você precisará juntar a declaração (perto do início
de seu programa Applesoft) “HIMEM: 28671”. Isto forçará as
strings Applesoft a começar em 28671 e assim proteger sua
tabela de figuras. Veja o seu manual de Applesoft BASIC para
uma explicação de HIMEM.
c. Você pode também colocar sua tabela de figuras na região da
memória compreendida entre $800 e $2000 (dec. 2048 a 8192)
122 Jogos de Ação para o Apple

onde Applesoft geralmente reside. Isto requer que seu progra­


ma Applesoft seja carregado para outra posição de memória,
ou que ele seja movido para outra posição após haver sido
carregado. Para isto, inclua a seguinte linhá perto do começo
de seu programa.
120 IF PEEK (104) < > 64 THEN POKE 103,1:POKE 104,64:
POKE 16384,OrPRINT CHRS (4); “RUN MEU.PROGRAMA”
Onde “MEU.PROGRAMA” é o nome do programa Applesoft no
qual a linha 120 aparece. Por exemplo; o próprio programa
Editor de Tabela de Figuras usa este caminho (veja a linha 120
da Listagem 12.1).
Agora toda região abaixo da tela 1 de alta resolução está
disponível para sua tabela de figuras. Além disso, movendo seu
programa acima da tela de alta resolução você terá muito mais
espaço de memória e poderá escrever programas muito mais
longos sem interferir na tela 1 de alta resolução.
NOTA: Você não pode mais usar a tela 2 de alta resolução,
uma vez que seu programa Applesoft está localiza­
do lá.
2. Agora que você sabe onde carregar (BLOAD) sua tabela de fi­
guras, você deveria ir em frente e carregar (BLOAD) a tabela
de figuras na memória. Esta declaração: 120 PRINT CHR$ (4);
“BLOAD FIGURAS. ARQUIVO,A$7000” ou equivalentemente, 120
PRINT CHRS (4); “BLOAD FIGURAS.ARQUIVO, A28672” conclui­
rá isto.
3. Uma vez que você tenha carregado (BLOAD) sua tabela de figu­
ras, você tem que protegê-la de ser apagada por outras ope­
rações do programa. Em cada uma das três posições de me­
mória dadas acima no passo 1, dissemos a você como proteger
a sua tabela de figuras. No primeiro exemplo, você carrega
(BLOAD) a figura para uma região do usuário (S300-S3CF) que
está automaticamente protegida do Applesoft e ProDOS. O único
problema possível é se você carregar (BLOAD) ou incluir (POKE)
uma rotina de máquina sobre o topo de sua tabela de figuras
(por exemplo, muitas rotinas de som carregam (BLOAD) em
$300). No segundo exemplo, você posicionou HIMEM abaixo da
tabela de figuras, protegendo-a assim das strings Applesoft que
normalmente são escritas nesta região da memória. E no terceiro
exemplo, você moveu o programa Applesoft e assim evitou qual­
quer conflito de memória quando a tabela de figuras é carregada
(BLOAD) para a região previamente ocupada pelo Applesoft.
Usando o terceiro exemplo, você necessita da seguinte decla­
ração no seu programa:
140 HIMEM: 28671 : REM PROTEJE A POSIÇÃO DE MEMÓRIA
ACIMA DE $7000 DAS STRINGS APPLESOFT
4. O próximo passo é avisar o Applesoft onde está sua tabela de
figuras. Para conseguir isto, inclua (POKE) o endereço de sua
Editor de Tabela de Figuras 123

tabela de figuras nas posições SE8 (232) e SE9 (233) da memó­


ria. O procedimento mais fácil para isto é: deixe que AD seja
uma variável ajustada para o endereço de carregamento (BLOAD)
de sua tabela de figuras, então coloque o seguinte código no seu
programa:
200 DEF FN HB(A) = INT(A/256) : REM DEFINE UMA FUNÇÃO
QUE CALCULA O BYTE MAIS SIGNIFICATIVO DE UMA
VARIÁVEL
220 DEF FN LB(A) = A - FN HB(A) * 256 : REM DEFINE UMA
FUNÇÃO QUE CALCULA O BYTE MENOS SIGNIFICATIVO
DE UMA VARIÁVEL
240 AD = 28672 : REM AJUSTA AD PARA A POSIÇÃO DA
TABELA DE FIGURAS. 28672 = $7000
260 POKE 232, FN LB (AD) : REM INCLUIR (POKE) O BYTE
MENOS SIGNIFICATIVO DO ENDEREÇO
280 POKE 233, FN HB (AD) : REM INCLUIR O BYTE MAIS
SIGNIFICATIVO DO ENDEREÇO
5. Agora você está pronto para usar os comandos Applesoft de alta
resolução DRAW, XDRAW, SCALE e ROT. Nas declarações se­
guintes, usaremos uma tabela de figuras chamada Arquivo de
Figuras. Você deveria usar o Editor de Tabela de Figuras para
criar um arquivo de tabela de figuras com pelo menos cinco
figuras simples, e gravá-lo em disco com o nome “ARQUIVO.FI-
GURAS”.
Agora junte o código seguinte à listagem do programa-exemplo:
300 ROT = 0 : REM FIXA O VALOR DE ROTAÇÃO. VOCÊ
GERALMENTE USARA 0
320 SCALE = 1 : REM FIXA A ESCALA EM 1 (VALORES MAIO­
RES PODEM CAUSAR DISTORÇÃO DAS FIGURAS)
340 HCOLOR = 3 : REM FIXA EM BRANCO AQUI (ALGUMAS
CORES CAUSAM DISTORÇÃO EM ALGUMAS FIGURAS).
PARA MELHORES RESULTADOS, USE O EDITOR DE TA­
BELA DE FIGURAS PARA SABER COMO SUA FIGURA SE
PARECE EM VÁRIAS CORES.
360 DRAW 4 AT 130,70 : REM DESENHA UMA FIGURA PERTO
DO CENTRO DA TELA
380 XDRAW 4 AT 140,70 : REM MOSTRA O EFEITO DE UM
XDRAW
Sempre se lembre que antes de usar DRAW ou XDRAW em seu pro­
grama, você precisa fixar a cor de alta resolução, a rotação da figura e
a escala. Para isso, use os comandos gráficos Applesoft HCOLOR, ROT,
e SCALE, como mostrado nos exemplos acima.
MAPA DA MEMÓRIA DO EDITOR DE TABELA
DE FIGURAS
A Figura 12.1 dá o mapa da memória do Editor de Tabela de Figuras.
Se você for um programador de linguagem assembly, note que existem
124 Jogos de Ação para o Apple

FIGURÁ12.1
MAPA DA MEMÓRIA DO EDITOR DE TABELA DE FIGURAS
Endereços Endereços
decimais hexadecimais
ROM
41952 $C000
ProDOS (ou DOS)
38400 $9600
ARQUIVO (dados) da Tabela de Figuras
31488 $7B00
Buffer do índice da Tabela de Figuras
30976 $7900
Programa EDITOR DE TABELA DE FIGURAS
16384 $4000
Tela 1 de Alta Resolução
8192 $2000
LR.VECTOR.DRAW*
7936 $1F00
AMPER.ASE*
7168 $1C00
Espaço do Usuário
5888 $1700
FIGURA DE EDIÇÃO (dados)
4352 $1100
Buffer de Dados.
2158 $09D6
SHAPE.COMP*
2048 $0800
Tela de Texto e de Baixa Resolução
1024 $0400
Ponteiros do DOS
976 $03D0
Espaço do Usuário
768 . $0300
Buffer de Entrada
512 $0200
Pilha (Stack)
256 $0100
Página Zero
0 $0000

Sub-rotinas de linguagem de máquina.


Editor de Tabela de Figuras 125

Listagem 12.1: EÔ.TABELA.FORMAS

10 REM ************************
20 REM * EDITOR DE TAB. FIG. *
30 REM * BY SCOTT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM ************************
90 REM
100 HIMEM: 30975: TEXT : HOME
120 IF PEEK (104) < > 64 THEN !
POKE 103,
1: POKE 104,64: POKE 16384, 0-: PRINT
CHR$ (4);"RUN ED.TAB.FIG."
140 DEF FN P(A) = PEEK (A) + PEEK (A +
1) * 256
160 DEF FN LB(A) » A ” FN HB(A) » 256
180 DEF FN HB(A) = INT (A / 256)
200 PR$ = "JOGOS.ACAO":L => 7184: IF PEEK:
(L> < > 201 THEN PRINT CHRS (4);"BRUN
AMPER.ASE II

220 POKE 1014 , FN LB(L): POKE 1015, FN HB(L)


240 TEXT : HOME : Tl,8: & C40 INVERSE
PRINT "EDITOR DE TAB. DE FIGURAS":
FIGURAS" NORMAL,
260 & Tl,ll : & 040: PRINT "BY S. SCOTT ZIMMERMAN"
PRINT : & C40: PRINT "COPYRIGHT (C)
1985“
280 & Tl,21 PRINT "FAVOR ”;s FLASH s PRINT
"ESPERAR";: NORMAL : PRINT <». ": CARREG. ARQS
& T'1,1
300 DIM A(6),B(6)
320 IF PEEK (7936) < >-165 THEN PRINT
CHR$ (4) ;"BLOAD LR.VECTOR.DRAW"
340 IF PEEK (2048) < > 169 THEN PRINT
CHR$ (4);"BLOAD SHAPE.COMP"
360 CL = 7:C2 = 3:SC = 2048:VD « 7936:SHAPE
= 4348;FILE = 31488:BUFFER = 8192'
380 POKE FILE,O: POKE 4352,0s POKE 4353,0
400 & Tl,21: CALL - 958: PRINT "TECLE <ESPACD>
P/ COMECAR: '■.!• •. GET A$: PRINT A$
420 HOME : POKE 34,1
440 POKE 4351,0: POKE 4350,4s POKE 4349,0
POKE 4348,1
126 Jogos de Ação para o Apple

460 POKE 230,32: POKE - 16297,0: ROT= 0:


SCALE= 1: CALL 62450
480 POKE 232,252: POKE 233,16
SOO TEXT : HOME POKE 34,20: POKE 16301,
O: GR :PD ■ 0:C = 12:DOT = 0
1000 Ai = FRE (O) POKE 34,20: HOME : INVERSE
: PRINT "F";: NORMAL : PRINT ":AROUIVAR
Í! -5 „■ INVERSE : PRINT "0"; : NORMAL
: PRINT ":SAIR "
1010 & T29.21: INVERSE PRINT “D";: NORMAL
: PRINT ”: DOT 1! .

1020 IF DOT THEN & T 35,21; INVERSE : PRINT


"ON ";: NORMAL : PRINT "/OFF": GOTO 1040
1030 & T35,21: PRINT "ON/";: INVERSE : PRINT
"OFF”; NORMAL
1040 IF NOT PD THEN 1060
1050 & T1,22 PRINT ” : & Tl,24:
PRINT Cl
& Tl,23: PRINT
up j <i . 2 INVERSE : PRINT "PADDLES";: NORMAL
: PRINT ” GOTO 1080
1060 & Tl,22: PRINT " INVERSE : PRINT
"!JIO": & Tl,23: PRINT "P ";: NORMAL :
PRINT ";TECL:";:
";TECL INVERSE : PRINT "J";
: NORMAL : PRINT ■ I H a
JI INVERSE : PRINT
"L";s NORMAL
1070 & Tl,24: PRINT " j ■ INVERSE : PRINT
"M,.";: NORMAL
1080 ?< T13,22: INVERSE PRINT "S" NORMAL
: PRINT ":COMANDO DOS";
1090 & T27,22: INVERSE : PRINT "1/0" » • NORMAL
: IF C = 0 THEN PRINT ":PLOT/ <>.5 INVERSE
: PRINT "APAGA";: NORMAL : GOTO 1120
1100 IF C = 12 THEN & T31,22: INVERSE : PRINT
"PLOT";: NORMAL : PRINT "/APAGA";: GOTO
1120
1110 IF C = 1 THEN & T31,22: INVERSE : PRINT
"FUNDO ••.
1120 & T13,23: INVERSE : PRINT "B";: NORMAL
: PRINT CAIXA A,B/X,Y INVERSE :
PRINT ”H” ;: NORMAL : PRINT ":ALTA RES.";
1130 & T13,24: INVERSE : PRINT "X,Y";: NORMAL
: PRINT " = "X + 1","Y + 1;: & T27,24:
PRINT "A:";: INVERSE : PRINT "A,B";:
NORMAL : PRINT "=”A1 + 1","Bl + 1"";:
CALL - 868
Editor de Tabela de Figuras 127

1140 POKE - 16368,0: POKE 6,2


1150 GOSUB 9000
1160 KB = PEEK ( - 16384): IF KB > 135 THEN
POKE - 16368,0: GOTO 1230
1170 GOSUB 9040: IF NOT PD THEN 1150
1180 INT ( PDL (0) / 6.38):Y = INT ( PDL
(1) / 6.38)
1190 & T17,24: PRINT X + 1","Y + 1"" ;: POKE
33, 24: CALL - 868: POKE 33,40
1200 IF PEEK ( - 16286) >127 THEN COLOR35
C: PLOT X,Y
1210 IF PEEK ( - 16287) > 127 THEN COLOR=
0: PLOT X,Y
1220 GOTO 1150
1230 GOSUB 9100: IF KB = 136 THEN 4040
1240 IF KB = 138 THEN 4100
1250 IF KB = 139 THEN 4080
1260 IF KB =' 149 THEN 4060
1270 IF KB < 172 THEN 1300
128Ò ON KB - 171 GOTO 1490,1300,1500,1300,1340,
1370.1330.1300.1300.1300.1300.1300.1300,
1300,1300,1300,1300,1300,1300,1300,1300
1290 ON KB - 191 GOTO 1300,1310,1320,7000,1390,
1380,3000,1300,6000,1430,1450,1510,1470,
1480,1300,1440,1520,1 OOOO,1300,8000,1390,
1420.1300.1460.3940.1300.1300.1300.1300,
1300
1300 GOTO 1150
1310 Al = X:B1 = Y:XP = X:YP = Y: & T33,24:
PRINT Al + 1","Bl + 1"";: CALL - 868:
GOTO 1150
1320 COLOR= C: HLIN A1,X AT Bl: VLIN 01, Y AT
X: HLIN A1,X AT Y: VLIN B1,Y AT Air GOTO
1150
1330 C = 1: & T31,22: INVERSE : PRINT "FUNDO " ;
: NORMAL : GOTO 1350
1340 C = O: & T31,22: PRINT "PLOT/";: INVERSE
: PRINT "APAGA": NORMAL
1350 IF DOT THEN COLOR= C: PLOT X,Y
1360 GOTO 1150
1370 C = 12: & T31,22: INVERSE : PRINT “PLOT";
: NORMAL : PRINT "/APAGA";: GOTO 1350
1380 COLOR= 0: PLOT X,Y: GOTO 1150
1390 DOT = ABS (DOT - 1): % T35,21: ON DOT
+ 1 GOTO 1410,1400
128 Jogos de Açâo para o Apple

1400 INVERSE : PRINT "ON";: NORMAL : PRINT


"/OFF" ;: COLOR= C: PLOT X,Y: GOTO 1150
1410 PRINT " ON/";: INVERSE :.PRINT "OFF"^
NORMAL : GOTO 1150 : ••
1420 X = X - 1:Y = Y - 1: GOTO 1570 *
1430 Y = Y - 1: GOTO 1570
1440 Y = Y - 1:X = X + 1: GOTO 1570
1450 X - X - 1: GOTO 1570
1460 COLOR= 12: PLOT X,Y : GOTO1 1150
1470 X = X + 1: GOTO 1570
1480 X = X - lsY = Y + <1: GOTO 1570
1490 Y = Y + 1: GOTO 1570
1500 X = X + 1:Y = Y + 1: GOTO 1570
1510 PD = 1
1520 PD = A8S (PD - 1): IF PD THEN & Tl,22:
PRINT it t T.1,24: PRINT
"; : & Ti,23: PRINT "P:";:
INVERSE : PRINT "PADDLES”}: NORMAL :
PRINT " ";: SOTO 1550
1530 & Tl,22: PRINT " INVERSE : PRINT
"UlO": & Tl,23: PRINT "P";: NORMAL :
PRINT ":TECL:".;: INVERSE : , PRINT "J".;
: NORMAL : PRINT " INVERSE : PRINT
"L";: NORMAL
1540 & Tl,24: PRINT " ";: INVERSE- Í PRINT
"M,.";: NORMAL <
1550 CL = 7;C2 = 3: IF PD THEN CL- 1:C2 = Ó
1560 GOTO 1150
1570 IF X < 0 THEN X = 0 '
1580 IF X ✓ 39 THEN X = 39 I
1590 IF Y < 0 THEN Y = 0
1600 IF Y > 39 THEN Y = 39
1610 IF DOT THEN COLOR= C: PLOT X,Y
1620 & T17,:24: PRINT X + 1","Y + 1"";: ROKE
33,23: CALL - 86B: POKE 33,40: GOTO
1150
2000 HOME
2020 GOSUB 2660: IF TL THEN 3100
2040 & Tl.,21: PRINT "TÊCLÉ INVERSE : PRINT
"I";: NORMAL : PRINT “ P/ INSERIRFiqURA
DE EDICAO": PRINT ” NO N# DE ARQUIVO
CORRENTE": PRINT "TECLE "; : INVERSE
: PRINT "A";: NORMAL : PRINT " P/ COLOCAR
FIGURA DE EDICAO"
2050 PRINT " NO FlM DO ARÒUIVÚ ";s GET A*
Editor de; Tabela de Figuras 129

2060 IF A$ = CHRS (13) OR AS = " " THEN 3100


2030 IF AS = "I" THEN 2380
2100 IF AS < > "A" THEN 2040
2120 IF NS >0 THEN 2200
2140 & MSHAPE,ES,FILE
2160 SF = FILE:NS = 1*:EA = FILE + LN - 1:NF
= 1:N1 = 1:LF = LN
2130 GOTO 3080
2200 HOME : & MSHAFE + 4,ES,EA + 1
2220 OFF = (EA + 1) - (SF - 2)
2240 SF = SF - 2: POKE SF,NS + Is POKE SF +
1,0
2260 A = SF + 4:E = SF + 2 + NS * 2:L = A -
2
2280 & MA,E + 1,L
2300 & AL,E - 2,2
2320 NS = NS + 1:EA = EA + LN - 4s NF = 1: LF
= LF + LN - 2:N1 = NS
2340 A = SF + NS * 2: POKE A, FN LB(OFF): POKE
A + 1, FN HB(OFF)
2360 GOTO 3080
2330 IF NS = O THEN 2140
2400 I = 2 * N1 + SF:AD = SF + FN P(I):EN =
EA
2420 & MAD,EN,AD + LN - 4
2440 & MSHAPE + 4,ES,AD
2460 SF = SF - 2: POKE SF,NS + 1: POKE SF +
1,0
2480 A = SF + 4:E = SF + 2 + N1 * 2:L = A -
2
2500 & MA,E + 1,L
2520 & AL,E - 2,2
2540 NS = NS + 1:EA = EA + LN - 4:NF = 1:LF
= LF + LN - 2
2560 A = SF + N1 * 2 + 2
2530 E = SF + NS * 2
2600 & AA,E,LN - 2
2620 GOTO 3080
2640 STOP
2660 IF NS > 255 OR LF + LN > 6820 THEN 2700
2680 TL = 0: RETURN
2700 & Tl,21: CALL - 958: & Tl,22: & C40:
FLASH : PRINT "ARQUIVO SERIA MUITO GRANDE!":
NORMAL : & T23,24: PRINT "TECLÈ <ESPACO>:
GET A$: PRINT AT
130 Jogos, de Ação para o Apple

2720 TL = 1: RETURN
3000 GOSUB 9200:NF = O: IF NS > O THEN NF =
1: GOTO 3080
3020 HOME :N1 = 0
3040 & TI,22: & C40: FLASH : PRINT "NAD HA ARQUIVO"
: NORMAL : PRINT " NA MEMÓRIA AGORA"
3060 & T23,24: PRINT "TECLE <ESPAÇO>: ";: GET
Aí: PRINT Aí
3080 HGR : ROT= O: SCALE= 1: HCOLOR= 3:X3 =
125:Y3 = 75
3100 HOME : & Ti,21: PRINT "# FORMAS:";: INVERSE
: PRINT NS;: NORMAL
3120 & T29,21: PRINT "VENDO #:”;: INVERSE
: PRINT Ni;: NORMAL
3140 & T13,2Í: INVERSE : PRINT "F";: NORMAL
: PRINT STATUS ARQ.";
3160 & Tl,22: INVERSE : PRINT "A";: NORMAL
: PRINT ":ADICIONAR FIG. AO ARQ.";
3180 & Tl,24: INVERSE : PRINT "V";: NORMAL
: PRINT ":SOBREPOR FIG.ARQ. P/ ED";
3200 & Tl,23: INVERSE : PRINT "L";: NORMAL
: PRINT CARREGAR FIG.ARQ. P/ ED";
3220 & T27,22: INVERSE : PRINT NORMAL
: PRINT "INVERSE ; PRINT :
NORMAL : PRINT ":PROX FIG";
3240 & T27,23: INVERSE : PRINT "S";: NORMAL
: PRINT ":SELEC. FIG.#";
3260 & T27,24: INVERSE : PRINT "D";: NORMAL
: PRINT ":APAGAR”;
3280 POKE 232, FN LB(SF): POKE 233, FN HB(SF)
3300 IF NF THEN DRAW N1 AT X3,Y3
3320 KB = PEEK ( - 16384): IF KB < 136 THEN
3320
3340 POKE - 16368,0
3360 IF NF THEN 3400
3380 GOTO 3520
3400 IF KB = 136 THEN 3640
3420 IF KB = 149 THEN 3680
3440 IF KB = 196 THEN 11000
3460 IF KB = 204 THEN 3720
3480 IF KB = 214 THEN 3840
3500 IF KB = 211 THEN 3880
3520 IF KB = 160 OR KB = 141 THEN 3600
Editor de Tabela de Figuras 131

3540 IF KB = 198 THEN GQSUE 9120: & T25,24:


PRINT "TECLE <ESPACG>-: "; : GET At: PRINT
At: GOTO 3100
3560 IF KB = 193 THEN 20Ò0
3580 GOTO 3320
3600 IF NOT OV THEN GR
3620 GQSUE 9220: POKE 232,252: POKE 233,16:
POKE - 16298,0: POKE - 16304,0: GOTO
1000
3640 XDRAW N1 AT X3,Y3:N1 = Nl - Is IF Nl =
0 THEN Nl = NS
3660 SOTO 3700
3680 XDRAW Nl AT X3,Y3:N1 = Nl + 1: IF N1 >
NS THEN Nl = 1
3700 8c T37,21: INVERSE : PRINT Nl;: NORMAL
: CALL - 868: GOTO 3300
3720 HOME :0V = 0: 8c Tl,22: PRINT "CARREGAR FIG.
VISTA PZ EDICAO? (SZN) "; : GET At:
PRINT At: IF At < > "S" THEN 3100
3740 I = 2 * Nl + SF
3760 AD = SF + FN P(I): IF Nl < NS THEN EN
= SF + FN P(I + 2) - 1: GGTO 3800
3780 EN = LF + SF - 1
3800 & MAD,EN,SHAPE + 4
3820 GOTO 3600
3840 HOME : 8c Tl,22: PRINT "SOBREPOR FIG.
VISTA PZ ED.? (SZN) ”;: GET At: PRINT
At: IF At- < > "S" THEN 3100
3860 OV — 1: GR : GOSUB 9220: GOTO 3740
3880 8c Tl,22: CALL - 958: 8c T29,23: PRINT
"(1 - ";NS;")": NORMAL : 8c Tl,23: INPUT
"SELECIONE N# DA FIG.: ";At: IF VAL (At)
= 0 THEN 3100
3900 A = VAL (At): IF A < = 0 OR A > NS THEN
3880 z
3920 XDRAW Nl AT X3 ,Y3;N1 = A: GOTO 3100
3940 IF Al = X THEN 4020
3960 IF Bl =■ Y THEN 4000
3980 GOTO 1150
4000 CDLOR= C: HLIN Al ,X AT Bl: GOTO 1150
4020 CDLOR= C: VLIN Bl ,Y AT Als GOTO 1150
4040 8c Ls GOTO 1150
4060 8c R: GOTO 1150
4080 8c U: GOTO 1150
4100 8c Ds GOTO 1150
132 Jogos de Ação para o Apple

6000 GOSUB 9200: HOME :RN = Os SCALE= 1


6020 POKE 230,32: CALL 62450: 1POKE - 16297,
0: ROT= RN:XP = 40
6040 IF RN = 0 OR RN > 40 THEN XP = 0
6060 IF RN = 8 OR RN = 40 THEN XP = 20
6080 HCOLOR= 3: DRAW 1 AT XP + 0,108: DRAW
1 AT XP + 1,58
6100 HCOLDR= 1: DRAW 1 AT XP + 55,108: DRAW
1 AT XP + 56,58
6120 HCOLOR- 2: DRAW 1 AT XP + 111,108: DRAW
1 AT XP + 110,58
6140 HCOLDR= 5: DRAW 1 AT XP + 165,108: DRAW
1 AT XP + 166,58
6160 HCOLOR= 6: DRAW 1 AT XP + 221,108: DRAW
1 AT XP + 220,58
6180 & Tl,21: INVERSE : PRINT "BRANCO"; : NORMAL
: PRINT ” VERDE H «9 : INVERSE : PRINT
"VIOLETA”;: NORMAL : PRINT " VERMELHO ";
: INVERSE : PRINT "AZUL": NORMAL
6200 PRINT "ORIGEM DAS FIGS. ACIMA: VALOR INVERSE
: PRINT "FAR";: NORMAL : PRINT " DE X"
: PRINT "GRIG. DAS FIGS. ABAIXO: VALOR
INVERSE : PRINT "IMPAR";: NORMAL
: PRINT " DE X”;
6220 INVERSE : PRINT NORMAL : PRINT
INVERSE : PRINT NORMAL :
PRINT ROT = ";: INVERSE : PRINT RN;
: NORMAL : CALL - 868: 8c T24,24: PRINT
“< ESPACO > RETORNA";
6240 KB = PEEK ( - 16384): IF KB < 136 THEN
6240
6260 POKE “ 16368,0: IF KB = 160 THEN 6420
6280 IF KB =136 THEN RN = RN + 56: IF RN >
56 THEN RN = RN - 64: GOTO 6020
6300 1T r_
Í KB = 136 THEN 6020
6—20 IF KB = 149 THEN RN = RN + 8: IF RN =
64 THEN RN = 0: GOTO 6020
6340 IF KB =149 THEN 6020
6360 IF KB = 198 THEN FS = ABS (FS - 1): POKE
- (16301 ■4- FS) ,0: GOTO 6240
6380 IF KB = 210 THEN RN = 0: GOTO 6020
64.00 GOTO 6240
6420 POK E - 162'98,0: POKE - 16301,0: GOTO
a n 00
Editor de Tabela dè Figuras 133

70Q0 HÓTJE : & Tl,22: PRINT "APAGAR A TELA?


(8/N) -/GOSUB 7080: GET AS: PRINT AS
7020 IF ÀS = "N" THEN 1000
7040 IF AS = "S" THEN GR : GOTO 1000
7060 GOTO 7000.
7080 PRINT CHRS - (7);: RETURN
8000 ONÇRR GOTO 8020
S0Í0 GOTO? 8090
8020 PRINT CHRS (7); HOME : & Tl,10: INVERSE
a>PRINT "ERRO";: NORMAL :PE = PEEK
<522)
8030 IF PE = 9 THEN PRINT " : DISCO CHEIO":
GOTO 8080
8040 IF' PE = 10 THEN PRINT " : ARQ. TRAVADO":
' GOTO 8080
8050 IF PE = 6 THEN PR IN’ " : NAO HA ARQ.":
GOTO 8080
8060 IF PE = 8 THE# PRINT " : ERRQ E/S":
GOTO 80Ô0
8070 IF PE = .4 JHEN. PRINT " : DISCO PROTEGIDO If

•terror 8080.
8080 PRINT : PRINT "ERRO #" ;PE;". VERIFIQUE
S£U MANUAL PRODOS": & Tl,18: PRINT
" TECLE ALGP P/ CONTINUAR: "jf: GET
AS: PRINT AS: GOTO 8100
8090 GÜSUB 9200'
8100 HIMEM:..30975: TEXT : HOME ; & C40: INVERSE
: PRINT ", CQMANDQ DOS ": NORMAL
8110 GqSÚB 9120
8120 St TÍ,5: PRINT ; PRINT : HTAB 2: INVERSE
i PRINT ”P.";x NORMAL : PRINT " : PREFIXO
íCORRENTE: /";PRS;")"
8130 PRINT- : HTAB 2: INVERSE : PRINT "C"; :
NORMAL : PRINT " : CATALOGAR (POR DRIVE
DU_-.PREFI.XO) "
8140 PRINT-: HT-AB 2s • INVERSE PRINT "L";:
NORMAL : PRINT " : CARREGAR UM ARQUIVO DE
FIGURAS"-
8150 PRINT ; HTAB 2: INVERSE : PRINT "S";:
NORMAL : PRINT " : GRAVAR ARQUIVO DE FIGS.
DA MEMÓRIA"
8160 PRINT : HTAB 4: PRINT "<- TECLE UMA LETRA
ESPAÇO >■RETORNA"; : HTAB 2: GET AS:
PRINT AS
134 Jogos de Ação para o Apple

3170 IF At = CHRt (13) OR At = " " THEN 8480


si ao IF At = ,!P" THEN 8240
Si 90 HIMEM: 38400
8200 IF At = "C" THEN 8270
8210 IF At = "L” THEN 8370
32*7 n IF At = "S” THEN 8490
8230 GOTO 8100
8240 TEXT : HOME : 8c Tl,5: INPUT "PREFIXO/";
At: IF At = "" THEN 8100
8250 PRINT CHRt (4);"PREFIX/";At
8260 PRt = At: GOTO 8100
8270 HOME : INVERSE : Sc 040i PRINT " CATALOGAR
NORMAL : POKE 34,3
8280 8c Tl,5: PRINT "CATALOGAR POR DRIVE OU PREFIXO?
(D/P) GET At: PRINT M
8290 IF At = "D" THEN 8320
8300 IF At < > "P" THEN 8100
8310 & Tl,5: CALL - 958: PRINT CHRt (4);"CAT/";
PRt: GOTO 8340
8320 PRINT : PRINT "GOAL DRIVE? (1/2) ";:
GET At: PRINT At: IF At < "1" OR At >
"2" THEN 8270
8330 DDt = At: 8c T1,5:.CALL - 958: PRINT CHRt
(4);"CAT,D”DDt
8340 PRINT : INPUT "COMANDO DOS: ";At: IF At
= "" THEN PRINT CHRt (4) ; "PREFIX'/";
FRt: GOTO 8100
8350 PRINT CHRt (4);At
8360 GOTO 8340
8370 HOME : 8c Tl,5: & C40: INVERSE : PRINT
"CARREGAR AROUIVO DE FIGURAS DO DISCO": NORMAL
: VTAB 20: PRINT "TÉCLE <RETURN> P/ SAIR":
PRINT : PRINT "DRIVE CORRENTE E /";PRt
8380 IF NS > O THEN 8,. T1,1’5: FLASH : 8c C40:
PRINT "AVISO!": NORMAL : 8c C40: PRINT
"ARQUIVO NA MEMORIA SERA DESTRUÍDO!"
8390 VTAB 13: INPUT "NOME DO ARQUIVO: ";Ft
8400 IF Ft = "" THEN 8100
8410 PRINT CHRt (4);"ELOAD/";PRt;"/";Ft;",
A";FILE
8420 LF = PEEK (FILE) * 2 + FILE:LF = PEEK
(LF) + PEEK (LF + 1) * 256 + FILE
8430 FOR I = LF TO 38400: IF PEEK (I) =0
THEN 8450
8440 NEXT I:NS = 0: GOTO 3000
Editor de Tabela de Figuras 135

3450 LF = I - FILE + 1
5460 SF = FILE:EA = LF + SF - 1':
S470 POKE 216,0:Nl = 1: GR :NS = PEEK (SF):
NF = 1: GOTO 3080
8480 HOME : GR : POKE 34,20: GOSUB 9220: POKE
216,0: GOTO 1000
8490 HONE : & T1.5: & 040: INVERSE : PRINT
"GRAVAR ARQUIVO DE FIGURAS P/ 0 DISCO"
: NORMAL : Zt Tl,20: PRINT "TECLE <RETURN> P/
SAIR": PRINT : PRINT "DRIVE CORRÉNTE E /";PR$
8500 IF NS = 0 THEN & Tl,13: & C40: FLASH
: PRINT " NAO POSSO GRAVAR! ": NORMAL :
PRINT : & C40: PRINT "NAO HA FIGURA NO
ARQUIVO!";: INPUT " ";F$:F$ *= "":
GOTO 8520
8510 & Tl,13: INPUT "NOME DO ARQUIVO: ";Fí
3520 IF F$ = "" THEN 8100
8530 PRINT CHRS (4);"BSAVE/";PRS;"/";F$;",
A";SF;",L";LF
8540 GOTO 8100
9000 CC = CC + 1: IF CC = 1 THEN Cl = SCRN ( I
X,Y): COLOR= 15: PLOT X,Y:XO = X:YO =
Y
9020 RETURN
9040 COLOR= Cl: IF CC = CL - C2 THEN PLOT
XO,YO
9060 IF CC = CL THEN CC = 0
9080 RETURN
9100 COLOR= Cl: PLOT XD,YD:CC = O: RETURN
9120 & Tl,21: CALL - 958: INVERSE : & C40:
PRINT " STATUS DO ARQUIVO DE FIGURAS ":
NORMAL
9140 PRINT "N# DE FIGURAS:";: INVERSE1:
PRINT NS;: NORMAL : HTAB 26: PRINT "(MAX
255) "
9160 PRINT "COMPRIM. DO ARQ.:";; INVERSE :
PRINT LF;: NORMAL : HTAB 26: PRINT "(MAX
6820)": RETURN
9200 A = PEEK (6):B = PEEK (7): POKE 6,40:
POKE 7,40: CALL SC:ES » FN P(6): POKE
6,A: PDKE 7,B:LN = ES - SHAPE + 1: RETURN
9220 A = PEEK (25):B = PEEK (26): POKE 25,
0: POKE 26,17: CALL VD: POKE 25,A: POKE
26,B: RETURN
136 Jogos de Ação para o Apple

1000Ó HOME : GOSUB 7080: & TI,23: PRINT "SAIR


DO EDITOR? (S/N) " ; : GOSUB 7080:
GET AT: PRINT AT
10020 IF AT = "S" THEN TEXT : HOME : POKE 2048,
0: POKE 103,1: POKE 104,8: NEW
10040 GOTO 1000
11000 HDME : & Tl,22; FLASH : PRINT "APAGAR";
; NORMAL : PRINT " APENAS ESTA FIGURA? (S/N)
GOSUB 7080: GET AT: IF AT = "S" THEN
1’1100
11020 IF AT = ” " OR AT = CHRT (13) THEN 3100
11040 IF AT = "N" THEN HOME : GOSUB 7080: St
Tl,22: FLASH : PRINT "APAGAR";: NORMAL
: PRINT " TODO O ARQUIVO? (S/N) ";
: GOSUB 70B0: GET AT: IF AT = "N"
THEN 3100
11060 IF AT = "S" THEN HGR :SF = O:NS = O:EA
= O:LF = Os GOTO 3020
11080 GOTO 3100
11100 I = 2 * N1 + SF:L = SF + FN P(I):I = 2
* (N1 + 1) + SF:AD = SF + FN P(I):EN
= EA
11120 IF N1 = NS THEN AD = EA: GOTO 11160
11140 & MAD,EN,L
11160 LE = AD - L
11180 IF N1 = 1 THEN 11260
11200 A = SF + 2:E = SF + N1 * 2 - 2:N = E -
A + 1
11220 & MA,E + 1,A + 2
11240 St SA + 2,E + 2,2
Í1260 NS = NS - 1:SF = SF + 2: POKE SF,NS: POKE
SF + 1,0
11280 IF N1 > NS THEN 11340
11300 A = SF + 2 * N1:E = SF + 2 * NS
; 11320 St SA,E,LE + 2
11340 IF NS = 0 THEN HGR : NF = O:LF « 0:SF
= O:EA = 0: GOTO 3020
11360 IF N1 > NS THEN N1 = NS
11380 LF = LF - LE - 2:EA = EA - LE
11400 GOTO 3080
Editor de Tabela de Figuras 137

Listagem 12.2: AMPER.ASE

1 ***********************************************
2 *
3 * AMPER.ASE
4 *
5 * By S. Scott Zimmerman
6 *
7 * Copyright (c) 1985
8 * Computer Expressions
9 * 1129 East 470.North
10 ★ Orem, Utah 84057
11 ★
12 * Assembler: Merlin
13 ★
14
15
16 ORG $1C00
17
18 ***********************************************
19 * Variable and constant:
20
21
22 ROWNUM EQU 7
23 NCHAR EQU 9 ■
24 ROW EQU $1F
25 SCRNEND = $27 ;End of row or column
26
27 ★★************ ★*★★*★*****★★★★***★****★**★★*★★★★
28 * Monitor & Applesoft locations
29 ★**********************************************
30
31 CH EQU $24
32 AIL EQU $3C
33 A1H EQU $3D
34 A2L EQU $3E
35 A2H EQU $3F
36 A4L EQU $42
37 A4H EQU $43
38 LINNUM EQU $50
39 CHRGET EQU $B1
40 TXTPTR EQU $B8
41 AMPER EQU $3F5
42 ERROR EQU $D412
43 FRMEVL EQU $DD7B
44 GETADR EQU $E752
45
46 PLOT EQU $F800
47 SETCOL EQU $F864
48 SCRN EQU $F871
.49
50 GETBYTC EQU $E6F5
138 Jogos de Ação para o Apple

51 COMBYTE EQU $E74C


52 TABV ÊQU $FB5B
53 MOVE EQU $FE2C
54
55 **************************************************
56 * MACROS j ★
57 **************************************************
58
59 DECR MAC
60 LDA ]1
61 BNE ND
62 DEC ] 1+1
63 ND DEC ]1
64 <<<
65
66 COMPARE MAC
67 LDA U
68 CMP ]2
69 LDA 11+1
70 SBC ] 2+1
71 <<<
72
73 **************************************************
74 * Initialization: *
75 **************************************************
76
1C00: A9 4C 77 LDA #$4C /’JMP' opcode
1C02: 8D F5 03 78 STA AMPER
1C05: A9 10 79 LDA #<START /Set JMP to START
1C07: 8D F6 03 80 STA AMPER+1
1C0A: A9 IC 81 LDA #>START
1C0C: 8D F7 03 82 STA AMPER+2
1C0F: 60 83 RTS
84
85 **************************************************
86 * Start of mai n program: *
87 **************************************************
88
89 START
90 4
91 * Check scroll direction:
92
1C10: C9 55 93 CMP # '4J' ;Scroll up?
1C12: D0 03 94 BNE DIRECTN1 ;No, go check next dir
1C14: 4C 54 IC 95 JMP UPSCROLL ;Go scroll up
1C17: C9 44 96 DIRECTN1 CMP #’D’ /Scroll down?
1C19: D0 03 97 BNE DIRECTN2 /No, go chekc next dir
1C1B: 4C 9A IC 98 JMP DOWNSCLL /Go scrool down
1C1E: C9 52 99 DIRECTN2 CMP #'R' /Scroll right?
1C20: D0 03 100 BNE DIRECTN3 /No, go-check last dir
1C22: 4C DE IC 101 JMP RIGHTSCL ;Go scroll right
1C25: C9 4C 102 DIRECTN3 CMP #'L' /Scroll left?
Editor de Tabela de Figuras 139

1C27: D0 03 - 103 BNE TABSPEC ;No, check if TAB


1C29: 4C 1D 1D 104 JMP LEFTSCLL ;Go scroll right
1C2C: C9 54 105 TABSPEC CMP #’T’ ;Tab?
1C2E: D0 03 106 BNE CENTSPEC ;No, check if CENTER
1C30: 4C 5E 1D 107 JMP TAB ;Yes, go to TAB
1C33: C9 43 108 CENTSPEC CMP #’C’ ;Center?
1C35: D0 03 109 BNE MEMSPEC ;No, check memory move
1C37: 4C 6C 1D 110 JMP CENTER ;Yes, go center
1C3A: C9 4D 111 MEMSPEC CMP #'M’ ;Memory move?
1C3C: D0 03. 112 BNE ADD2RNG ;Check if add to range
1C3E: 4C AB 1D 113 JMP MEMMOVE ;Go move memory
1C41: C9 41 114 ADD2RNG CMP f’A’ ;Add to range?
1C43: D0 03 115 BNE SUBRNG ;No, check subtract rng
1C45: 4C F7 1D 116 JMP ADD ;Go add to range
1C48: C9 53 117 SUBRNG CMP #'S’ ;Subract from range?
1C4A: D0 03 118 BNE WRONGIN ;No, wrong input
1C4C: 4C 28 1E 119 JMP SUB ;Go subtract
1C4F: A2 35 >120 WRONGIN LDX #53 ;Get 'ILLEGAL QUANT' err
1C51: 4C 12 D4 121 JMP ERROR ;Exit thru Aplsoft rtn
122
123 ★★**★*★★*★*★*★*****★*★*★★***★*★★*★***★***★**★*★★**
124 * Scroll the Lo-Res screen UP: *
125
126
1C54: 20 BI 00 127 UPSCROLL JSR CHRGET ;Set TXTPTR past & call
128
129 * Store the top row in the buffer:
130
1C57: A0 27 131 LDY #SCRNEND ;Get the number of cols
1C59: A9 00 132 LDA #0 ;Set the row
1C5B: 20 71 F8 133 SAVETOP JSR SCRN ;Get color of the dot
1C5E: 99 8D 1E 134 STA BUFFER,Y /Store COLOR in buffer
1C61: A9 00 135 LDA ' #0 ;Set the zeroeth row
1C63: 88 136 DEY / ;Move to the next column
1C64: 10 F5 137 BPL SAVETOP ;Not $FF yet, keep going
138
139 * Mové 1the dots up one on screen
140
1C66: A0 27 141 LDY #SCRNEND /•Initialize the column
1C68: A9 01 142 LDA #1 /•Initialize the row
1C6A: 85 1F 143 STA ROW
144
1C6C: 20 71 F8 145 UPSLOOP JSR SCRN ;What color is there?
1C6F: 20 64 F8 146 JSR SETCOL ;Set the color 1
1C72: A5 1F 147 LDA ROW ;Get the row value
1C74: 38 148 SEC ;Go up one row
1C75: E9 01 149 SBC #1 ; by subtracting one
1C77: 20 00 F8 150 JSR PLOT ;Plot the point
1C7A: A5 1F 151 LDA ROW /•Restore origin row val
1C7C: 88 152 DEY ;Next lower column
1C7D: 10 ED 153 BPL UPSLOOP ;Go back until COL=»$FF
154
140 Jogos de Ação para o Apple

1C7F: A0 27 155. LDY fSCRNEND


1C81: E6 1F 156 INC ROW ;Drop down one row
1C83: A5 1F 157 LDA ROW ;Get the new row val
1C85: C9 28 158 CMP ISCRNEND+l /Is it past the bottom?
1C87: 90 E3 159 BCC UPSLOOP ;Go loop again
160
161 * Restore top line to the bottom:
162
1C89: A0 27 163 LDY fSCRNEND
1C8B: B9 8D 1E 164 T0P2B0T LDA BUFFER,Y ;Get the color
1C8E: 20 64 F8 165 JSR SETCOL ;Set it for plot
1C91: A9 ?7 166 LDA fSCRNEND ;Set bottom row
1C93: 20 00 F8 167 JSR PLOT ;And plot the color
1C96: 88 168 DEY /Go to next left column
1C97: 10 F2 169 BPL TOP2BOT ;Still >« zero?
170
1C99: 60 171 RTS ;End of scroll UP
172
173 it*************************************************
174 * Scroll the Lo-Res screen DOWN: *
Í75 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
176 -
1C9A:. 20 BI 00. 177 DOWNSCLL JSR CHRGET ;Set TXTPTR past & call
178
179- ★ Store the bottom row in the buffer:
180
1C9D: A0 27 181 LDY #SCRNEND ;Get the number of cols
1C9F: A9 27 182 LDA fSCRNEND ;Set the row
1CA1: 20 71 F8 183 SAVEBOT JSR SCRN ;Get color of the dot
1CA4: 99 8D 1-E 184 STA BUFFER,Y /Store COLOR in buffer
1CA7: A9 27 185 LDA #SCRNEND ;Set the top row
1CA9: 88 186 DEY ;Move to the next column
1CAA: 10 F5 187 BPL SAVEBOT /Not $FF yet/ keep going
188
189 * Move the dots down one on screen
190
1CAC: A0 27 19-1 LDY #SCRNEND /Initialize the column
1CAE: A9 26 192 LDA #SCRNEND-1 /Initialize the row
1CB0: 85 1F 193 STA ROW
194
1CB2: 20 71 F8 195 DWNLOOP JSR SCRN ;What color is there?
1CB5: 20 64 F8 196 JSR SETCOL ;Set the color
1CB8: A5 1F 197 LDA ROW ;Get the row value
1CBA: 18 198 CLC /Go down one row
1CBB: 69 01 199 ADC #1 ; by adding one
1CBD: 20 00 F8 200 J.SR PLOT /Plot the point
1CC0: A5 1F 201 LDA ROW /Restore orig row val
1CC2: 88 202 DEY /Next lower column
1CC3: 10 ED 203 BPL DWNLOOP /Go back until COL=$FF
204
1CC5: A0 27 205 LDY #SCRNEND
1CC7: C6 1F 206 DEC ROW /Move up one row
Editor de Tabela de Figuras 141

1CC9: A5 IF 207 LDA ROW /Get the new row val


1CCB: 10 E5 208 BPL DWNLOOP /Go loop again

210
211 * Restore bottom line to the top:
212
1CCD: A0 27 213 LDY fSCRNEND
1CCF: B9 8D 1E 214 B0T2T0P LDA, BUFFER,Y /Get the color
1CD2: 20 64 F8 215 JSR^ SETCOL ;Set it for plot
1CD5: A9 00 216 LDA #0 ;Set top row
1CD7: 20 00 F8 217 JSR PLOT ;And plot the color
1CDA: 88 218 DEY ;Go to next left column
1CDB: 10 F2 219 BPL BOT2TOP ;Still >- zero?
220
1CDD: 60 221 RTS /End of scroll DOWN
222
223 **************************************************
224 * Scroll the Lo-Res screen RIGHT: *
225 **************************************************
226
1CDE: 20 BI 00 227 RIGHTSCL JSR CHRGET
'v 228
1CE1: A0 27 229 LDY fSCRNEND
1CE3: A2 27 230 LDX fSCRNEND ;Get the row index
1CE5: 8A 231 TXA
1CE6: 20 71 F8 232 SAVERIT JSR SCRN
1CE9: 9D 8D 1E 233 STA BUFFER,X
1CEC: CA 234 DEX ;Gc up one row
ICED: 8A 235 TXA /Put row in accumulator
1CEE: 10 F6 236 BPL SAVERIT /Not $FF so continue
237
238 f Move the dots right one on screen:
239
1CF0: A0 26 240 LDY fSCRNEND-1 ;Set to next-to-last col
1CF2: A2 27 241 LDX fSCRNEND ;Set to last row
1CF4: 8A 242 TXA ;Put row in accum
243
1CF5: 20 71 F8 244 RITLOOP JÇR SCRN
ÍCF8: 20 64 F8 245 JSR SETCOL
1CFB: C8 246 ÍNY /Go right a column
1CFC: 8A 247 TXA /Restore the row
1CFD: 20 00 F8 248 JSR PLOT
1D00: 88 249 DEY /Restore original column
1D01: CA 250 DEX /Move up to next row
1D02: 8A 251 TXA ;Put row in accum
1D03: 10 F0 252 BPL RITLOOP /Loop if row not < 0
253
1D0S: A2 27 254 LDX fSCRNEND /Reset last row
1D07: 8A 255 TXA
1D08: 88 256 DEY /Go left a column
1D09: 10 EA 257 BPL RITLOOP /#eep goin if ndt < 0
258
142 Jogos de Ação para o Apple

259 * Restore right line to left:


260
1D0B: A2 27 261 LDX fSCRNEND ;Set row to bottom
1D0D: A0 00 262 LDY «0 ;Set to far left column
1D0F: BD 8D IE 263 RIT2LEF LDA BUFFER,X ;Get color
1D12: 20 64 F8 264 JSR SETCOL ;Set for plot
1D15: 8A 265 TXA ;Set the current row
1D16: 20 00 F8 266 JSR PLOT ;And plot the color
1D19: CA 267 DEX ;Move up a row
1D1A: 10 F3 268 BPL RIT2LEF ;Still <= zero
269
1D1C: 60 270 RTS ;End of scroll RIGHT
271
272
273 * Scroll the Lo-Res screen LEFT: *
274 **************************************************
275
1D1D: 20 Bl 00 276 LEFTSCLL JSR CHRGET
277
1D20: A0 00 278 LDY #0 ;lst column
1D22: A2 27 279 LDX #SCRNEND ;Get the row index
1D24: 8A 280 TXA
1D25: 20 71 F8 281 SAVELEF JSR SCRN
1D28: 9D 8D IE 282 STA BUFFER,X
1D2B: CA 283 DEX ;Go up one row
1D2C: 8A 284 TXA ;Put row in accumulator
1D2D: 10 F6 285 BPL SAVELEF ;Not $FF so continue
286
287 * Move the dots left one on screen:
288
1D2F: A0 01 289 LDY #1 ;Set to second column
1D31: A2 27 290 LDX fSCRNEND ;Set to last row
1D33: 8A 291 TXA ;Put row in accum
292
1D34: 20 71 F8 293 LEFLOOP JSR SCRN
1D37: 20 64 F8 294 JSR SETCOL
1D3A: 88 295 DEY ;Go left a column
1D3B: 8A 296 TXA ;Restore the row
1D3C: 20 00 F8 297 JSR PLOT
1D3F: C8 298 INY /Restore original column
1D40: CA 299 DEX ;Move up to next row
1D41: 8A 300 TXA ;Put row in accum
1D42: . 10 F0 301 BPL LEFLOOP ;Loop if row not < 0
302
1D44: A2 27 303 LDX #SCRNEND /Reset last row
1D46: 8A 304 TXA
1D47: C8 305 INY ;Go right a column
1D48: C0 28 306 CPY #SCRNEND+1 ;Is it past rigth col?
1D4A: 90 E8 307 BCC LEFLOOP ;#eep going if not < 0
308
309 * Restore left line to right:
310
Editor de Tabela de Figuras 143

1D4C: A2 27 311 LDX fSCRNEND ;Set row to bottom


1D4E: A0 27 312 LDY fSCRNEND ;Set to far right column
1D50: B0 8D 1E 313 LEF2RIT LDA BUFFER,X /Get color
1D53: 20 64 F8 314 JSR SETCOL /Set for plot
1D56: 8A 315 TXA ;Set the current row
1D57: 20 00 F8 316 JSR PLOT ;And plot the color
1D5A: CA 317 DEX /Move up a row
1D5B: 10 F3 318 BPL LEF2RIT ;Still <= zero
319
1D5D: 60 320 RTS /End of scroll RIGHT
321
322 **************************************************
323 * TAB the cursor: *
324 **************************************************
325
1D5E: 20 F5 E6 326 TAB v JSR GETBYTC ;Eval expression of HTAB
1D61: CA 327 DEX /Make range 0-39
1D62: 86 24 328 STX CH /Store in mon HTAB loc
1D64; 20 4C E7 329 JSR COMBYTE /Eval expresn for VTAB
1D67: CA 330 DEX /Make range 0*23
1D68: 8A 331 TXA /Put in accum for TABV
1D69: 4C 5B FB 332 JMP TABV /Go tab the cursor
333
334 ★i************************************************
335 * CENTER printing-:, *
336 it************************* ******** ***** *****
337
1D6C: 20 F5 E6 338 CENTER JSR GETBYTC /Evaluate expression for
1D6F: 86 07 339 STX ROWNUM ; f of Ohars/line & save
1D71: A9 00 340 LDA f0 /Zero the print chars
1D73: 85 09 341 STA NCHAR /The no. chars in string
1D75: A0 .01 342 LDY • fl /Init the search index
343
1D77: BI B8 344 PRINTST LDA (TXTPTR),Y /Get byte val from prgm
1D79: C8 345 INY /Incr to next character
1D7A: C9 22 346 CMP f’"' /Is it a quote mark?
1D7C: D0 F9 347 BNE PRINTST /No, go get next char
348
1D7E: BI B8 349 STRCOUNT LDA (TXTPTR)fY /Yes, so count chars
1D80: C8 350 INY /Go to next character
1D81: C9 22 351 CMP f1" • / Is it a quote?
1D83: F0 09 352 BEQ ENDSTRNG /Yes, ènd of string
1D85: C9 20 353 CMP f$20 /Is it a control char?
1D87: 90 02 354 BCC CTRL /Yes, so no incr count
1D89: E6 09 355 INC NCHAR /Increase char count
1D8B: 4C 7E 1D 356 CTRL JMP STRCOUNT /Go check next character
357
1D8E: BI B8 358 ENDSTRNG LDA (TXTPTR),Y /Get the next character
1D90: C8 359 INY /Go to next character
1D91: C9 3B 360 CMP f’ / ’ /Is it a semicolon?
1093: D0 02 361 BNE CALTAB /No, so go tab
1D95: F0 E0 362 BEQ PRINTST /Yes, sb go back
144 Jogos de Ação para o Apple

363 *
364 * Calculate the proper tab for centering
365 ★
1D97: 38 366 CALTAB SEC /Calc difference between
1D98: A5 07 367 LDA ROWNUM ; the no. chars per row
1D9A: ES 09 368 ’ SBC NCHAR ; and no. chars in strg
1D9C: 4A 369 LSR /Divide the result by 2
1D9D: 85 24 370 STA CH /Stuff into mon HTAB val
1D9F: A5 07 371 LDA ROWNUM /Check if 20 chars/row
1DA1: C9 14 372 CMP #20 /Is it 20?
1DA3: D0 05 373 BNE END /No, so go to the end
1DA5: A5 24 374 LDA CH /Yes, so "undivide" by 2
1DA7: 0A 375 ASL / i.e., multiply by 2
1DA8: 85 24 376 STA CH / since chars twice wide
1DAA: 60 377 END RTS
378
379 **************************************************
380 * MOVE memory: *
381 **************************************************
382
1DAB: 20 59 1E 383 MEMMOVE JSR GETPARM /Get the input parms
384
385 >>> COMPARE. A1L/A4L
1DAE: A5 3C 385 LDA AIL
1DB0: C5 42 385 CMP A4L
1DB2: A5 3D 385 LDA A1L+1
1DB4: E5 43 385 SBC A4L+1
385 <<<
1DB6: 90 05 386 BCC MOVEIT /If up, no use MON rtn
387
1DB8: A0 00 388 LDY #0 /MOVE needs Y=0
1DBA: 4C 2C FE 389 JMP MOVE /Exit thru monitor rtn
390
1DBD: 38 391 MOVEIT SEC /Calculate new end adrs
1DBE: A5 3E 392 LDA A2L
1DC0: E5 3C 393 SBC AIL’'
1DC2: 48 394 PHA
1DC3: A5 3F 395 LDA A2H
1DC5: E5 3D 396 SBC A1H
1DC7: AA 397 TAX /Save HOB in X
1DC8: 18 398 CLC
1DC9: 68 399 PLA
1DCA: 65 42 400 ADC A4L
1DCC: 85 42 401 STA A4L
IDCg: 8A 402 TXA
1DCF: 65 43 403 ADC A4H
1DD1: 85 43 404 STA A4H
405
1DD3: A0 00 406 LDY #0 /Set the dummy variable
1DD5: Bl 3E 407 MVLOOP LDA (A2L),Y /Get old location, top
1DD7: 91 42 408 STA (A4L),Y /Store at new location
409 >>> COMPARE. A1L/A2L
Editor de Tabela de Figures 145

1DD9: A5 3C 409 LDA AIL


1DDB: C5 3E 409 CMP A2L
1DDD: A5 3D 409 LDA A1L+1 1
1DDF: E5 3F 409 SBC A2L+1
409 <<<
1DB1: B0 13 410 BCS MVEND ;Quit if end ,
411 >>> DECR.A2L ;Go to- next lower byte
IDE 3: A5 3E 411 LDA A2L
IDE 5: D0 02 411 BNE ND
1DE7: C6 3F 411 DEC A2L+1
IDE 9: C6 3E 411 ND DEC A2L )
411 <<<
412 >>> DECR.A4L ; in new and old loctns
1DEB: A5 42 412 LDA A4L
1DED: 00 02 412 BNE ND
IDEFs C6 43 412 DEC A4L+1
1DF1: C6 42 412 ND DEC A4L
412 <<<
IDF 3: B8 413 CLV jTo force a loop
IDF 4: 50 DF 414 BVC MVLOOP {Always
di ç
*S JL □
10^6: 60 416 MVEND RTS {End of MEMMOVE subrtn
417 •l

418 **************************************************
419 * ADD a constant to a range of memory: *
420 **********************************************
421
IDF 7: 20 59 IE 422 ADD JSR GETPARM {Get the input data
1DFA: A0 00 423 ADDLOOP LDY «0 {Zero the dummy var
1DFC: 18 424 CLC {Prep for addition
1DFD: Bl 3C 425 LDA (A1L),Y {Get the LOB
1DFF: 65 42 426 ADC A4L {Add LOB
1E01: 91 3C 427 STA (AIL) ,Y {Store the result
1E03: C8 428 INY {Go to the next byte
1E04: Bl 3C 429 LDA (A1L),Y {Get the HOB
1E06: 65 43 430 ADC A4H {Add the HOB
1E08: 91 3C 431 STA (A1L),Y {and store
1E0A: 18 432 CLC {Increment by two
1E0B: A5 3C 433 LDA AIL
1E0D: 69 02 434 ADC «2
1E0F: 85 3C 435 STA AIL
1E11: A5 3D 436 LDA A1H
1E13: 69 00 437 ADC #0
1E15: 85 3D 438 STA A1H *
1E17: A5 3C 439 LDA AIL ,-Are we done?
1E19: C5 3E 440 CMP A2L
IE IB: A5 3D 441 LDA A1H
1E1D: E5 3F 442 SBC A2H
1E1F: 90 D9 443 BCC ADDLOOP
1E21: A5 3C 444 LDA AIL {Are they equal?
1E23: C5 3E 445 CMP A2L
1E25: F0 D3 446 BEQ ADDLOOP {Not equal,so loop again
146 Jogos de Ação para o Apple

1E27: 60 447 RTS ;Done ADD


448
449 ******************************* * * *****************
450 * SUBtract a constant from memory range: *
451 **************************************************
452
1E28: 20 59 IE 453 SUB JSR GETPARM /Get the input data
1E2B: A0 00 454 SUBLOOP LDY #0 ;Zero the dummy var
IE 2D: 38 455 SEC ;Prep for subtraction
1E2E: Bl 3C 456 LDA (A1L),Y /Get the LOB
1E30: E5 42 457 SBC A4L /Add LOB
1E32: 91 3C 458 STA (A1L),Y /Store the result
1E34: C8 459 INY /Go to the next byte
1E35: Bl 3C 460 LDA (A1L),Y ;Get the HOB
1E37: E5 43 461 SBC A4H /Add the HOB
1E39: 91 3C 462 STA (A1L),Y ;and store
1E3B: 18 463 CLC ;Increment by two
1E3C: A5 3C 464 LDA AIL
1E3E: 69 02 465 ADC #2
1E40: 85 3C 466 STA AIL
1E42: A5 3D 467 LDA A1H
1E44: 69 00 468 ADC #0
1E46: 85 3D 469 STA A1H
1E48: AS 3C 470 LDA AIL ;Are we done?
1E4A: C5 3E 471 CMP A2L
1E4C: A5 3D 472 LDA A1H
1E4E: $.5 3F 473 SBC Á2H
1E50: 90 D9 474 BCC SUBLOOP
1E52: A5 3C 475 LDA AIL /Are they equal?
1E54: C5 3E 476 CMP A2L
1E56: F0 D3 477 BEQ SUBLOOP /Branch again if equal
1E58: 60 478 RTS /Done ADD
479
480
481 **************************************************
482 * GETPARM subroutine: *
483 *******************************£******************
484
1E59: 20 Bl 00 485 GETPARM JSR CHRGET /Gobble the spec parm
IE SC: 20 7B DD 486 JSR FRMEVL /Evaluate first parm
1E5F: 20 52 E7 487 JSR GETADR /Get value from FÃC
1E62: A5 50 488 LDA LINNUM
1E64: 85 3C 489 STA AIL /Store starting LOB
IE 66: A5 51 490 LDA LINNUM+1
1E68: 85 3D 491 STA A1H /Store start HOB
492
1E6A: 20 Bl 00 493 JSR CHRGET /Get the delimiter (»)
1E6D: 20 7B DD 494 JSR FRMEVL /Evaluate second parm
1E70: 20 52 E7 495 JSR GETADR
1E73: A5 50 496 LDA LINNUM
1E75: 85 3E 497 STA A2L /Store itr
1E77: A5 51 498 LDA LINNUM+1
Editor de Tabela de Figuras 147

1E79: 85 3F 499 STA A2H /Store it also


500
1E7B: 20 Bl 00 501 JSR CHRGET /Gobble the delimiter
1E7E: 20 7B DD 502 JSR FRMEVL ;Evalute third parm
1E81: 20 52 E7 503 JSR getadR
1E84: A5 50 504 LDA LINNUM
1E86: 85 42 505 STA A4L /Save new value
1E88: A5 51 506 LDA LINNUM+1
1E8A: 85 43 507 STA A4H /Store it
1E8C: 60 508 1 RTS ;End of GETPARM subrtn
509
510 *
1E8D: 00 511 BUFFER DS 1 ;Buffer for wrap-around

—End assembly/ 654 bytes, Errors: 0


148 Jogos de Ação para o Apple

Listagem 12.3: LR.VECTOR.DRAW

x **************************************************
2 * *
3 * LO-RES VECTOR DRAW *
4 * ★
5 * By S. Scott Zimmerman *
6 * *
7 * Copyright (c) 1985 *
8 * Computer Expressions *
9 * 1129 East 470 North *
10 * Orem, Utah 84057 *
11 * ★
12 * Assembler: Merlin *
13 * *
14 ***************************************************
15
16 ORG $1F00 ;üp by HR screen
17
18 **************************************************
19 * Variables.: *
20 **************************************************
21
22 SHPBYTE EQU $19 ;1A Pointer to shape
23 GRPTR EQU $1B ;ic Pointer to GR screen
24 COLINDX EQU $1D /Index for the column
25
26 **************************************************
27 * Constants: *
28 **************************************************
29
30 UPCOL = $0C /Color green for hi box
31 LOCOL = $C0 ;Green for low box
32 DIMMAX = $27 ;Max line or column val
33
34 **************************************************
35 * Definition of MACRO: *
36 **************^***********************************
37
38 INCR MAC
39 INC ]1
40 BNE NC
41 INC ] 1+1
42 NC <<<
43
44 ************************* *************************
45' * Initialization: *
46 **************************************************
47
1F00: A5 19 48 LDA SHPBYTE ;Get and save values
1F02: 48 49 PHA ; so zero page worç’t be
1F03: AS 1A 50 LDA SHPBYTE+1 ; disturbed by prgm
Editor de Tabela de Figuras 149

1F05: 48 51 PHA
52
1F06: A2 00 53 LDX «0 /Zero the row index
1F08: 86 1D 54 STX COLINDX /Zero the column index
55
56 **************************************************
57 * Main Program: *
58 **************************************************
59
60 * Get and evaluate shape byte:
61
UX
1F0A: A0 00 62 SHPLOOP LDY x #0 ;Zero the dummy index
1F0C: BI 19 63 LDA (SHPBYTE), Y ;Get the shape byte
1F0E: F0 26 64 BEQ END ;Yes, so go end up prgm
65
1F10: 8D C9 1F 66 STÂ VECTVAL ;Save for later recall
1F13: 20 3D 1F 67 JSR EVALUATE /•Evalute 3 LSB’s
68
1F16: AD C9 1F 69 LDA VECTVAL ;Get byte value again
1F19: 4A 70 LSR ;Move to LSB locations
1F1A: 4A 71 LSR
1F1B: 4A 72 LSR
1F1C: 8D C9 1F 73 STA VECTVAL /•Store new shifted value
1F1F: 20 3D 1F 74 JSR EVALUATE /•Evaluate middle 3-bit
75
1F22: AD C9 1F 76 LDA VECTVAL ;Get byte value again
1F25: 4A 77 LSR ;Move to LSB locations
1F26: 4A 78 LSR
1F27: 4A 79 LSR
1F28: F0 03 80 BEQ NEXTBYT ;If it’s 0/ go to next
1F2A: 20 3D 1F 81 JSR EVALUATE /Evaluate 2 MSB’s
82
83 NEXTBYT >>> INCR.SHPBYTE ;It's zero, so ignore
1F2D: E6 19 83 INC SHPBYTE
1F2F: D0 02 83 BNE NC
1F31: E6 IA 83 INC SHPBYTE+1
83 NC <<<
1F33: 4C 0A 1F 84 JMP SHPLOOP / and cont to next byte
85
1F36: 68 86 END PLA /•Restore zero pg values
1F37: 85 IA 87 STA SHPBYTE+1
1F39: 68 88 PLA
1F3A: 85 19 89 STA SHPBYTE
1F3C: 60 90 RTS /End of program
91
92 **************************************************
93 * EVALUATE subroutine: *
94 **************************************************
95
1F3D: 48 96 EVALUATE PHA /Save the vector value
1F3E: 29 04 97 AND f%00000100 /Plot a dot?
1F40: F0 29 98 BEQ MOVE /No, go move vector
150 Jogos de Ação para o Apple

1F42: 8A 99 TXA /Get the X index


1F43: 48 100 PHA ;Save it
1F44: 4A 101 LSR ;Divide by 2
1F45: AA 102 TAX ;#ut back as index
1F46: BD 99 1F 103 LOA LRL0W,X /Get the row address
1F49: 85 1B 104 STA GRPTR
1F4B: BD Bi 1F 105 LOA LRHIGH,X
1F4E: 85 1C 106 STA GRPTR+1
1F50: 68 107 PLA ;Get back X value
1F51: AA 108 TAX ;Savae in X (row index)
1F52: A4 1D 109 LDY COLINDX /Get the proper column
1F54: 90 07 110 BCC UPPER ;Branch if upper nibble
1F56: A9 C0 111 LDA fLOCOL ;Get color for low nib
1F58: 8D CA 1F 112 STA COLOR ; and store it
1F5B: D0 07 113 BNE PLOT /Go plot (always)
114
1F5D; ,A9 0C 115 UPPER LDA #UPCOL ;Get color for hi nib
1F5F: 8D CA 1F 116 STA COLOR ; and store it
117
1F62: A9 CÀ 118 LDA #COLOR ;Get plotting color
1F64: BI 1B 119 PLOT LDA (GRPTR),Y ;Get what's there now
1F66:' 0D CA 1F 120 . ORA COLOR ;Keep one current nibble
1F69: 91 1B 121 STA (GRPTR),Y ;Do the screen plot
122
1F6B: 68 123 MOVE PLA. /Restore the vector val
1F6C: 4A 124 LSR /Move along X or Y?
1F6D: B0 11 125 BCS XMOVE /If LSB set, it's X move
126
127 * zMove in Y-•direction:
128
1F6F: 4A 129 LSR ;Move +Y or -Y?
1F70: 90 08 130 BCC ^NEG ;Go move -Y direction
X1 J71X
1F72: E8 132 INX ;X is row index (+Y)
1F73: E0 28 133 CPX #DIMMAX+1 /Is it past screen?
1F75: 90 08 134 BCC EVRTN /No, so go and return
1F77: A2 00 135 LDX #0. /Yes, so set X-0
1F79: 60 136 RTS ;Retrun from EVALUATE
137
1F7A: CA 138 YNEG DEX ;X is row index (-Y)
1F7B: 10 02 139 BPL EVRTN /If still plus, just RTS
1F7D: A2 27 140 LDX fDIMMAX /X was <0, so set to max
1F7F: 60 141 EVRTN RTS /Return from EVALUATE
142
143
144 ♦ Move in X-•direction:
145
1F80: 4A 146 XMOVE LSR /Move +X or -X?
1F81: B0 0D 147 BCS XNEG /Go move -X direction
148
1F83: E6 1D 149 INC COLINDX /Go to next column (+X)
1F85: A5 1D 150 LDA COLINDX /Get the column indx
Editor de Tabela de Figuras 151

1F87: C9 28 151 CMP #DIMMAX+1 ;Past right bourder?


1F89: 90 F4 152 BCC EVRTN ;No, so just return
1F8B: A9 00 153 LDA #0 ;X was >MAXr so set to 0
1F8D: 85 ID 154 STA COLINDX
1F8F: 60 155 RTS ;Return from EVALUATE
156
1F90: C6 ID 157 XNEG DEC COLINDX ;Go left one column (—X)
1F92: 10 EB 158 BPL EVRTN ;Not <0, so just return
1F94: À9 27 159 LDA #DIMMAX ;Yesr <0, to set to max
1F96: 85 ID 160 STA COLINDX
1F98: ■ 60 161 RTS /Return from EVALUATE
162
163
164 ★*************************************************
165 * Starti ng addresses of Lo-Res lines: *
166 **************************************************
167
1F99: 00 80 00 168 LRLOW DFB $00,$80,$00,$80,$00,$80,$00, $80
1F9C: 80 00 80 00 80
1FA1: 28 A8 28 169 DFB $28,$A8,$28,$A8,$28,$A8,$28, $A8
1FA4: A8 28 A8 28 A8
1FA9: 50 D0 50 170 DFB $50,$D0,$50,$D0,$50,$D0,$50, $D0
1FAC: D0 50 D0 50 D0
171
1FB1: 04 04 05 172 LRHIGH DFB $04,$04,$05,$05,$06,$06,$07,$07
1FB4: 05 06 06 07 07
1FB9: 04 04 05 173 DFB $04,$04,$05,$05,$06,$06,$07,$07
1FBC: 05 06 06 07 07
1FC1: 04 04 05 174 DFB $04,$04,$05,$05,$06,$06,$07, $07
1FC4: 05 06 06 07 07
175
1FC9: 00 176 VECTVAL DS 1 ;Temp storage of byte
1FCA: 00 177 COLOR DS 1 /Stores color for plot

—End assembly, 203 bytes, Errors: 0


152 Jogos de Ação para o Apple
k
Listagem 12.4: SHAPE.COMP

1 **************************************************
2 * *
3 * SHAPE.COMP *
4 * *
5 * By Mark A. Larson *
6 * *
7 * Copyright (c) 1985 *
8 * Computer Expressions ★
9 ★ 1129 East 470 North *
10 * Orem, Utah 84057 *
11 * *
12 * Assembler: Merlin *
13 * *
.14 **************************************************
15
16 ORG $0800
17 *
18 XDOTS EQU $6
19 BASVECT EQU $6
20 ENDADR EQU $6 ;2 BYTES
21 YDOTS EQU $7
22 MASVECT EQU $7
23 YMAX EQU $8
24 BYTEPOS EQU $9
25 ROWMARG EQU $18
26 SHAPE EQU $19 ;2 BYTES
27 XPOS EQU $1B
28 RESULT1 EQU $1C
29 RESULT2 EQU $1D
30 NSKIPS EQU $1E
31 SUBNUM EQU $1F
32 TEMP EQU $1F
33 R0W1LT EQU $F9
34 R0W1RT EQU $FA
35 R0W2LT EQU $FB
36 R0W2RT EQU $FC
37 MARGIN EQU $1000
38 MARGLOW EQU $02 ;MARGIN+2 (LOW)
39 MARGHI EQU $10 ;MARGIN+2 (HIGH)
40 SCRN EQU $F871
41 *
42 *
0800: A9 00 43 LDA #0
0802: 48 44 PHA ;SET Y-COORDINATE
0803: A8 45 TAY ;SET X-COORDINATE
0804: AA 46 TAX ;SET IND TO MARGIN TABLE
0805: 8D 00 10 47 STA MARGIN ;SET L MARG 1ST ROW TO 0
0808: 85 08 48 STA YMAX ;SET f 'ROWS TO 0
080A: F0 36 49 BEQ CLEARRT ;ALWAYS BRANCHES
50 *
Editor de Tabela de Figuras 153

51 *
080C 68 52 READDOT PLA ./READ Y-COORD
080D 48 53 PHA /PUT IT BACK
080E 20 71 F8 54 JSR SCRN /READ DOT AT (Y,A)
0811 C9 0C 55 CMP #12 /IS IT GREEN?
0813 D0 16 56 BNE NEXTDOT ;BRANCH IF NOT
0815 98 57 TYA /X-COORD IN Y-REG
0816 9D 01 10 58 STA MARGIN+1,X ;RESET RT MARGIN
0819 9D 03 10 59 STA MARGIN+3,X ;PRESET R MARG NEXT ROW
081C DD 00 10 60 CMP MARGIN,X /IS LT MARG SET?
081F B0 0A 61 BCS NEXTDOT ;BRANCH IF SO
0821 9D 00 10 62 STA MARGIN,X /SET LT MARG
0824 9D 02 10 63 STA MARGIN+2,X /PRESET L MARG NEXT ROW
0827 68 64 PLA /READ Y-COORD
0828 48 65 PHA /PUT BACK
0829 85 08 66 STA YMAX /RESET BOTTOM MARG
082B C8 67 NEXTDOT INY /NEXT X POS
082C C4 06 68 CPY XDOTS /AT RT END OF LINE?
082E D0 DC 69 BNE READDOT /BRANCH IF NOT
0830 68 70 PLA /Y-COORD
0831 18 71 CLC
0832 69 01 72 ADC #1 /NEXT ROW DOWN
0834 C5 07 73 CMP YDOTS /PAST LAST ROW?
0836 F0 10 74 BEQ CREATE /BRANCH IF SO
0838 48 75 PHA /PUSH Y-COORD
0839 E8 76 INX /POINT INDX TO NEXT ROW
083A E8 77 INX
083B A5 06 78 LDA XDOTS /COORD R EDGE OF MATRIX
083D 9D 00 10 79 STA MARGIN,X /PUT IT IN LT MARG
0840 A9 00 80 LDA #0
0842 9D 01 10 81 CLEARRT STA MARGIN+1,X /R MARG TO L EDGE MATRIX
0845 A8 82 TAY /X-COORD TO 0
0846 F0 C4 83 BEQ READDOT /ALWAYS
84 ★
85 ★
0848 : A9 11 86 CREATE LDA #$11
084A : 85 1A 87 STA SHAPE+1 /SET ADR SHP TABL (HIGH)
084C : A9 00 88 LDA #$0
084E : 85 19 89 STA SHAPE /ADR (LOW)
0850 : 85 IB 90 STA XPOS /INIT X-COORD OF READ
0852 : 48 91 PHA /SET Y-COORD
0853 : 85 09 92 STA BYTEPOS /# VECS CUR BYTE OF SHP
0855 : ÀA 93 TAX /INIT MARGIN TABLE INDEX
0856 : 91 19 94 STA (SHAPE) , Y /ZERO 1ST BYTE IN TABLE
0858 : 4C 11 09 95 JMP JUMPIN
085B : A5 FA 96 LTMARG LDA ROW1RT
085D : 85 18 97 STA ROWMARG /FIN POINT OF THIS ROW
085F : A4 F9 98 LDY ROW 1 LT
0861 : A5 IB 99 LDA XPOS /POINT TO START SKIPPING
0863 : 84 IB 100 STY XPOS /STARTING X OF THIS ROW
0865 : A2 40 101 LDX #$40 /2 HI BITS NO-PLOT RT
0867 : 86 07 102 STX MASVECT /DIRECTION OF LINE READ
154 Jogos de Ação para o Apple

0869: 20 CA 09 103 SKIPVEC JSR AB SUB ;# VECS TO SKIP ALONG


086C: 85 IE 104 STA NSKIPS
086E: 8A 105 TXA ;DIR OF READ
086F: 90 02 106 BCC SAVEBAS ,-DIR OF SKIPS SAME READS
0871: 49 80 107 EOR #$80 «•SKIPS OPPOSITE DIR
0873: 85 0-6 108 SAVEBAS STA BASVECT «•BASVECT IS DIR OF SKIPS
0875: 68 109 PLA ,-INDX TO SHAPE
0876: A8 110 TAY
0877: A5 IE 111 LDA NSKIPS
0879: F0 25 112 BEQ READVEC ;NO SKIPS NEEDED
087B: Bl 19 113 LDA (SHAPE), Y «•CURRENT BYTE OF SHAPE
087D: A6 09 114 LDX BYTEPOS
087F: E8 115 SETSKIP INX «•NEXT POS IN BYTE
0880: E0 04 116 CPX #4
0882: 90 0B 117 BCC ADDSKIP «•DIDN'T OVERFLOW
0884: A2 01 118 LDX #1 «•RESET BYTEPOS
0886: 91 19 119 STA (SHAPE) , Y «•PUT CURR BYTE IN TABLE
0888: A9 00 120 LDA #0 «•NEW SHAPE BYTE IS 0
088A: C8 121 INY «•NEXT BYTE IN SHAPE
088B: D0 02 122 BNE ADDSKIP ;NO OVERFLOW
088D: E6 1A 123 INC SHAPE+1
088F: 4A 124 ADDSKIP LSR
0890: 4A 125 LSR
0891: 05 06 126 ORA BASVECT «•PUT NEXT VEC IN
0893: E0 03 127 CPX #3
0895: B0 01 128 BCS CHKSKIP ;NO SHIFT AGAIN- 3RD POS
0897: 4A 129 LSR
0898: C6 IE 130 CHKSKIP DEC NSKIPS
089A: D0 E3 131 BNE SETSKIP «•not done Skipping
089C: 86 09 132 STX BYTEPOS «•UPDATED POS
089E: 91 19 133 STA (SHAPE), Y ;SAVE CURRENT SHP BYTE
08A0: 98 134 READVEC TYA «•PUT SHP INDEX INTO X
08A1: AA 135 TAX ;

08A2: A4 IB 136 LDY XPOS /X-COORD TO BE REAU


08A4: 68 137 PLA /Y-COORD (ROW #)
08A5: 48 138 PHA
08A6: 20 71 F8 139 JSR SCRN /READ IT
08A9: C9 0C 140 CMP #12 /IS IT GREEN? <
08 AB: 08 141 PHP /C, Z BITS SET IF SO
08 AC: A5 07 142 LDA MASVECT
08AE: 30 0D 143 BMI MOVELT /BRANCH IF MOVE-LT VEC
08B0: C8 144 INY /SET NEXT DOT TO RT
08B1: C4 18 145 CPY ROWMARG /IS IT PAST RT EOL?
08B3: 90 0F 146 BCC INCVECT /BRANCH IF NOT
08B5: F0 0D 147 BEQ INCVÉCT /
08B7: A9 80 148 SETDOWN LDA #$80 «•2 HI BITS MOVE-DN VEC
08B9: 85 07 149 STA MASVECT «•STORE IN CURRENT VECTOR
08BB: 30 09 150 BMI NOSAVE «•ALWAYS
08BD: 88 151 MOVELT DEY «•SET FOR NEXT DOT TO LT
08BE: 30 F7 152 BMI SETDOWN «•BRANCH IF BELOW 0
08C0: C4 18 153 CPY ROWMARG ;IS IT PAST LT EOL?
08C2: 90 F3 154 BCC SETDOWN ;BRANCH IF SO
Editor de Tabela de Figuras 155

08C4 84 IB 155 INCVECT STY. XPOS /SAVE X-COORD FOR NEXT


08C6 8A 156 NOSAVE TXA /PUT SHAPE IND BACK IN Y
08C7 A8 .157 TAY 7
08C8 Bl 19 158 LDA (SHAPE), Y /CURR BYTE IN SHP TAB
08CA 28 159 PLP ;Z = 1 IF CURR VEC PLOT
08CB 08 160 PHP
08CC D0 0A 161 BNE NEXTVEC /BRA IF NOT SO (NO-PLOT)
08CE A6 09 162 LDX BYTEPOS VECS IN CURRENT BYTE
08D0 E0 02 163 CPX #2
08D2 D0 04 164 BNE NEXTVEC ;BRANCH IF <>2
08D4 E6 09 165 INC BYTEPOS /SKIP 3 POS
08D6 4A 166 LSR /MOVE 2 VECS IN BYTE TO
08D7 4A 167 LSR ; FIRST OP BYTE
08D8 E6 09 168 NEXTVEC INC BYTEPOS. /NEXT VEC POS CURR BYTE
08DA A6 09 169 LDX BYTEPOS
08DC E0 04 170. CPX #4 ;PAST LAST POSSIBLE?
08DE 90 0D 171 BCC STORE ;BRANCH IF NOT
08E0 91 19 172 STA (SHAPE), Y /SAVE THIS BYTE IN SHAPE
08E2 C8 173 INY /NEXT BYTE IN SHP TAB
08E3 D0 02 174 BNE INITBYT /BRANCH IF NO INDEX
08E5 E6 1A 175 INC SHAPE+1 /COMPENSATE FOR OVERFLOW
08E7 A9 00 176 INITBYT LDA «0 ./ZERO THIS NEXT BYTE
08E9 A2 01 177 LDX #1
08EB 86 09 178 STX BYTEPOS /SET FOR 1ST VEC IN BYTE
08ED E0 03 179 STORE CPX #3 /IS THIS THE 3RD VECTOR?
08EF 08 180 PHP /CARRY SET IF SO
08F0 4A 181 LSR /MOVE BITS 2 TO RT
08F1 4A 182 LSR 7
08F2 05 07 183 ORA MASVECT /PUT IN CURRENT VECTOR
08F4 28 184 PLP . ;3RD VECTOR IN BYTE
08F5 B0 03 185 BCS CHEKEOL ;BRANCH IF SO
08F7 28 186 ■ PLP ;CARRY SET IF PLOT,
08F8 08 187 PHP ; CLEAR IF NO-PLOT
08F9 6A 188 ROR /PUT IN BYTE
08FA 91 19 189 CHEKEOL STA (SHAPE)t Y ;SAVE IN SHAPE TABLE
08FC 28 190 PLP /JUNK THIS
08FD A5 07 191 LDA MASVECT /GET CURRENT VECTOR DIR
08FF C9 80 192 CMP #$80 /IS IT GOING DOWN?
0901 D0 9D 193 BNE READVEC ;BRANCH IF NOT
0903 68 194. PLA /GET ROW #
0904 C5 08 195 CMP YMAX /DONE WITH LAST ROW?
0906 90 03 196 BCC. . NEXTROW /BRANCH IF NOT
0908 4C A7 09 197 JMP, FINISH /DONE WITH LAST ROW
090B 69 01 198 NEXTROW ADC #1 /DOWN TO NEXT ROW
090D 48 199 PHA /PUSH BACK
090E 0A 200 ASL /DOUBLE. FOR INDEX
090F ,AA 201 TAX
0910 98 202. .TYA /PUSH SHAPE INDEX
0911 48 203 JUMPIN PHA 7
0912 BD 00 10 204 LDA « MARGIN,X /LT
0915 A8 205 TAY
0916 BD 01 10 206 LDA MÀRÇIN+1 /X /RT
156 Jogos de Ação para o Apple

0919: DD 00 10 207 CMP MARGIN,X


091C: B0 03 208 BCS SETROW1 /LINE NOT BLANK (RT>=LT)
091E: A5 1B 209 LDA XPOS /RT MARG SET AT XPOS
0920: A8 210 TAY /LT MARG ALSO
0921: 84 F9 211 SETROW1 STY R0W1LT •SAVE FOR REF
0923: 85 FA '212 STA R0W1RT
0925: A0 02 213 LDY fMARGLOW /LOW BYTE OF ’MARGIN+2' *
0927: 8C 37 09 214 STY MARINDX+1 ;RESET CODE THERE
092A: C8 215 INY /LOW BYTE OF ’MARGIN+B’
092B: 8C 3B 09 216 STY MARINDX+5
092E: A0 10 217 LDY #MARGHI /HI BYTE ’MARGIN+2 OR 3'
0930: 8C 38 09 218 STY MARINDX+2
0933: 8C 3C 09 219 STY MARINDX+6
0936: BD 02 10 220 MARINDX LDA MARGIN+2,X /LT OF NEXT ROW
0939: A8 221 TAY
093A: BD 03 10 222 LDA MARGIN+3,X /RT OF NEXT ROW
093D: 84 1F 223 STY TEMP
093F: C5 1F 224 CMP TEMP
0941:. B0 0E 225 BCS SETROW2 /NEXT ROW NOT BLANK
0943: EE 37 09 226 INC MARINDX+1 /SET FOR NEXT ROW
0946: EE 37 09 227 INC MARINDX+1
0949: EE 3B 09 228 INC MARINDX+5
094C: EE 3B 09 229 INC MARINDX+5
094F: 90 E5 230 BCC MARINDX /ALWAYS •
0951: 84 FB 231 SETROW2 STY R0W2LT /SAVE FOR REF
0953: 85 FC 232 STA R0W2RT
0955: A4 F9 233 LDY ROW1LT
0957: 20 CA 09 234 JSR ABSUB /ABS(A-Y)
095A: 85 1C 235 STA RESULT1 /2ND LEG OF V(RR)
095C: A5 FB 236 LDA R0W2LT
095E: 20 CA 09 237 JSR ABSUB /NOW IS 2ND LEG OF V(RL)
0961: C5 1C 238 CMP RESULT1 /WHICH TAKES FEWER VECS?
0963: B0 02 239 BCS RTCALC /V(RR) TAKES FEWER
0965: 85 1C 240 STA RESULT1 /REPL WITH SMALLER V(RL)
0967: A4 FA 241 RTCALC LDY R0W1RT
0969: A5 1B 242 LDA XPOS /CURRENT X
096B: 20 CA 09 243 JSR ABSUB /V(R) LEG OF V(RX)
096E: 18 244 CLC
096F: 65 1C 245 ADC RESULT1 /ADD 2ND LEG OF V(RX)
0971: 85 1C 246 STA RESULT1 /COMPLETE V(RX)
0973: A5 FC 247 LDA R0W2RT
0975: 20 CA 09 248 JSR ABSUB
0978: 85 1D 249 STA RESULT2 /2ND LEG OF V(LR)
097A: A5 FB 250 LDA ROW2LT
097C: 20 CA 09 251 JSR ABSUB /2ND LEG OF V(LL)
097F: C5 1D 252 CMP RESULT2 /WHICH HAS FEWER VECS?
0981: B0 02 253 BCS LTCALC /V(LR) DOES
0983: 85 1D 254 STA RESULT2 /REPL WITH SMALLER V(LL)
0985: A5 F9 255 LTCALC LDA ROW1LT
0987: A4 1B 256 LDY XPOS /CURRENT X
0989: 20 CA 09 257 JSR ABSUB /V(L) LEG OF V(LX)
098C: 18 258 CLC
Editor de Tabela de Figuras 157

098D: 65 ID 259 ADC RESULT2 /COMPLETE V(LX)


098F: C5 1C 260 CMP RESULT1 /WHICH TAKES FEWER VECS?
0991: B0 03 261 BCS RTMARG /V(RX) DOES
0993: 4C 5B 08 262 JMP LTMARG /V(LX) DOES
0996: A5 F^ 263 RTMARG LDA ROW 1 LT
0998: 85 18 264 STA*' ROWMARG /FIN POINT OF THIS ROW
099A: A5 FA 265 LDA R0W1RT
099C: A4 IB 266 LDY XPOS /CURRENT X
099E: 85 IB 267 STA XPOS /START X FOR 'NEW ROW
09A0: A2 C0 268 LDX #$C0 /2 HI BITS HOLD MOVE LT
09A2: 86 07 269 STX MASVECT /DIR OF LINE READ
09A4: 4C 69 08 270 JMP SKIPVEC /MOVE START OF THIS ROW
271 *
272 *
09A7: A6 09 273 FINISH LDX BYTEPOS /# VECTORS IN LAST BYTE
09A9: E0 03 274 CPX #3 •
09AB: B0 0D 275 BCS ENDMARK /IF 3, THEN SHAPE DONE
09AD: Bl 19 276 LDA (SHAPE),Y /GET LAST BYTE OF SHAPE
09AF: EU 02 277 CPX #2
09B1: B0 03 278 BCS RIGHT2 /IF 2, SHIFT 2 BITS RT
09B3: 4A 279 LSR /SHIFT BITS RT TO PUT
09B4: 4A 280 LSR / VECS AT FIRST OF BYTE
09B5: 4A 281 LSR
09B6: 4A 282 RIGHT2 LSR
09B7: 4A 283 LSR
09B8: 91 19 284 STA (SHAPE), Y /SAVE LAST BYTE
09BA: C8 285 ENDMARK INY /INDEX BYTE AFTER LAST
09BB: D0 02 286 BNE EXIT /BRANCH IF NO OVERFLOW
09BD: E6 1A 287 INC SHAPE+1 /COMPENSATE
09BF: A9 00 288 EXIT LDA #0
09C1: 91 19 289 STA (SHAPE), Y /MARK END WITH A ZERO
09C3: 84 06 290 STY ENDADR /END OF TABLE (LOW)
09C5: A5 1A 291 LDA SHAPE+1 /GET HIGHEST ADR USED
09C7: 85 07 292 STA ENDADR+1 /END OF TABLE (HIGH)
09C9: 60 293 RTS /RETURN TO MAIN PROGRAM
294 *
295 *
09CA: 84 IF 296 ABSUB STY SUBNUM /SAVE SO CAN SUB
09CC: 38 297 SEC
09CD: E5 IF 298 SBC SUBNUM
09CF: B0 04 299 BCS DONESUB /DONE IF NOT NEG RESULT
09D1: 49 FF 300 EOR #$FF /MAKE POS
09D3: 69 01 301 ADC #1 /FIX
09D5: 60 302 DONESUB RTS

—End assembly, 470 bytes, Errors: 0


CAPÍTULO 13
WIPEOUT DE ALTA
RESOLUÇÃO
Wipeout de Alta Resolução 159

Os gráficos de alta resolução trazem boas e más notícias. Primeiro


as boas notícias: um jogo de ação em gráficos de alta resolução parece
melhor do que o mesmo jogo em gráficos de baixa resolução. Em alta re­
solução, por exempto, uma nave espacial parece realmente uma nave
espacial ao invés de parecer um quadradinho na tela. As formas são mais
nítidas.
Agora as más notícias: um jogo escrito com gráficos Applesoft de
alta resolução é mais lento e mais difícil de programar do que o mesmo
jogo com gráficos de baixa resolução.
Neste capítulo, apresentaremos uma versão de alta resolução do jogo
Wipeout (mostrado no Capítulo 5). Como você vê — usando um pouco de
imaginação — a nave estelar de alta resolução parece uma nave estelar.
As naves espaciais Kloryon e as minas espaciais têm formas distintas: são
representações razoáveis de veículos e minas espaciais reais.
Além do mais, na versão de alta resolução do Wipeout, você verá ca-
rácteres alfanuméricos (números e letras) na tela de alta resolução. Em
gráficos de baixa resolução, as mensagens escritas tais como o escore
é a hora sãó Confinadas à janela de texto na base da tela. Em alta resolu­
ção, porém, podemos criar conjuntos (sets) de caracteres alfanuméricos,
ou fontes, (usando o Editor de Tabela dé Figuras) e pntão desenhar
(DRAW) os caracteres em qualquer parte na tela de alta resolução. O
Apêndice D, “Texto na Tela de Alta Resolução” dá mais detalhes disto.
Infelizmente, a versão de alta resolução do Wipeout é mais lenta do
que a versão de baixa resolução, embora o jogo de alta resolução ainda
seja rápido o bastante para ser divertido. À medida em que você digita e
estuda a versão de alta resolução do Wipeout, você aprenderá técnicas
valiosas para programar com gráficos de alta resolução.
A principal finalidade deste capitulo é mostrar como usar os gráficos,
de alta resolução e como programar animação em alta resolução. Você
usará um projeto de um jogo familiar (Wipeout) de modo que você pode­
rá se concentrar nas novas técnicas de programação. Mostraremos co-,
mo aplicar a Organização Padrão de Programas (Capítulo 2) a jogos de
gráficos dé alta resolução, e dar-lhe algumas “Dicas de Alta Resolução”
para ajudá-lo em toda suá programação de alta resolução.
Quatro técnicas de programação adicionais que demonstraremos
são: como usar matrizes de dados de figuras; como usar o contador de
colisões (definido no Capítulo 11); como misturar texto com gráficos na
tela de alta resolução (descritos no Apêndice D); e como programar pau­
sas de jogo.

COMO JOGAR WIPEOUT DE ALTA RESOLUÇÃO

Digite o Programa HR Wipeout (Listagem 13.1) e grave no seu disco


Jogos de Ação. Além disso, você terá que fazer o seguinte: ter uma cópia;
funcional do Criador de Som no seu disco (veja Capítulo 7); criar a tabe­
la de formas Standard Font, seguindo o procedimento delineado no Apên­
dice D; acrescente as seis figuras mostradas na Figura 13.1 no final do
160 Jogos de Ação para o Apple

Standard Font (usando o Editor de Tabela de Figuras) e grave as 102 for­


mas resultantes como o arquivo de tabelã de formas, Conjunto Wipeout.
À medida em que você faz as figuras mostradas na Figura 13.1, cer-
tifique-sè de que cada ponto em cada figura está localizado na posição
exata especificada, antes de acrescentá-lo ao arquivo de tabela de formas
usando o modo “ARQUIVAR”. Os limites apropriados da tela e as coorde­
nadas dos pontos são indicados na figura, portanto, assegure-se de se­
gui-los corretamente.
Alternativamente, você pode digitar o arquivo binário dado na Lista­
gem 13.2, usando o procedimento do Apêndice B. Depois de digitar o ar­
quivo binário, digite “BSAVE WIPEOUT.SET,A28672,L1361” para gravá-lo
no seu disco Jogos de Ação.
Se você decide desenhar suas próprias figuras, faça-o somente de­
pois de ter completado uma versão funcional do HR Wipeout usando as
figuras da Figura 13.1. A seção de Melhorias e Modificações no final des­
te capítulo explicará como usar suas figuras personalizadas.
O Wipeout de Alta Resolução tem o mesmo objetivo, regras e coman­
dos de teclado que a versão de baixa resolução do Wipeout. Seu objeti­
vo é de mover sua nave espacial em volta da tela e destruir todos os Klo­
ryons sem bater numa mina espacial e antes de acabar o tempo. As teclas
<A>, <Z>, vírgula (<,>) e ponto (<■>) movem sua nave espacial
para cima, para baixo, à esquerda e à direita.
Além disso, foram acrescentados comandos de teclado auxiliares pa­
ra pausa e som ao jogo de alta resolução. Tecle <ESC> para fazer uma
pausa no jogo; aperte qualquer outra tecla para continuar o jogo. Tecle
<S> para desligar o som enquanto joga; tecle <RETURN> para ligar
novamente o som.

EXPLICAÇÃO DO PROGRAMA

O Quadro 13.1 dá as principais variáveis em Wipeout de Alta Reso­


lução para ajudá-lo a compreender o código do programa.

—------ ------------------------------------------------------------- - - 1»
QUÀDRO 13.1
VARIÁVEIS PRINCIPAIS EM HR. WIPEOUT
VARIÁVEL EXPLICAÇÃO
A Variável geral; também usada na sub-rotina de texto
de alta resolução
AS Variável de entrada; também usada na sub-rotina de
texto de alta resolução
AD Endereço da tabela de formas
CU Número (96) da figura do cursor; usado na sub-rotina
de. texto de alta resolução ■
GN Número de gráficos; índice do ciclo na sub-rotina de
texto de alta resolução
Wipeout de Alta Resolução 161

QUADRO 13.1 (continuação)


VARIÁVEIS PRINCIPAIS EM HR. WIPEOUT
VARIÁVEL EXPLICAÇÃO
HR( ) Valor do byte mais significativo na defi.nição da função
KC Contagem Kloryon (uma constante igual a 50), usada
como índice do ciclo
KL Número de Kloryons
KF( ) Indicador Kloryon; igual a 1 se Kloryon vivo, 0 se morto
LB( ) Valor do byte menos significativo na definição da
função
M Número (102) da figura da mina espacial
MX Movimento de X; quantidade somada a X para próxima
posição
MY Movimento de Y; quantidade somada a Y para próxima
posição
NP Número de pixels nas figuras de naves estelares; usado
pelo contador de colisões
S Número da figura da nave estelar (96,97,98 ou 99)
S1 Número antigo da figura da nave estelar
SM Número de minas espaciais
SN Número do som; o pitch usado com o movimento da
nave estelar
TL Contador do ciclo do tempo; usado para contagem
correta
TM Tempo que ainda resta no jogo
TX Coordenada X de texto de alta resolução; usada pela
sub-rotina de texto de alta resolução
TY Coordenada Y de texto de alta resolução; usada pela
sub-rotina de texto de alta resolução
X Coordenada X de alta resolução da nave estelar
X1 Valor antigo da coordenada X da nave estelar
XK( ) Movimento de Kloryons ao longo da coordenada X
Y Coordenada Y de alta resolução da nave estelar
Y1 Valor antigo da coordenada Y da nave estelar
YK( ) Movimento de Kloryons ao longo da coordenada Y.

Organização de Programas em Alta Resolução

As principais seções de programa do Wipeout de Alta Resolução são


as mesmas já mencionadas: Observações (REM), introdução, Arranjo, Ci­
clo Principal, Sub-rotinas e Fim do Jogo. As diferenças principais são as
seguintes:
162 Jogos de Ação para o Apple

1. * Carregando (BLOAD) a tabela de figuras. Em jogos gráficos de


alta resolução, você gèralmente precisa carregar (BLOAD) uma
tabela de figuras na seção Introdução do programa. A Linha 240
do HR Wipeout carrega (BLOAD) o conjunto de formas Wipeout
Set na rhemôriâ. (Para evitar o problema de ter de carregar
(BLOAD) ó arquivo de formas quando já está na memória, a li­
nha 240 espia (PEEK) o endereço da tabela de formas (28672)
para ver se o arquivo já está lá.)
2. Ajustando HIMEM. Por que você carrega (BLOAD) um arquivo
de tabela de figuras no início da maioria dos jògos de alta reso­
lução, você precisa se assegurar de que há memória disponível
para a tabela de figuras. Você também precisa se certificar de
que o arquivo está protegido de seu programa Applesoft, como
explicado no Capítulo 12. Sem proteger a tabela de formas no
Wipeout de Alta Resolução, os dados seriam sobrepostos pelos
strings Applesoft durante a execução do programa. Para evitar
éste problèrha, você precisa reajustar HIMEM abaixo de seu ar­
quivo de tabela de formas de modo que os strings (armazenados
erti HIMEM e abaixo) não interfiram com suàs formas. Isto é feito
na linha 280 do HR Wipeout, depois dá tabela de formas ter sido
carregada (BLOAD). Se você tentasse agora carregar (BLOAD)
outra tabela de formas nesta mesma posição da.memória, o Pro­
DOS lhe daria um erro de “NO BUFFERS AVAILABLE” (não há
buffers disponíveis), visto que não lhe permitirá carregar (BLOAD)
um arquivo acima de HIMEM. (Isto não é um problema com DOS
3.3. ) Portanto, no início do programa (veja linha 200 do HR Wi­
peout) você precisa ajustar HIMEM acima da posição de memó­
ria de seu arquivo de tabela de formas. Escolhemos HIMEM:
34304 pois o endereço 34304 ainda está abaixo dó editor Apple­
soft GPLE (Editor Global de Linha de Programa). Se você não
está usando GPLE, então você pode ajustar HIMEM para 38400,
logo abaixo do ProDOS. Se voçê está usando DOS 3.3., você não
precisa da declaração HIMEM na linha 200. Mesjno com DOS
3.3, entretanto, você precisa do HIMEM na linha 280. Certifique-
se de que você não fixa quaisquer variáveis antes de qualquer
declaração HIMEM.
3. Na Introdução, você precisa inserir (POKE) a posição de memó­
ria de seu arquivo dê tabélá de formas nos endereços 232 e 233,
como explicado no Capítulo 12 (veja linha 420 do HR Wipeout).
4. Na seção Arranjo, você deve inicializar a tela de alta resolução
com o comando “HGR” ou “HGR2” (usaremos somente a tela 1
de alta resolução e o comando HGR neste livro). Então, se você
deseja só gráficos (ao' invés do default misto gráficos/texto),
você deverá dar POKE-16302,0. Estes comandos são mostrados
na linha 500 do HR Wipeout. ,Da mesma maneira, você precisa
inicializar a escala da figpra’ de alta resolução, rotação e cor,
.... com os comandos “SCALÉ= 1, R0T= 0” e “HÇOLOR= 3” tam­
bém dados na linha 500.
Wipeout de Alta Resolução 163

5. Na seção Arranjo, você também precisa desenhar (DRAW ou XDRAW)


as figuras iniciais de alta resolução (tal como precisou desenhar (PLOT)
as figuras iniciais de baixa resolução nos jogos gráficos de baixa reso­
lução). No HR Wipeout, os Kloryons são desenhados (XDRAW) na tela
nas linhas 520-600 (compare estes com os mesmos números de linha
no Wipeout de baixa resolução) e as minas éspaciais são desenhadas
(DRAW) nàs I i n has 620-700.
Como você pode yer, a Organização Geral de Programas para jogos
de alta resolução é essencialmente a mesma que para jogos de baixa re­
solução. As principais diferenças resultam dos comandos Applesoft BASIC
necessários para gráficos de alta resolução.

Dicas para Gráficos de Alta Resolução

Aqui estão algumas dicas ou regras que desenvolvemos como resul­


tado de nossa experiência em ensinar programação de alta resolução a
centenas de jovens e adultos.
1. Mantenha as figuras pequenas. Agora que você já evoluiu de grá­
ficos de baixa resolução para os de alta resolução, a tentação é
de fazer figuras grandes, bem elaboradas, nas suas tabelas de
figuras. Para simplificar a programação e acelerar a ação, resis­
ta à tentação e mantenha suás figuras pequênas.
2. Não mude o SCALE. Exceto em ocasiões muito raras, ajuste
SCALE=1 no início dò seu programa e o deixe em paz. Valores
de escala mais altos distorcem ás figuras e tornam a animação
mais lenta. Se você quiser vários tamanhos da mesma forma bá­
sica; faça formas separadas com õ Editor de Tabela de Figuras,
e mantenha SCALE=1.
3. Não mude o ROT. Ajuste ROT=0 e mantenha-o ali. A única ex­
ceção seria quando você quer que sua figura faça giros de 90°,
caso ém que você pode usar as rotações 0, 16, 32 e 48. Mesmo
assim, uma figura animada pula na tela quando passa de uma
rotação para a seguinte. Por esta razão, o Wipeout de Alta Reso­
lução usa quatro diferentes figuras de naves estelares (uma para
cada direção em que se pode mover), dando assim animação
mais rápida e mais suave do que se o Wipeout de Alta Resolu­
ção tivesse apenas uma figura e sua.direção mudasse, mudando
seu valor ROT.
4. Não mude o HCOLOR. Ajuste HCOLOR= 3 e deixe assim. Você
ainda pode ter cor nas suas figuras de alta resolução, desenhan­
do as figuras (no Editor de Tabela de Figuras) de modo que os
pontos (pixels) séjàm ligados em colunas alternadas. Por exemplo,
presuma que todos os valores ímpares de X na tela de edição são
deixados vazios, e os pontos são apenas desenhados nos valores
pares de X. A figura aparecerá em c.or na tela de aJta resolução,
mesmo que HCOLOR seja fixado em. 3. Você pode usar o co­
mando H (mostrar a figura de edição em alta resolução) para
164 Jogos de Ação para o Apple

certificar-se de que obtém a cor desejada. Use o comando DRAW


" com a cor ainda em branco. Não apague figuras de alta resolu­
ção mudando a cor para preto.
5. Use sempre XDRAW, nunca DRAW. Use sempre o comando
XDRAW porque a maioria das figuras que você desenha na tela
podem sobrepor òu colidir com outras figuras ou linhas na tela.
Portanto, será necessário apagar as figuras. Por exemplo, naves
estelares colidem com Kloryons, balas colidem com alienígenas,
e foguetes colidem com discos voadores. Quando duas figuras
colidem, você deverá poder apagar uma ou ambas as formas
da tela. Se você usou DRAW (ao invés de XDRAW) para as figu­
ras, não há maneira simples de apagá-las quando elas colidem.
Nem há uma maneira simples de restaurar um objeto à sua for­
ma original. Se, porém, você usou XDRAW para a bala ou para o
foguete, você pode apagáTlo rápida e simplesmente e de manei­
ra limpa com outro comando XDRAW.
Além disso, se você deseja animar uma figura através de um fundo
de alta resolução, você precisa desenhar (XDRAW) a figura animada na
tela de modo que possa apagá-la sem perturbar o fundo.

Matrizes de Dados de Figuras

Matrizes-são grupos de dados intimamente relacionados. Por exem­


plo, as coordenadas X,Y dos çinqüenta Kloryons inimigos no Wipeout de
Alta Resolução são todos o mesmo tipo de dados. Ao invés de ter cin­
quenta variáveis cada uma para representar a coordenada X de seu res­
pectivo Kloryon, e çinqüenta variáveis cada uma representando a coorde­
nada Y, é mais fácil ter apenas duas variáveis: as variáveis de matrizes
XK(50) e YK(50). Estas variáveis de matrizes são usadas no Wipeout de
Alta Resolução para guardar a posição de todos os Kloryons. O programa
deve lembrar onde cada Kloryon está localizado porque os Kloryons pre­
cisam' ser apagados da tela em algum ponto do jogo.
Outra matriz importante é a KF(50), a matriz de indicadores Kloryon.
Cada um dos .çinqüenta elementos tem o valor 1 (significando que o Klo­
ryon ainda está na tela) ou zero (significando que o Kloryon foi destruído).
Para uma explicação mais aprofundada das matrizes de dados de
figuras, consulte o capítulo seguinte (Nuclear Fallout de Alta Resolução).

Animação em Alta Resolução

A animação em alta resòlução envolve os mesmos sete passos da


animação dos gráficos de baixa resolução (veja Capítulo 3). A única di­
ferença é que nos gráficos de alta resolução, a tela tem mais pontos e
diferentes valores de limites.
Wipeout de Alta Resolução 165

HR Wipeout (Listagem 13.1) claramente demonstra os sete passos da


animação com as seguintes linhas especificamente modificadas para grá­
ficos de alta resolução:
1. A linha 800 (na seção Arranjo) ajusta as coordenadas iniciais e
desenha (XDRAW) a figura. Neste caso, o objeto animado é sua
nave estelar e sua posição inicial é X,Y = 138,184. Nos gráficos
de alta resolução você também deve ajustar o número dà figura
inicial. Em HR Wipeout, a declaração S = 99 ajusta a figura ini­
cial da nave estelar para aquela voltada para a direita.
2. A linha 2000 (na seção Ciclo Principal) guarda as coordenadas
da posição da nave estelar “velha”. Esta é a mesma que a linha
2000 em Wipeout de baixa resolução. Visto que a figura da nave
estelar depende da direção do movimento, o número “velho” da
figura também precisa ser guardado. Isto, porém, não pode ser
feito na linha 2000 pois a nova figura já foi ajustada nas linhas
1060-1120 quando você aperta o teclado. É mais conveniente
ajustar a figura antiga (variável S1) na seção Arranjo (veja linha
800) no começo do jogo. Então reajuste-a após cada movimen­
to da nave estelar na linha 2120.
3. A linha 2020 calcula as novas coordenadas da nàve estelar, se­
melhante à linha 2020 do Wipeout de baixa resolução. A única
diferença é que na versão de alta resolução, o incremento do
movimento (usando as variáveis MX e MY) é ajustado para —4,
0 ou +4, dependendo da direção do movimento. Na versão de
baixa resolução, o incremento do movimento é apenas —1, 0 ou
+1. A animação seria lenta demais se a nave estelar se movesse
apenas um pixel por vez.
4. As linhas 2040-2100 checam as bordas da tela de alta resolução
de modo que a nave estelar não ultrapasse as bordas da tela.
Isto é necessário por duas razões: para evitar ILLEGAL QUAN­
TITY ERRORS resultando das tentativas de DRAW ou XDRAW al­
go fora da tela de alta resolução; e manter a figura abaixo do tex­
to de alta resolução no topo da tela. Você também deveria notar
que o valor X mais alto permitido no programa é 270, não 279.
Embora um valor X na faixa de 272-279 não cause um erro no
programa, fará com que a nave estelar se parta em duas. Parte
da figura estaria do lado direito da tela e parte do lado esquerdo.
5. A linha 2120 apaga a nave estelar simplesmente desenhando
(XDRAW) a figura antiga sobre si mesma. Com o comando
XDRAW, você pode apagar formas sem mudar a cor.
6. A linha 2120 também desenha (XDRAW) a nova figura na sua no­
va posição. Você pode criar uma animação suave, sem piscar,
colocando os passos apagar (passo 5) e redesenhar (passo 6)
na mesma linha Applesoft.
7. A linha 5000 envia o programa de volta ao topo do ciclo princi­
pal, assim, voltando para o passo 1 da animação.
166 Jogos de Ação para o Apple

Contador de Colisões

Como é que o Wipeout de Alta Resolução determina que sua nave


estelar colidiu com um Kloryon ou uma mina espacial? A resposta é: com
o contador de colisões de figuras de alta resolução (veja Capítulo 12).
Cada vez que sua nave estelar é desenhada (XDRAW) na tela de alta
resolução (na linha 2120 da Listagém 13.1), o Applesoft BASIC automati­
camente armazena um número no endereço de memória 234 igual ao
número de pixels que estão ligados. Por exemplo, se sua nave estelar
está apontando para a direita e se não ocorrer colisão, o XDRAW faz li­
gar vinte e seis pixels. Assim, a posição de memória 234 contém o núme­
ro 26 depois do XDRAW. Por outro lado, se ocorrer uma colisão, o coman­
do XDRAW apagará (desligará) os pixels onde as duas figuras se sobre­
põem. Assim, o número de pixels ligados pelo XDRAW da nave estelar é
menor que vinte e seis. Seu programa pode verificar se há colisões sim­
plesmente espiando (PEEK) o endereço de memória 234 e verificando se
o número é menor do que vinte e sèis.
Se a nave estelar está apontando para cima ou para baixo, o número
de pixels é apenas vinte e dois. Portanto, à medida em que a nave
estelar muda de direção, o número de pixels também muda. O programa
deve monitorar a mudança. Isto é obtido com a variável NP (número de
pixels). A linha 800 ajusta NP parà 26, pois a nave estelar inicialmente se
moverá para a direita. Cada vez que você aperta uma tecla para mudar a
direção da nave estelar, o programa modifica a variável NP (véja linhas
1080-1120).
Quando for desenhada (XDRAW) a nova posição da nave estelar (ve­
ja linha 2120), o programa verifica o contador de colisões com o coman­
do “IF PEEK (234) = NP THEN 3000”. Se não ocorreu nenhuma colisão, o
programa pula para a linha 3000, verifica o cronômetro, e pula de volta
para o começo do ciclo principal (linha 5000).
Se ocorreu uma colisão, o programa deve verificar se a colisão é
com um Kloryon ou com uma mina espacial. Se for com um Kloryon, de­
vemos saber qual Kloryon apagar da tela. O programa deve verificar cada
Kloryon, um por vez. Para isto, usamos um pequeno truque. Apagamos o
primeiro Kloryon, cujas coordenadas foram armazenadas nas matrizes
XK(I) e YK(I) (veja linha 570), com um comando XDRAW. Então imediata­
mente colocamos o Kloryon de volta na tela com um segundo comando
XDRAW (véja linha 2160). Em seguida, verificamos o contador de colisão
para ver se aquele Kloryon se sobrepõe à nave estelar. Sê o contador de
colisões contiver o valor correto (16) para o número de pixels num Klo­
ryon, não houve colisões com aquele7 Kloryon. Então passamos para o
Kloryon seguinte, desenhando (XDRAW) duas vezes e verificando o con­
tador de colisões. Se o programa detectar uma colisão, ele irá para linha
2220 onde apaga o Kloryon e ajusta o escore. Depois de verificar cada
Kloryon com o ciclo nas linhas 2140-2180, se o programa encontrar que
nenhum Kloryon se sobrepõe à (colidiu com) sua nave estelar, a colisão
deve ter sido entre sua nave estelar e uma mina espacial. Então o progra­
ma pula da linha 2200 para 15000 para avisá-lo de que você perdeu o jogo.
Wipeout de Alta Resolução 167

Verificar todos os çinqüenta Kloryons desta maneira leva tempo, e o


piscar dos Kloryons enquanto o programa os verifica pode ser irritante.
Em jogos com menos figuras a verificar, o método é mais rápido e eficaz.
Note que usamos o contador de colisões quando o programa inicial­
mente desenhou os Kloryons e as minas espaciais na tela de alta resolu­
ção (veja linhas 520-700). Fizemos isso pgra ter certeza de que nenhuma
das figuras se sobreponha ao desenhá-la.

Texto de Alta Resolução

O Apêndice D dá uma explicação detalhada de como colocar texto


na tela de alta resolução. Para usar texto de alta resolução num progra-:
ma tal como HR Wipeout, siga estes passos:
1. Faça uma tabela de formas do- conjunto ou fonte de caracteres
de alta resolução, consistindo dos 96 caracteres alfanuméricos
do teclado na sua ordem correta (veja Apêndice D). No HR Wi­
peout, começamos com a Fonte Padrão (standard), onde os ca­
racteres são do modelo da fonte de tela de texto padrão do
Apple.
2. Anexe outras figuras de que você precisa no programa à tabela
de formas fonte. No Conjunto Wipeout, por exemplo, acrescenta­
mos quatro figuras para a nave estelar, uma para os Kloryons e
uma para as minas espaciais. Isto dá um total de 102 formas no
arquivo de tabela de formas.
3. Carregue (BLOAD) toda a tabela de formas do disco para memó­
ria como de costume (veja linha 240 do HR.Wipeout).
4. Inclua em seu programa uma sub-rotina que converte strings de
texto e numéricos em strings gráficas como explicado no Apên­
dice D. Estes são incluídos nas linhas 8000-8540 do HR Wipeout.
5. Também inclua em seu programa o código necessário para pre­
venir que outras formas se sobreponham a seu texto de alta re­
solução. A Verificação das bordas em HR Wipeout, por exemplo,
impede a nave estelar de passar por cima do texto de alta reso­
lução (linhas 2040-2100). *
6. Quando você mostra um string ou número na tela de alta resolu­
ção, ajuste as coordenadas TX.TY de alta resolução para o pi­
xel onde deverá ser posicionado o canto superior esquerdo do
primeiro caractere.
7. Ajuste a string de texto para a variável AS ou o número para a
variável A. Certifique-se de que você vai reservar estas variáveis
para esse firn.
8. Finalmente, chame a sub-rotina de texto de alta resolução apro­
priada. Em HR Wipeout, esta é a linha 8000 para caracteres
numéricos, e linha 8500 para caracteres string.
Os passos 6 a 8 são apresentados nas liphas 820-840 do Wipeout de
Alta Resolução (onde aS strings “KLORYONS=” e “TEMPO=” são mostra­
das durante o arranjo do programa), na linha 2220 (onde o número de
168 Jogos de Ação para o Apple

Kloryons é mostrado à medida em que estão sendo destruídos), e na li­


nha 3000 (onde o valor do cronômetro é mostrado à medida em que o
tempo se esgota).

Pausas de Jogo

Presuma que você esteja no meio de um jogo de computador e rece­


be um telefonema. Você pode/ ignorar o telefonema e continuar jogando;
dizer à parte que chama para esperar na linha por cinco minutos enquan­
to você termina seu jogo; aceitar o telefonema, mas ficar resmungando a
respeito de pessoas que interrompem assuntos importantes; ou teclar
<ESC> para interromper o jogo enquanto você estiver ao telefone.
Obviamente, a resposta preferida é a última. Mas isto não é uma op­
ção, a menos que tenha sido programada uma pausa no jogo de compu-
tador.Uma pausa no jogo é útil não só para o caso de você ser interrom­
pido, mas também para descansar da extenuante tarefa de abater alie­
nígenas.
O Wipeout de Alta Resolução demonstra como acrescentar uma pau­
sa a quase qualquer jogo de ação Applesoft. O método é realmente bem
simples. O programa verifica se o usuário apertou a tecla <ESC> ou al­
guma outra que você desejar usar para a pausa. Na linha 1160, o Wipeout
de Alta Resolução verifica se o usuário apertou a tecla CHR$(27), que é o
código da string de caracteres para a tecla <ESC>. Se o usuário aper­
tou <ESC>, o programa pula de volta para a linha 1020 e aguarda na
declaração GET para o usuário apertar outra tecla (qualquer uma, exceto
<ESC>), ponto em que o jogo recomeça.
Num jogo de paddle, tal como Race Car (Capítulo 6), você pode
acrescentar uma característica de pausa com a seguinte linha de código:
“1010 IF PEEK ( - 16384) > 128 THEN GET AS: GET AS”. O primeiro co­
mando GET desta linha recebe qualquer coisa que o usuário apertou, se
e quando ele pressionar uma tecla. O segundo comando GET espera o
usuário apertar uma segunda tecla. Usando isto em Race Car, por exem­
plo, ser-lhe-á permitido parar apertando qualquer tecla, então retoman­
do quando apertar qualquer, outra tecla.

MELHORIAS E MODIFICAÇÕES

Há cinco melhorias ou modificações possíveis no HR Wipeout: subs­


tituir a Fonte Padrão por um conjunto de caracteres personalizados para
colocar texto na tela de alta resolução; usar sua própria figura individual
para as naves estelares, Kloryons ou minas espaciais; acelerar o progra­
ma mudando o texto da tela de alta resolução para a janela de texto; ace­
lerar o programa removendo alguns dos efeitos sonoros; e programar a
nave estelar para viajar mais depressa.
Uma vantagem de colocar o texto na tela de alfa resolução é que vo­
cê não precisa se conformar com os caracteres padrão do Apple como
dados na Fonte Padrão. Por exemplo, você pode desejar criar uma fon­
te para produzir fonte Romana, Old English ou alguma outra personaliza-
Wipeout de Alta Resolução 169

da para usar no Wipeout de Alta Resolução. O Apêndice D explica como


fazer suas próprias fontes.
Para usar suas próprias formas individuais, você precisa determinar
os valores corretos de NP (número de pixels) para cada forma a usar com
o contador de colisões (veja Capítulo 11). Então você precisa modificar
as linhas 800 e 1060-1120 para incluir o valor correto de NP.
Para tirar o texto da tela de alta resolução e colocá-lo na janela de
texto, você precisa modificar a Listagem 13.1, de maneira que as linhas
apropriadas sejam iguais ou semelhantes àquelas da Listagem 5.1. A esta
altura, você poderá fazer isto sozinho. Se tiver dificuldades, consulte es­
ta relação de todas as mudanças necessárias:
Linha 500: Insira "HOME” e remova "POKE-16302,0”. Linha 560:
Mude “165” para “150” e remova “+15”. Linha 660: Mude “160” para
“145” e remova o “+15”. Linha 800: Mude “Y=184” para “Y=154”. Linhas
820-840: Torne-as iguais aos mesmos números de linha no Wipeout de
baixa resolução. Linha 2060: Mude “14” para “0” e “184” para “154”. Li­
nha 2220: Mude todas as declarações “TX=63. . .GOSUB 8000” (inclusi­
ve) para:

VTAB 22:HTAB 10:PRINT KL“ ”

Linha 3000: Torne-a idêntica à linha 2200 do Wipeout de baixa resolução.


Você também pode acelerar o programa simplesmente apertando
<S> para desligar o som. Desta maneira, os movimentos da nave estelar
não serão acompanhados por um bip que consome tempo. Da mesma ma­
neira, você pode apagar o som do movimento da nave estelar e deixar os
outros sons ligados, apagando o comando da linha 2120.
Outra maneira de mover mais rapidamente a nave estelar é mudar o
incremento de movimento (variáveis MX e MY) de 4 para 5 ou 6 (para mo­
ver a nave estelar mais lentamente, mude o incremento de 4 para 3 ou 2).
As modificações devem ser feitas nas linhas 800 e 1060-1120. Se você
tentar fazer o incremento grande demais, tal como 8, você correrá o risco
de a nave estelar pular sobre os Kloryons e as minas espaciais no seu
caminho.
Você pode fazer níveis variáveis de dificuldade mudando os valores
de MX e MY (1-3) para os níveis mais baixos de dificuldade, e (4-6) para
os níveis mais altos dé dificuldade. Esta é a base para a velocidade
variável e automaticamente aumentando os níveis de dificuldade no
Nuclear Fallout (chuva nuclear) (Capítulo 8).
Já abrangemos bastante informações e técnicas em gráficos de alta
resolução. Quando você compreender e puder aplicar estas técnicas em
seus próprios jogos, estará no caminho para se tornar um programador
perito!
170 Jogos de Ação para o Apple

Figura 13.1: WIPEOUT.SET

[A figura no canto superior esquerdo é#1, a figura no canto supe­


rior direito é$2, a figura no canto esquerdo da fileira do meio é#3, etc.}

1 5 10 20 1 5 10 -20



w -JL.

10

20
1
1-Ú
5

10

204
1 5 10 20

10
Wia • EEEEEEEEEE

204
Wjpeout de Alta Resolução 171

10 REM
20 REM * HR.WIPEOUT *
30 REM BY SCOTT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM
90 REM
190 REM

INTRODUÇÃO:

200 HIMEM: 34304: TEXT : HOME


220 VTAB 6:A$ = " HR WIPEOUT ": INVERSE :
GOSUB 6000: NORMAL : VTAB 8: AT = "BY
S. SCOTT ZIMMERMAN": GOSUB 6000: VTAB
10: AT = "COPYRIGHT (C) 1985": GOSUB 6000
240 IF PEEK (28672) < > 102 THEN PRINT
CHRT 14);"BLOAD WIPEOUT.SET,A28672”
260 IF PEEK (768) < > 169 THEN PRINT CHRT
(4);"BRUN CRIADOR.SOM"
280 & RESUME : HIMEM: 28671: DIM KF(50),XK(50)
YK(50)
300 DEF FN HB(A) = INT (A / 256): DEF FN
LB(A) = A - FN HB(A) * 256
400 VTAB 23: PRINT "TECLE <ESPACO> ->
GET AT: PRINT AT: & 200,80,1
420 AD = 28672: POKE 232, FN LB(AD): POKE 233,
FN HB(AD)
490 REM

ARRANJO:

500 HGR : POKE - 16302,0:CU = 96:K = 101:


TM = 60:TL = 0:KL = 50:KC = KL:SM = 10:
M = 102 s ROT= 0: SCALE= 1: HCOLDR=
520 FOR I = 1 TO KL
•.> u KF (I) = 1
540 X = INT t RND (1) * 265) +. 5
560 'f
i — INT ( RND (1) * 165) + 15
570 XK (I) = X YK (I) =? Y
580 XDRAW K AT X,Y: IF PEEK (234) < > 16
THEN XDRAW K AT X,Y: GOTO 540
172 Jogos Ação para

óOO NEXT I
620 FOR I = 1 TO SM
640 X = INT ( RND (1) * 265) + 5
660 Y = INT ( RND (1) * 160) + 15
680 XDRAW M AT X,Y: IF PEEK (234) < > 24
THEN XDRAW M AT X,Y: GOTO 640
700 NEXT I
800 X = 138: Y = 184:MX = 4:MY = 0:S = 99:SN
= 230:81 = S:NP = 26: XDRAW 8 AT X,Y
820 TX = 0:TY = O:Aí = "KLORYONS=": GOSUB 8500
A = KL: GOSUB 8000
840 TX = 214: TY = Os Aí = ,!TEMPO=”: GOSUB 8500:
A = TM: GOSUB 8000
990 REM

CICLO PRINCIPAL:

1000 IF PEEK ( - 16384) < 128 THEN 2000


1020 GET Aí
1060 IF Aí = THEN MX = 4: MY = 0:S = 99:
SN = 230:NP = 26: GOTO 2000
1080 IF AÍ = ” THEN MX = - 4:MY = 0:S =
100:SN = 220:NP = 26: GOTO 2000
1100 IF AÍ = "A" THEN MX = O:MY = - 4:S =
97:SN = 240:NP = 22: GOTO 2000
1120 IF AÍ = ”Z" THEN MX = OsMY = 4:S = 98:
SN = 210:NP = 22: GOTO 2000
1140 IF Aí = "S" THEN & STOP : GOTO 2000
1160 IF Aí = CHRÍ (13) THEN & RESUME
1180 IF Aí = CHRÍ (27) THEN GOTO 1020
2000 XI = X:Y1 = Y
2020 X = X + MX:Y = Y + MY
2040 IF X < 6 THEN X = 270: GOTO 2120
2060 IF Y < 14 THEN Y =,184: GOTO 2120
2080 IF X > 270 THEN X = 6: GOTO 2120
2100 IF Y > 184 THEN Y = 14
2120 XDRAW SI AT Xi,Yl: XDRAW S AT X,Y: & SN,
3,1sSI = S: IF PEEK (234) = NP THEN
3000
2130 REM

VERIFICA COLISÃO:

2140 FDR I = 1 TO KC; IF KF(I) = O THEN 2180


2160 XDRAW K AT XK(I),YK(I): XDRAW K AT XK(I),
YK(I): IF PEEK (234) < > 16 THEN 2220
Wipeout de Alta Resolução 173

2180 NEXT I
2200 GOTO 15000
2210 REN

APAGA KLORYON:

2220 XDRAW K AT XK(I),YK(I):KF<I> = O:KL =


KL - 1:KF(I> = O:TX = 63:TY = 0:A = KL:
GOSUB 8000: GOSUB 7000: IF KL = 0 THEN
10000
2990 REM

CRONOMETRO:

3000 TL = TL + 1: IF TL = 12 THEN TM = TM -
1:TL = 0:A = TM:TX = 256:TY = 0: GOSUB
8000: IF TM = 0 THEN 15000
5000 GOTO 1000
5990 REM

SUB-ROTINAS:

6000 HTAB (40 - LEN (At)) / 2: PRINT At: RETURN

7000 FOR I = 210 TO 220: & 1,6,1: NEXT : RETURN

8000 At = STRt (A) 4- " "


8500 L = LEN (At): FOR GN = 1 TO L:N ~ ASC
( MIDt (At,GN,l)> - 31
8520 HCOLOR= O: DRAW CU AT TX,TY: HCOLOR= 3:
XDRAW N AT TX,TY:TX = TX + 7: IF TX
> 272 THEN TX = O:TY = TY + 8: IF TY
> 184 THEN TY = 0
8540 NEXT GN: RETURN
9990 REM

GAME OVER:

10000 & 192,10,2: & 208: & 217: & 223,20: &
217,10: & 223,20: TEXT : HOME : VTAB
10: HTAB 14: PRINT "VOCE GANHOU!!": GOTO
20000
15000 & 180,80,2: & 140,160: TEXT : HOME : VTAB
10: HTAB 14: PRINT "VOCE PERDEU!"
174 Jogos de Ação para o Apple Introdução 9

20000 VTAB 18: PRINT "KL0RY0NS=";KL: PRINT "TEMP0=";


TM
20020 VTAB 22: CALL - 958: PRINT "JOGAR DÉ NOVO?
(S/N) & 250,8,1: GET At: PRINT At
K) NI

0040 IF At = "S" THEN 500


0060 IF At < > "N" THEN 20020
Wipeout de Alta Resolução 175

Listagem 13.2: WIPEOUT.SET

7000- 66 00 CE 00 D0 00 D6 00 DB 00 EA 00 F8 00 03 01
7010- 10 01 14 01 IC 01 24 01 33 01 3B 01 40 01 45 01
7020- 4A 01 52 01 62 01 6A 01 76 01 81 01 8C 01 99 01
7030- A7 01 AF 01 BE 01 CC 01 DC 01 El 01 EA 01 F2 01
7040- FA 01 03 02 12 02 22 02 31 02 3D 02 4C 02 59 02
7050- 64 02 74 02 84 02 8E 02 99 02 A6 02 AD 02 BD 02
7 060- CD 02 DC 02 E9 02 'F9 02 08 03 16 03 ID 03 2C 03
7070- 3A 03 4A 03 58 03 63 03 6D 03 78 03 7E 03 89 03
7080- 93 03 9A 03 9E 03 A7 03 B3 03 BE 03 CB 03 D7 03
7090- E0 03 ED 03 F9 03 01 04 09 04 14 04 IB 04 28 04
7 0A0- 34 04 40 04 4D 04 59 04 61 04 6C 04 75 04 81 04
70B0- 8C 04 99 04 A4 04 B0 04 BB 04 C6 04 CC 04 D6 04
70C0- DD 04 FA 04 08 05 15 05 24 05 33 05 3E 05 02 00
70D0- 09 36 36 16 06 00 69 FE 6E 06 00 69 FE IE 2D 2D
70E0- IE IF IE 2D 2D IE IF 6E 06 00 09 4E 3F 77 IF 0E
70F0- 2D 0E IF 0E 3F 77 31 00 39 2E 4D IE IE IE IE 4D
7100- 35 37 00 B9 0D FE 0E IE 0D 0D IE DF 0E 6D 06 00
7110- 09 36 06 00 09 IE IE 36 0E 0E 06 00 09 0E 0E 36
7120- IE IE 06 00 09 9F 0D 0D IE 3F 0E 0E 3F IE 0D 0D
7130- DE 06 00 4A 76 39 3F 77 31 06 00 92 4A F6 06 00
7140- 92 2D 2D 06 00 92 92 09 06 00 4A 09 IE IE IE IE
7150- 06 00 29 75 DF 33 4D 35 IF IF 2E 4D FE IB 0E 2D
7160- 06 00 09 3E 0E 36 76 3F 06 00 29 F5 IB 4D 31 IE
7170- F7 IE 2E 2D 35 00 2D 2D F6 3E 4E FE IB 0E 2D 06
7180- 00 49 3E IE 0D FE 33 2D 2D IE 36 00 49 39 3F 37
7190- 2E 2D 0E 36 DF 73 2D 06 00 09 2D DE F3 2E 2D 0E
71A0- DF 33 4D Fl 3F 06 00 2D 2D F6 IE IE 36 06 00 29
71B0- 75 DF 33 4D Fl 3F IE 4D 31 DF 73 2D 06 00 29 75
71C0- DF 33 4D 31 3F 77 09 IE IE 3F 06 00 52 Bl 06 00
71D0- 4D 31 DF 33 2D 2D FE IB 6E 09 06 00 52 Bl F6 06
71E0- 00 49 IE IE IE 0E 0E 0E 06 00 12 2D 2D 16 3F 3F
71F0- 06 00 71 0E 0E IE IE IE 06 00 29 75 DF 73 09 IE
7200- B6 06 00 29 75 DF 33 0D 0D 3E FF 4E 39 IF 76 2D
7210- 35 00 09 15 IF 17 4D 31 DF 33 2D 2D FE IB 6E 09
7220- 06 00 2D AD DF 33 4D Fl 3F 37 4D 3.1 DF 33 2D 35
7230- 00 29 AD DF 33 36 4D 11 DF 73 2D 06 00 2D AD DF
7240- 33 4D 31 DF 33 4D 31 DF 33 2D 35 00 2D 2D DE IB
7250- 6E 11 3F .37 36 2D 2D 06 00 2D 2D DE IB 6E 11 3F
7260- 37 36 06 00 29 AD DF 33 4D 11 3F IF 6E 09 FE IB
7270- 0E 2D 06 00 4D 31 DF 33 4D 31 3F 3F 6E 09 FE IB
7280- 6E 09 06 00 2D 2D DE 36 36 9F 2D 2D 06 00 29 2D
7290- IE 36 DF 6A 31 DF 0E 35 00 4D Fl DF 6E IE 37 0D
72A0- 15 DF 6E 09 06 00 36 36 36 2D 2D 06 00 4D 31 FF
176 Jogos de Ação para o Apple

72B0- 37 0D 0D FE 1F 6E 09 FE 1B 6E 09 06 00 4D 31 DF
72C0- 33 6D 31 1F 1F 6E 29 FE 1B 6E 09 06 00 29 AD DF
72D0- 33 4D 31 DF 33 4D 31 DF 73 2D 06 00 2D AD DF 33
72E0- 4D 31 DF 33 2D F5 1B 36 00 29 AD DF 33 4D 31 DF
72F0- 33 0D 0D 1E DF 0E 6D 06 00 2D AD DF 33 4D 31 DF
7300- 33 2D 35 DF 6E 09 06 00 29 AD DF 33 4D 3A 77 09
7310- FE 1B 0E 2D 06 00 2D 2D DE 36 36 36 00 4D 31 DF
7320- 33 4D 31 DF 33 4D 31 DF 73 2D 06 00 4D 31 DF 33
7 330- 4D 31 DF 33 4D F1 1F 0E 06 00 4D 31 DF 33 4D 31
7340- 1F 1F 6E 0D 3E 1F 37 4D 31 00 4D 31 DF 73 0D 1E
7350- 17 0D 15 DF 33 4D 31 00 4D 31 DF 33 4D F1 1F 0E
7360- 36 06 00 2D 2D BE 1E 17 1E 2E 2D 35 00 2D F5 3B
7370- 2E 3E 2E 3E 2E 2D 06 00 72 0E 0E 0E 06 00 29 2D
7380- 3E 2E 3E 2E 3E DE 2D 35 00 09 0E 3F 1E 0D 0D DE
7390- 36 36 00 92 92 2A 2D 2D 35 00 49 1E 06 00 52 75
7 3A0- 3E F7 4D 0E 1F 37 00 36 0D 75 DF 37 4D 31 DF 37
73B0- 0D 35 00 52 2D 0E DF 33 6E 09 1E 3F 06 00 49 31
73C0- FE F7 4D 35 DF 33 4D 35 1F 37 00 52 2D 0E DF 73
73D0- 49 3F 3F 76 2D 06 00 09 75 DF 0E 3F 0E 36 36 00
73E0- 52 6D 3E DF 6E 29 FE 77 09 1E 3F 06 00 36 2D 75
73F0- DF 33 4D 31 DF 33 4D 31 00 09 16 77 36 0E 3F 06
7400- 00 49 16 77 36 FE 73 35 00 36 4D F1 DF 6E 0E 1F
7410- 37 4D 31 00 29 36 36 F6 2D 06 00 12 6D 0E 1F 1F
7420- 6E 0D FE 1F 6E 0D 06 00 12 0D 75 DF 37 4D 31 DF
7430- 33 4D 31 00 52 2D 0E DF 33 4D 31 DF 73 2D 06 00
7440- 12 0D 75 DF 37 4D 31 DF 77 09 FF 36 00 52 6D 3E
7450- DF 6E 09 3E DF 0E 6D 36 00 12 0D 75 DF 37 36 06
7460- 00 52 49 3F F7 0E 2D 0E 1E 3F 37 00 0A 4E 3F 77
7470- 36 4D 1E 37 00 12 4D 31 DF 33 4D 31 FF 73 6D 06
7480- 00 12 4D 31 DF 33 4D F1 1F 0E 06 00 12 4D 31 1F
7490- 1F 6E 0D FE 1F 0E 0D 06 00 12 4D F1 1F 0E 0E 1F
74A0- 1E 4D 31 00 12 4D 31 DF 33 40 F1 1F 0E 1E 37 00
74B0- 12 2D 2D 1E 1E 1E 1E 20 2D 06 00 09 2D DE 73 1E
74C0- 77 F1 0E 2D 06 00 09 36 36 36 36 00 2D 0E 1E 4E
74D0- F7 0E 1E 3F 06 00 29 4D 1E FF 33 00 49 2D 2D 2D
74E0- 3E 3F 3F 37 2D 2D 2D 3E 3F 3F 37 2D 2D 2D 3E 3F
74F0- 3F 37 2D 2D 2D 3E 3F 3F 37 00 29 3E 1E 2D 35 3F
7500- 37 2D 35 3F 37 4D 06 00 4D 3E 3F 2E 2D 3E 3F 2E
7510- 2D 1E 77 37 00 2D 2D 75 39 3F 3F 37 2D 2D 2D DE
7520- 3F 3F 37 00 09 2D 2D F5 3F 3F 3F 2E 2D 2D 75 3F
7530- 3F 37 00 09 75 39 3F 3F 2E 2D 2D DE 37 00 49 31
7540- 0E 3F 1E 6D 75 39 FF 1B 3F 4E 6D F5 3F 0E 36 00
7550- 49
CAPÍTULO 14
NUCLEAR FALLOUT DE
ALTA RESOLUÇÃO
178 Jogos de Ação para o Apple

Novamente você está tentando proteger a terra de partículas nuclea­


res caindo do céu. Mas desta vez, muitas partículas caem de uma só vez
e explodem quando batem no chão. Isto é uma guerra séria! Será que seu
prato de controle nuclear pode alcançar todas as partículas em tempo?
Isto exige não só reflexos rápidos mas também previsão e planejamento.
O esquema geral de Nuclear Fallout de Alta Resolução e o de Nuclear
Fallout no Capítulo 8 são os mesmos. Você deverá apanhar tantas partí­
culas nucleares quahto puder, no seu prato de controle nuclear. Mas,
fora isso, os dois jogos são bastante diferentes.
Neste capítulo você aprenderá várias técnicas novas de programa­
ção, incluindo como colôcar instruções de usuário dentro de seus progra-
tnas de jogos; màiores informações de como usar matrizes de dados de
figuras; como animar figuras múltiplas; e como fazer explosões de alta
resolução.

COMO JOGAR NUCLEAR FALLOUT DE ALTA RESOLUÇÃO

Digite a Listagem 14.1 é grave-a no seu disco Jogos de Ação como


“HR.NUC.FALLOUT”. Além de necessitar do Criador de Som (Capítulo 7),
você terá de criar a tabela de figuras Conjunto Fallout. Para fazer a ta­
bela de figuras, ou faça as figuras mostradas na Figura 14.1 usando o Edi­
tor de Tabela de Figuras, ou digite o arquivo binário dado na Listagem
14.2. Se você digitar o arquivo binário, digite “BSAVE FALLOUT.SET,
A28672.L49" para gravá-lo no seu disco Jogos de Ação.
Quando você roda Nuclear Fallout de Alta Resolução, você será per­
guntado se quer instruções. Tecle <S> se quer, ou <N> se não quer.
Uma vez começado o jogo, você verá o seguinte: ESCORE = 0 na base da
tela na janela de texto; seu prato de controle nuclear perto da base da tela;
e uma única partícula nuclear pequena caindo do topo da tela. Seu obje­
tivo é colocar seu prato embaixo da partícula para pegá-la. Manobre o
prato usando a vírgula (<,>) e o ponto (<•>) para movimentos rápidos
(onde o prato anda doze pixels por vez), e <Z> e <X> para movimen­
tos lentos (onde o prato anda um pixel por vez). Para parar o movimento
'do prato, aperte a barra de espaço. Seu prato de controle pode ultrapas­
sar a tela; ou seja, pode sair pelo lado esquerdo e reaparecer no lado
direito. Esta característica deve ser usada para apanhar duas partículas'
que estão caindo mais ou menos no mesmo nível mas longe uma da outra
na tela. Você recebe vinte e cinco póntos para cada partícula que apanhar
e perde dez pontos para cada pártícula que atinge o chão.
O jogo começa com uma partícula nuclear caindo do céu. Depois de
você pegar a partícula ou ela atingir a terra, começam a cair duas partí­
culas, e assim por diante, até haver dez partículas caindo do céu de uma
só vez. Então, à medida em que cada partícula for apanhada ou atingir
a terra, a partícula não é reposta, e o jogo continua até não haver mais
partículas na tela.
Nuclear Fallout de Alta Resolução 179

QUADRO 14.1
VARIÁVEIS PRINCIPAIS EM HR. NUCLEAR. FALLOUT
VARIÁVEL EXPLICAÇÃO
AD Endereço da tabela de figuras
FP( ) Matriz de indicadores para partículas; um elemento
será 1 se a partícula está ativa, 0 se inativa
HB( ) Byte mais significativo na definição da função
LB( > Byte menos significativo n$ definição da função
MX Movimento do prato ao longo da.coordenada X;
quantidade sorrjada a X para posição seguinte
PC Contagem de partículas; índice para partícula atual
PN ■ Número da partícula atualmente ativa
S2X Velocidade do prato (movimento incremental) com
teclas X e Z
SX Velocidade do prato (movimento incremental) com as
teclas, e.
SY Velocidade ná direção Y da partícula cadente
UF Indicador “para cima”, 1 durante a fase crescente, 0
durante a decrescente
X Coordenada X do prato
XL Coordenada X antiga do prato
XP( ) Coordenada X das partículas,
Y Coord,enada Y do prato
YL Coordenada Y antiga da.partícula
YP( ) Coordenada Y das partículas

EXPLICAÇÃO DO PROGRAMA

O Nuclear Fallout de Alta Resolução segue a mesma Organização


Geral de Programas que o Wipeout de Alta Resolução. O Quadro 14.1 rela­
ciona as variáveis-chaves.
Alguns itens de explicação e revisão referentes à seção Arranjo são
os seguintes:
Lembre-se, o HIMEM:34304 iniciaf na linha 200 é para assegurar-se
de que há espaço para carregar (BLOAD) a tabela de figuras no, endere­
ço de memória 28672. O endereço 34304 é logo abaixo da posição da me­
mória do GPLE, caso você esteja usando este editor. Se não estiver, você
poderia ajustar o HIMEM inicial para 38400.
Depois que a tabela de figuras do Conjunto Fallout for carregada
(BLOÁD), HIMEM é ajustado abaixo do endereço da tabéla de figüras, em
28671 (linha 280).
O comando &RESUME na linha 280 é colocado no arranjo do progra­
ma, muito embora não seja dada opção no ciclo principal para desligar o
som. Isto assegura que o som está íigadõ em caso de você o hàver des­
180 Jogos do Ação para o Apple

ligado num programa anterior e então rodar o Nuclear Fallout de Alta Re­
solução sem voltar a ligá-lo. O &RESUME serve como uma segurança pa­
ra que você tenha som quando desejar.

Instruções ao Usuário

Quantas vezes você deixou de jogar por um longo tempo, e quando


tentou novamente, não conseguiu lembrar dos comandos de teclado? A
solução é incluir instruções ao usuário no próprio programa. Fizemos isto
no Nuclear Fallout de Alta Resolução.
A linha 400 pergunta se você quer instruções. O CALL-958 naquela
linha apaga a tela do cursor à base da janela de texto. Isto é necessário
para o caso de você apertar uma tecla, errada ao invés de responder “S”
ou “N” para a pergunta. O programa vai de volta da linha 440 para a linha
400, onde o CALL-958 apaga a tecla errada da tela.
A declaração GOSUB 7000 na linha 400 chama uma pequena sub-ro-
tina para mostrar “(S/N)” na tela e pegar (GET) uma tecla. Isto é posto
numa sub-rotina porque o mesmo procedimento é usado mais tarde. Num
programa curto como o Nuclear Fallout de Alta Resolução, isto pode não
ser tão importante, mas num programa com muitas perguntas sim/não, a
sub-rotina poderia economizar tempo de programação e memória do com­
putador.
Sé o usuário responde “S” para esperar instruções, então a linha 420
chama a sub-rotina na linha 30000, e mostra as instruções. Na linha 440, o
programa verifica se o usuário teclou “N” e se ele não o fez, o programa
pula de volta para a linha 400 para conseguir um S ou um N do usuário.
Estas simples linhas demonstram o quão fácil é dar chance ao usuário
para conseguir estas instruções na seção Arranjo. As instruções mesmo,
na sub-rotina na linha 30000 deste programa, são curtas e simples. Para
alguns jogos, você pode ter que escrever instruções mais longas. Estas
são facilmente acomodadas neste projeto geral de programas.

Matrizes de Dados de Figuras

No capítulo anterior (Wipeout de Alta Resolução), usamos matrizes de


dados de figuras para guardar as coordenadas da tela de alta resolução
dos Kloryons e das minas espaciais. No Nuclear Fallout de Alta Resolu­
ção, estendemos o uso das matrizes para permitir a animação de muitas
figuras de uma só vez e para verificar as figuras que aparecem na tela e as
que não.
Como mencionamos no Capítulo 13, uma matriz é um grupo de dados
intimamente relacionados. Cada número ou caractere no conjunto de da­
dos é chamado um elemento da matriz. No Nuclear Fallout de Alta Reso­
lução, usamos três matrizes. Cada matriz tem dez elementos, um para cada
das dez partículas que aparecem no jogo.
Nuclear Fallout de Alta Resolução 181

A matriz FP(10) de variáveis é a matriz da partícula. Ela guarda quais


partículas estão ativas (na tela) e quais estão inativas (não na tela). Se
uma partícula estiver ativa, seu elemento correspondente é fixado em 1; se
a partícula estiver inativa, seu elemento é fixado em zero. Chamamos este
tipo de variável de indicador. Um valor de 1 significa que o indicador está
posicionado, significando “sim” ou “verdade”. Um valor de 0 significa que
o indicador não está posicionado, significando “não” ou “falso”.
A matriz FP é DIMensionada na linha. 280 e inicializada nás linhas
600-620. Quando o jogo começa, só uma partícula está ativa na tela. Isto
é arranjado na linha 600:FP(1) é fixado em 1; a posição inicial desta par­
tícula na tela é escolhida aleatoriamente e armazenada na matriz das co-i
ordenadas (como explicado abaixo); e finalmente a primeira partícula é;
desenhada na tela. Na linha 620, todos os outros elementos da matriz são
fixados em zero, indicando que todas estas partículas estão correntemen­
te inativas.
As matrizes de variáveis XP(10) e YP(10) são DIMensionadas na linha;
280. Elas armazenam as coordenadas X,Y para cada uma das dez par­
tículas. A primeira partícula surge na tela num local escolhido aleatoria­
mente (veja linha 600). A coordenada X começa com um valor no limite
de 0 a 279, que é qualquer lugar ao longo da largura da tela de alta reso­
lução. A coordenada Y pode assumir qualquer valor de 0 a 76, em múlti­
plos de quatro; ou seja, 0, 4, 8,.. .,68, 72, e 76. Conforme uma partícula
cai na tela, ela se mové em incrementos de quatro pixels. Não casualmen­
te, o prato na base da tela está sempre posicionado em Y = T56, um núme­
ro par, múltiplo de quatro. Iniciando cada partícula num número par, múlti­
plo de quatro, e movendo cada partícula através de incrementos de qua­
tro, asseguramos que a partícula sempre aterrissará no prato de controle
(se ele tiver sido posicionado corretamente pelo usuário) e não saltará
sobre ele.

Animação de Figuras Múltiplas

A técnica de mover diversas partículas na tela de uma só vez pode


ser aplicada a muitos tipos de jogos de ação. Para animação de figuras
múltiplas o seu programa deve seguir estes princípios:
1. Se você tiver mais de três a cinco figuras animadas, guarde as
figuras usando matrizes de dados, como descrevemos acima.
2. Para cada figura, você precisa de um indicador, assim o progra­
ma sabe se a figura está ativa ou não. No Nuclear Fallout de
Alta Resolução, o indicador para cada uma das dez partículas
possíveis é um elemento da matriz FP(10), como explicado acima.
3. Para cada figura, você precisa de uma variável para as coorde­
nadas X e Y na tela de alta resolução. No Nuclear Fallout de Alta
Resolução, as coordenadas das dez partículas são armazenadas
nas matrizes de variáveis XP(10) e YP(10), como explicado acima.
4. Durante cada passagem pêlo ciclo principal, o programa move
de um incremento uma ou mais figuras. No Nuclear Fallout de
182 Jogos de Ação para o Apple

Alta Resolução, só uma partícula se move durante cada passa­


gem pelo ciclo principal. A variável PC (para Contador de Partí­
culas) guarda qual partícula deve mover durante cada passagem.
Daí, na linha 3000, PC é incrementado de 1 a cada passagem. Se
PC ultrapassar 10, então é ajustado de volta para 1, como só há
dez partículas. Na linha 3020, ó programa verifica se a partícula
corrente (dada por PC) está ativa. Se não, o programa salta de
volta para a linha 3000 para verificar a próxima partícula. Uma
vez encontrada uma partícula ativa, PC se torna o índice para as
matrizes da partícula.
5. A animação das figuras segue as mesmas regras da animação
resumida no Capítulo 3 e aplicadas aos gráficos de alta resolu­
ção no Capítulo 13. Analise a Listagem 14.1 para ver que cada
partícula segue os sete passos da animação.
6. A qualquer hora, durante o jogo, que uma figura deva ser remo­
vida da tela, simplesmente apague-a com o comando XDRAW, e
fixe seu indicador em 0. No Nuclear Fallout de Alta Resolução,
sempre que uma partícula chega à base da tela (veja a linha
3080), ela é apagada da tela e seu indicador fixado em zero na
linha 3500.
7. A qualquer hora, durante o jògo, que uma figura deva ser anexa­
da à tela, simplesmente fixe seu indicador em 1 (ativa). Selecione
as coordenadas X,Y iniciais, e desenhe-as (XDRAW) na tela. Isto
é concluído nas linhas 3520 a 3700 do Nuclear Fallout de Alta
Resolução. A linha 3520 reativa a partícula que foi removida da
tela na linha 3060 (durante a fase de preparação do jogo, quan­
do UF = 0; veja a linha 3510). A linha 3700 ativa uma nova partí­
cula (também durante a fase de preparação do jogo). Durante â
fase eliminatória (quando UF = 1), partículas são apagadas da
tela e não repostas, então as linhas 3520-3700 são puladas.
Estas técnicas podem ser aplicadas a qualquer jogo no qual haja
muitas figuras se movendo na tela de uma só vez. Por exemplo, você tal­
vez queira escrever um jogo de invasores em alta resolução, seguindo o
projeto básico do programa dado para Invaders no Capítulo 9, mas usan­
do figuras múltiplas de alta resolução como explicado neste capítulo.

Explosões de Alta Resolução

O Space Hunter (Capítulo 10) apresentou as explosões de baixa re­


solução. Embora os mesmos princípios básicos se apliquem, as explosões
de alta resolução parecem melhor e são realmente mais fáceis de se pro­
gramar. Estes são os passos a seguir:
1. Usando o Editor de Tabela de Figuras, crie diversas figuras (ge­
ralmente de 2 a 5) para fazerem parte da seqüência da explosão.
No Nuclear Fallout de Alta Resolução, a seqüência da explosão
é feita apenas de duas figuras, números 3 e 4 na Figura 14.1.
Nuclear Fallout de Alta Resolução 183

2. Selecione diversos efeitos sonoros para fazerem parte da se-


qüência da explosão. O Editor de Som no Capítulo 7 pode aju­
dar, mas o melhor caminho é analisar os sons da explosão no
Nuclear Fallout de Alta Resolução e no Alien Defense, e elaborar
os seus próprios, tentando e errando.
3. Quando algo explode (uma bomba aterrissa ou um alienígena é
destruído), siga esta seqüência: (a) apague a figura original; (b)
desenhe (XDRAW) a primeira figura da explosão na tela; (c) emita
o som da primeira explosão; (d) apague a figura da primeira ex­
plosão da tela; (e) desenhe (XDRAW) a próxima figura da explo­
são na tela; (f) emita o som da próxima explosão; e (g) continue
os passos (e)-e (f) até que a seqüência da explosão esteja com­
pleta. A sub-rotina da explosão, linhas 25000-25020, mostra cla­
ramente estes passos.

MELHORIAS E MODIFICAÇÕES

Algumas melhorias óbvias para o Nuclear Fallout cfe Alta Resolução


são usar as técnicas de programação explicadas nos capítulos anteriores.
Por exemplo, você poderia anexar uma característica de pausa (Capítulo
13); permitir que o som seja ligado e desligado (Capítulo 8); usar um pad­
dle ou joystick (Capítulo 6); ou incluir níveis de dificuldade mudando o ta­
manho do prato de controle (Capítulo 8).
O jogo seria mais excitante se as dez partículas estivessem ativadas
por um período mais longo. Para fazer isso, use outra variável, CJ (para
contador de jogos). Anexe “CJ = 0” à linha 520. Apague tudo da linha
3560, exceto NEXT K. Finalmente, anexe à linha “3580 CJ = CJ + 1 : UC
- (CJ = 10) : GOTO 5000”. A variável UC é um indicador que é;0 durante
a fase de arranja do programa; ela se torna 1 durante a fase eliminatória.
A variável CJ aumenta sem afetar UC até que ela chegue a 10 (no nosso
exemplo). A expressão booleana (CJ = 10) é zero quando CJ não é igual
a 10, e 1 quando CJ é igual a 10. Desta maneira, todas as dez partículas
ficam ativas por 10 vezes.
Outra maneira de estender o jogo é permitir mais partículas na tela.
Todavia existem dois problemas com isto. Primeiro o jogo perde velocida­
de com mais partículas. Segundo, muitas partículas chegam à base da tela
de uma só vez, tornando o jogo muito frustrante. Mas se você realmente
quiser aumentar o número de partículas para quinze por exemplo, mude
todos os 10 para 15 nas linhas 280, 620, 3000 e 3540.
Você aprendeu algumas técnicas chaves de programação, incluindo
instruções do jogo ao usuário; uso mais amplo de matrizes de dados;
animação de figuras múltiplas; e explosões de alta resolução. Tudo isto
ajudará a tornar seus joios mais divertidos.
184 Jogos de Ação para o Apple

Figura 13.1: WIPEOUT.SET

[A figura no canto superior esquerdo é#1, a figura no canto supe­


rior direito é#~2, a figura no canto esquerdo da fileira do meio é.# 3, etc.]

1
1X H r »-i 5
10
1 1 — — 20

10

20J
Nuclear Fallout de Alta Resolução 185

Listagem14.1: HR.NUC.FALLOUT

10 REM ************************
20 REM it HR.NUC.FALLOUT *
30 REM * BY SCOTT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM ************************
90 REM
190 REM

INTRODUÇÃO:

200 HIMEM: 34304: TEXT : HOME


220 VTAB 6: AS = ” HR NUCLEAR FALLOUT ": INVERSE
: GOSUB 6000: NORMAL : VTAB 8: AS = “BY
S. SCOTT ZIMMERMAN": GOSUB 6000: VTAB
10: AS = "COPYRIGHT CO 1985": GOSUB 6000
240 IF PEEK (28672) < > 4 THEN PRINT CHRS
(4 ) ; "BLOAD FALLOUT.SET,AS7000"
260 IF PEEK (768) < > 169 THEN PRINT CHRS
(4);"BRUN CRIADDR.SOM"
280 & RESUME : HIMEM: 28671: DIM FP(10),XP(10),
YPC10)
300 DEF FN HB(A) = INT (A / 256): DEF FN
LB(A) = A - FN HB(A) * 256
400 VTAB 23: CALL - 958: PRINT "QUER
INSTRUÇÕES?";: GOSUB 7000
420 IF AS = "S" THEN GOSUB 30000: GOTO 460
440 IF AS < > "N” THEN 400
460 200,80,Is AD = 28672: POKE 232, FN LB(AD):
POKE 233, FN HB(AD)
490 REM

ARRANJO:

500 HOME : HGR : SCALE= 1: RDT== 0: HCOLOR= 3


-2»
520 SX = 12:S2X = 1:SY = 4:SC = 0:UF = 0:PN
1: PC = 0
540 X =• 139: Y = 156: XDRAW 2 AT X,Y
580 VTAB 23: PRINT "ESCORE=" INVERSE : PRINT
"0": NORMAL
186 Jogos de Ação para o Apple

600 FP(1) = 1:XP(1) = INT ( RND (1)'* 280):


YP(1) - 4 * INT ( RND (1) * 20)s XDRAW
1 AT XP(1),YP(1)
620 FOR K = 2 TO 10;FP(K) = 0; NEXT K
990 REM

CICLO PRINCIPAL;

1000 IF PEEK ( - 16384) < 128 THEN 2000


1020 GET AT
1040 IF AT _*”
fl If THEN MX =
* - SX: GOTO 2000
1060 IF AT — . ir ti THEN MX = SX: GOTO 2000
1080 IF AT = 11 Z 11 THEN MX = - S2X: GOTO 2000
1100 IF AT = "X" THEN MX = S2X: GOTO 2000
1120 IF AT fl If THEN MX = 0
2000 XL == X
2020 X = X + MX
2040 IF X < 0 THEN X ■ ='274: GOTO 2500
2060 IF X > 274 THEN X = 0
2500 XDRAW 2 AT XL,Y; XDRAW 2 AT X,Y
2990 REM

MOVE PARTÍCULAS;

3000 PC = PC + I; IF PC > 10 THEN PC =1


3020 IF NOT FP(PC) THEN 3000
3040 YL - YP (PC) : YP (PC) = YP(PC) + SY
3060 XDRAW 1 AT XP(PC),YL: XDRAW 1 AT XP(PC),
YP(PC)
3080 IF YP(PC) < 156 THEN 5000
3100 IF PEEK (234) < 1 THEN & 250,4,1;SC
= SC + 25; GOSUB 8000; GOTO 3500
3120 GOSUB 25000:SC = SC - 10; GOSUB 8000
3500 XDRAW 1 AT XP(PC),YP(PC):FP(PC) = O;PN
= PN - 1
3510 IF UF THEN 3800
3520 FP(PC) = 1:XP(PC> = INT ( RND (1) * 279):
YP(PC) = 4 * INT ( RND (1) ♦ 20); XDRAW
1 AT XP(PC),YP(PC):PN = PN + 1
3540 FOR K = 1 TO 10; IF NOT FP(K) THEN 3700
3560 NEXT K;UF = 1: GOTO 5000
3700 FP(K) = 1:XP(K) = INT ( RND (1) * 279):
YP(K) = 4 * INT ( RND (1) * 20): XDRAW
1 AT XP (K) , YP (K) : PN = PN + 1
3800 IF PN - O THEN 10000
Nuclear Fallout de Alta Resolução 187

5000 GOTO 1000


5990 REM

SUB-ROTINAS:

6000 HTAB (40 - LEN (Aí) ) ./ 2: PRINT Aí: RETURN

7000 PRINT (S/.N) GET Aí: PRINT Aí: RETURN

S000 VTAB 23: HTAB 8: INVERSE : PRINT SC;:


NORMAL : PRINT " RETURN
9990 REM

FIM DO JOGO:

10000 TEXT : HOME : VTAB 8:Aí = "GAME OVER":


GOSUB 6000
10020 VTAB 12: PRINT "SEU ESCORE NESTE JOGO:
";: INVERSE : PRINT SC: NORMAL
10040 IF HS < SC OR SN = O THEN HS = SC
10060 VTAB 14: PRINT "ESCORE MAX. NESTA SESSÃO:
INVERSE : PRINT HS: NORMAL
10080 VTAB 23: CALL - 958: PRINT "JOGAR DE
NOVO?";: GOSUB 7000
10100 IF Aí = "S" THEN GN = 1: GOTO 500
10120 IF Aí < > "N" THEN 10080
10140 HOME : END
24090 REM

EXPLOSÃO:

25000 XDRAW 1 AT XP(PC),YP(PC): XDRAW 3 AT XP(PC),


YP(PC) - 2: FOR J = 1 TO 10: & RND (1)
* 30 + 100,3,1: NEXT : XDRAW 3 AT XP(PC),
YP(PC) - 2-
25020 XDRAW 4 AT XP(PC),YP(PC> - 3: FDR J =
1 TO 20: & 250 - J,3,l: NEXT : XDRAW
4 AT XP(PC),YP(PC) - 3: XDRAW 1 AT XP(PC),
YP(PC): RETURN
29090 REM

INSTRUÇÕES:

30000 VTAB 12: CALL - 958: PRINT "ESTA CAINDO


SOBRE A TERRA UMA CHUVA": PRINT "NUCLEAR
MORTAL DE UM PLANETA ALIENÍGENA."
188 Jogos de Ação para o Apple

30020 PRINT "SUA TAREFA E PEGAR TANTAS


PARTÍCULAS": PRINT "CADENTES QUANTO
POSSA."
30040 PRINT ; PRINT «PZ MOVER SEU PRATO PARA
A ESQUERDA USE": PRINT "A (VÍRGULA)
E PARA A DIREITA USE 0"
30060 PRINT (PONTO). PARA MOVER MENOS,
USE": PRINT "AS TECLAS 'Z' E 'X'. PARA
PARAR SEU": PRINT "PRATO, USE A BARRA DE
ESPAÇOS."
30080 VTAB 23: PRINT "TECLE <ESPAÇO> PARA COMECAR
□ JOGO -> GET At-: PRINT À$: HOME :
RETURN
Nuclear Fallout de Alta Resolução 189

Listagem 14.2: FALLOUT.SET

7000- 04 00 0A 00 0D 00 17 00 21 00 49 31 00 2D 2D 2D
7010- 2D 2D 2D 2D 06 00 09 49 0D 56 F9 IB IF 56 4D 06
7020- 00 09 4D Bl 09 DF DB IB 0E 4D Bl DB 6B 49 0D 06
7030- 00
CAPITULO 15
RACQUET
Racquet 191

Nolan Bushnell em 1972 escreveu um dos primeiríssimos jogos de


ação para computador. Começando com um investimento de $500, ele
fundou sua própria companhia para vender o jogo. Quatro anos mais tar­
de vendeu a companhia por $28 milhões. A companhia era a Atari. O jo­
go era PONG.
Depois do sucesso de PONG, diversas companhias escreveram e co­
mercializaram jogos de tênis e handebol. Para não ficarmos para trás, in­
troduzimos nossa versão para o Apple: Racquet! Nós não pensamos que
Racquet faturará $28 milhões. Realmente achamos que você irá se diver­
tir ao jogá-lo, e terá mais divertimento ainda em aprender as técnicas de
programação que ele demonstra.
Racquet faz uso de muitos métodos e princípios discutidos até agora
neste livro. Racquet também introduz as novas técnicas de codificação pa­
ra um jogo de dois jogadores, permitindo a seleção de entrada (paddles
ou teclado); programando uma bola saltitante e usando o comando
SCALE.

DIGITANDO RACQUET

Digite a Listagem 15.1 no seu computador e grave o jogo para .o seu


disco Jógos de Ação como “RACQUET”. Você precisará também do
Criador de Som (veja Capítulo 7), certificando-se assim de que você tem
o programa disponível no seu disco quando você rodar Racquet.
Embora Racquet use uma tabela de figuras, você não tem que criá-
la com o Editor de Tabela de Figuras. O arquivo da figura contém só uma
figura — um único ponto — que requer só seis bytes. Ele é incluído (PO­
KE) na memória na linha 240. A posição da tabela de figuras é a mesma
que em todos os outros jogos de alta resolução neste livro, $7000 ou
28672. HIMEM é ajustado abaixo daquela posição na linha 280. O endere­
ço da tabela de figura é incluído (POKE) nos endereços especiais 232 e
233 na linha 620. Não definimos e. não Usamos as funções LB e HB em
Racquet como fizemos em outros jogos de alta resolução, mas a linha 620.
inclui (POKE) o endereço correto da tabela de figuras ($7000). nas posi­
ções corretas (232 e 233).

COMO JOGAR RACQUET

Racquet é uma mistura entre tênis de mesa e “racquetball”. Ele é


jogado numa' quadra murada muito parecida com “racquetball”, mas usa
uma rede como tênis de mesa.
Quando você roda Racquet pela primeira vez, o programa mostra o
título do jogo e faz a pergunta: "TECLADO OU PADDLES? (T/P)”. Tecle
<T> para usar o teclado, ou <P>, para paddles. Se você selecionar
paddles, ser-lhe-á avisado que o jogador da esquerda usa o paddle 0 e
o jogador da direita usa o paddle 1.
192 Jogos de Ação para o Apple

A seguir, a declaração “ENTRE TAMANHO RAQUETE (5-25)—>”


permite a você entrar o número de pixels (de 5 a 25) para o tamanho de
suas raquetes. Isto é essencialmente perguntar o nível de dificuldade, pois
um-tamanho maior de raquete torna o jogo mais fácil.
O programa prossegue então para o jogo. Nos extremos esquerdo e
direito da tela, você verá linhas verticais representando as duas raquetes
No topo e na base da tela, você verá longas linhas horizontais represen­
tando as paredes laterais da quadra do Racquet. A linha vertical ponti­
lhada no centro da tela representa a rede. Finalmente, na base da tela
na janela de texto, você verá o escore de cada jogador.
O programa escolhe aleatoriamente que jogador saca primeiro. De­
pois de uma curta pausa, o programa fornece a bola automaticamente.
Cada jogador continua a servir até que perca um -ponto. O objetivo deste
jogo é o de cada jogador manter a bola sem passar pela raquete e sair
das bordas. Se um jogador deixa a bola passar além das bordas, o opo­
nente ganha um ponto. O vencedor é o primeiro jogador a fazer 15 pontos.
Os jogadores movem suas raquetes ao girar o dial do seu paddle, ou
se eles tiverem escolhido controle pelo teclado, ao pressionar as seguin­
tes teclas:
Comando de Teclado Comando de Teclado
Movimento da Raquete Jogador da Esquerda Jogador da Direita
P/ Cima Q P
P/ Baixo Z vírgula (,)
Parar A L
Cada conjunto de teclas está numa fileira perto do lado externo do
teclado para um acesso mais fácil pelos jogadores.
Se a raquete for parada, pressionar uma vez a tecla de cima ou
a de baixo para a raquete se mover suavemente na direção dada. Pres­
sionando a mesma tecla outra vez acelera a raquete (de um movimento
de um pixel para um movimento de cinco pixels durante cada passagem
pelo ciclo principal). A tecla de Parada pára o movimento da raquete in­
dependentemente de sua velocidade ou direção anteriores.
Se a sua raquete estiver se movendo para cima rapidamente e você
pressionar a tecla de baixo, a raquete reduzirá a velocidade mas ainda
continuará subindo. Pressionar a tecla inferior novamente parará a ra­
quete, e pressionando novamente fará a raquete mover-se lentamente
para baixo. Por isso, se sua raquete estiver se movendo rápido em uma
direção, você terá que pressionar a tecla oposta quatro vezes para ter a
raquete se movendo rapidamente na direção oposta.
Quando você usa paddles ao invés de teclado, a quantidade que vo­
cê gira o dial dita a direção e velocidade da sua raquete.
Você pode controlar não apenas a direção e velocidade do movimen­
to de sua raquete, mas também a direção que a bola rebate de sua raque­
te. Se você bater a bola perto do topo da raquete, a bola irá bem alto por
sobre a rede; se você rebater a bola perto da base da raquete, ela passa-
Racquet 193

rá raspando sobre a rede. Melhores jogadores aprendem a usar estes ân­


gulos de rebate para sua vantagem.

EXPLICAÇÃO DO PROGRAMA

Você pode pensar que um jogo de dois jogadores tem um projeto


completamente diferente do de um jogador, mas uma rápida olhada na
Listagem 15.1, mostra a você que o Racquet usa a mesma Organização
Geral de Programas, como a maioria dos outros jogos neste livro.
As variáveis-chaves em Racquet estão relacionadas no Quadro 15.1.

QUADRO 15.1
VARIÁVEIS PRINCIPAIS EM RACQUET
VARIÁVEL EXPLICAÇÃO
BP Indicador de bola em jogo (1 para ativo, 0 para inativo)
CL Variável usada no controle do paddle para fazer com
que a raquete pare na borda da tela
CN Indicador de controle (1 para controle de paddle, 0 para
teclado)
DS Atraso para variável de serviço
MO Movimento da raquete na esquerda [PDL(O) ou
teclado]
Ml Movimento da raquete na direita [PDL(1) ou teclado]
MX Movimento da bola ao longo da coordenada X
MY Movimento da bola ao longo da coordenada Y
OO Posição antiga da raquete esquerda (na direção Y)
01 Posição antiga da raquete direita (na direção Y)
PO Valor de PDL(O)
P1 Valor de PDL(1)
RS Tamanho da raquete (em pixels)
S Indicador de serviço (0 para jogador na esquerda:
1 para direito)
50 Escore do jogador da esquerda
51 Escore do jogador da direita
X Coordenada X da bola
XO Coordenada X antiga da bola
YO Coordenada Y da raquete esquerda
Y1 Coordenada Y da raquete direita
Y Coordenada Y da bola
YO Coordenada Y antiga da bola
194 Jogos de Ação para o Apple

Jogos de Dois Jogadores

Programar jogos para dois jogadores é parecido com a programação


para a animação de objetos múltiplos descrita no Capítulo 9. A única di­
ferença é que a fonte da entrada do usuário determina quais objetos se
moverão e como eles se moverão.
Em Racquet, cada passagem pelo ciclo principal anima três objetos
— a raquete da esquerda, a raquete da direita e a bola. Cada figura tem
seu próprio incremento de movimento e coordenadas X,Y, e cada uma
das raquetes é controlada por teclas de entrada diferentes ou um paddle
diferente.
Se você olhar as linhas 1060-1140, verá que as teclas controladas por
cada um dos jogadores (Q, A, e Z pelo jogador da esquerda, e P, L, e vír­
gula (,) pelo jogador da direita) afetam a raquete apropriada na maneira
descrita acima.
Duas coisas podem confundi-lo sobre as linhas 1060. A primeira é o
uso de expressões como (M0 = 5) dentro de um cálculo. Estas são ex­
pressões booleanas usadas para determinar o movimento das raquetes.
Explicaremos estas expressões no próximo capítulo (Alien Defense).
A outra coisa que pode confundi-lo é a ordem que as declarações IF
são dadas. À primeira vista parece que o jogador da esquerda leva van­
tagem, visto que as teclas Q, A e Z são verificadas antes das teclas P, L
e vírgula. De fato, a ordem da verificação dás teclas não importa muito. A
última tecla pressionada antes de o programa executar a linha 1020 é a
tecla atribuída a A$. Conforme os dois jogadores pressionam as teclas
durante o jogo, cada um tem uma chance igual de apertar a última tecla
antes da linha 1020. Jogue como mostrado, então rearranje a ordem da
verificação de teclas e jogue novamente. Veja se você pode notar algu­
ma diferença.

Seleção de Entrada (Paddle/Teclado)

Programar um jogo para permitir seleção de entrada requer o se­


guinte:
1. Pergunte ao(s) jogador(es) pelo tipo de entrada desejado. Em
Racquet, isto é feito na seção Arranjo do programa (veja linha
500), onde o jogador deve selecionar ou entrada via teclado ou
via paddle.
2. Ajuste um indicador de controle para indicar a seleção do joga­
dor. Por exemplo, em Racquet, o indicador CN (número de con­
trole) é ajustado para 0 se o jogador selecionar entrada via te­
clado (linha 540), ou ajustado para 1 se o jogador seleciona en­
trada via paddlé (linha 580).
3. Durante o ciclo principal, use o indicador de controle para sele­
cionar o código de entrada do programa a ser executado. Em
Racquet, o início do ciclo principal verifica o indicador de entra-
Racquet 195

da: se CN é 1 (“verdadeiro” dentro da declaração IF na linha


1000) então o programa chama a sub-rotina nas linhas 6000-6080
para receber a entrada via paddle (controlador manual). Se CN é
0 (“falso”) então a entrada via teclado é verificada (linhas 1010-
• 1140).
Seguindo estes três passos simples, você pode programar quase to­
do jogo de ação para usar o teclado, paddles, joystick ou mouse do Ap­
ple e permitir ao usuário escolher o periférico de entrada.

Bola Saltitante

Quando você atira uma bola no chão, você tem uma boa idéia de
como a bola irá pular (desde que a superfície seja suave e plana). A ex­
periência ensina-lhe que se você jogar a bola diretamente para baixo, ela
irá pular para cima. Se você jogá-la com um pequeno ângulo, pulará com
ângulo pequeno.e continuará na mesma direção.
Considere o movimento da bolá em termos das coordenadas X,Y. Se
você atirar a bola em um dado ângulo nas direções + X e + Y, ela pula
fora do chão (ignorando gravidade, fricção, resistência do ar, inelasticida-
de etc.) na mesma taxa e direção ao longo da coordenada X, e na me^ma
taxa ao longo da coordenada Y mas na direção Y oposta.
Em termos de código de programa, isto quer dizer que se uma bola
está indo em um ângulo da esquerda para a direita (+X) e do topo para
a base (+Y) na tela de alta resolução do Apple, a bola pula fora da base
da tela, movendo na mesma direção X mas mudando de positivo (+) para
negativo (-) na drieção Y.
As linhas 4040 e 4060 mostram isso. A linha 4040 é o passo da ani­
mação que calcula a nova posição da bola. A linha 4060 verifica se a bola
está no topo ou na base da tela, quér dizer, se deveria rebater. Se a bola
deveria pular, então o incremento da mudança na direção Y, MY, muda
seu sinal (de positivo para negativo e vice-versa).

Usando o Comando SCALE

Depois de afirmar no Capítulo 13 que você deveria ajustar SCALE e


deixá-lo em paz, agora mostramos a você uma exceção à regra. Em Rac­
quet, usamos uma figura de um ponto para representar a raquete, e então
ajustar SCALE toda vez que a raquete for desenhada (XDRAW) para o ta­
manho desejado. A linha 3020 da Listagem 15.1 mostra isto. SCALE é ajus­
tado para o tamanho RS da raquete, selecionado no Arranjo (veja linha
600) toda vez que a raquete for desenhada (XDRAW). Então, quando a
bola é desenhada, SCALE é ajustado de volta para 1 (veja linha 6500).
O comando SCALE é usado desta maneira pois a programação é
simplificada; não é preciso fazer várias figuras para os diferentes tama­
nhos da raquete; e as figuras da raquete são tão simples que mudando-
se SCALE a figura não distorce.
196 Jogos de Ação para o Apple

MELHORIAS E MODIFICAÇÕES

Abaixo estão várias sugestões para melhorias ou modificações. Al-.


gumas destas mudanças requerem pouco trabalho outras um tremendo
esforço. Com sua experiência de programação e know-how, você deverá
ser capaz de calcular como fazer as mudanças.
1. Modifique o jogo para seguir um jogo padrão tal como tênis, han­
debol, “racquetball”, “squash”, tênis de mesa ou “badminton”.
Você poderia colocar ambas as raquetes no mesmo lado da tela,
mudar a disposição da quadra, modificar o escore e revisar o
método de servir, dependendo do jogo que você quer.
2. Pérmita ao jogador competir contra o computador, num jogo Rac­
quet de um só jogador. Isto pode envolver alguma programação
difícil. Você pode não achar difícil fazer o programa calcular pa­
ra onde a bola irá depois de deixar sua raquete, e então fazer a
raquete se mover de acordo. A parte difícil será programar o
computador para fazer erros “humanos”. Uma idéia mais sim­
ples seria programar um jogo de handebol onde o jogador sim­
plesmente bate contra a parede e tenta fazer tantos acertos se­
guidos quanto possível.
3. Dê um sistema de vantagem deixando os jogadores escolherem
seus tamanhos de raquetes independentemente. Se dois jogado­
res, de habilidades muito diferentes, competirem, um jogador po­
deria ajustar o tamanho da raquete a vinte e cinco enquanto o
outro jogador ajusta o tamanho da raquete para cinco. Esta mo­
dificação seria bastante fácil de se fazer.
4. Acelere o programa usando um compilador. Você teria de mu­
dar o incremento de movimento da bola de cinco pixels para um
e fazer as outras mudanças antes de compilar o programa. Mas
a ação na versão compilada seria rápida e suave. Veja o Capítu­
lo 9 para um exemplo de compilar Applesoft.
Temos certeza de que você pode pensar em outras maneiras de me­
lhorar o Racquet. Você provavelmente ainda não seguirá os passos de
Nolan Bushnell tornando-se um multimilionário com sua criação, mas
pode certamente se divertir, tentando.
Racquet 197

Listagem 15.1: RACQUET

10 REM ************************
20 REM * RACQUET *
30 REM * BY BRENT ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM ************************
90 REM
190 REM

INTRODUÇÃO:

200 TEXT : HOME


220 VTAB 3: HTAB 16: INVERSE : PRINT " RACQUET
NORMAL : VTAB 5: HTAB 11: PRINT "BY
BRENT ZIMMERMAN": VTAB 7: HTAB 11: PRINT
"COPYRIGHT (C) 1985"
240 FOR I = O TO 5: READ X: POKE 28672 + I,
X: NEXT I: DATA 1,0,4,0,6,0
260 IF PEEK (768) < > 169 THEN PRINT CHRS
(4);”BRUN CRIADOR.SOM"
280 S< RESUME : HIMEM: 28671
490 REM

ARRANJO

500 VTAB 14: PRINT "TECLADO OU PADDLES? (T/P)

540 SET KPS: IF KPS = "T" THEN CN - 0: PRINT


"TECLADO": GOTO 600
560 IF KPS < > "P" THEN 540
580 PRINT "PADDLES":CN = 1: PRINT : PRINT
"JOGADOR DA ESQUERDA USA 0 PADDLE 0": PRINT
"JOGADOR DA DIREITA USA 0 PADDLE 1“
600 VTAB 19: INPUT "ENTRE TAMANHO DA RAQUETE (5-
25) -> "j.RS: IF RS < 5 OR RS > 25 THEN
600
620 POKE 232,0: POKE 233,112: SCALE= RS: ROT=
O: HCOLOR= 3
640 & 200,30,1: HOME : HGR
660 CL = 255 / (158 - RS):S = INT ( RND (1)
* 2)
198 Jogos Ação para

680 YO = -80 - RS / 2:Y1 = YO:MX = 0:MY = Os


SO = Os SI = 0
700 XDRAW 1 AT 0,Y0; XDRAW 1 AT 279,Y1
720 HPLOT 0,0 TO 279,0: HPLOT 0,159 TO 279,
159
740 VTAB 23: HTAB 5: PRINT SO;; HTAB 34; PRINT
SI;
760 FOR I = 5 TO 159 STEP 20; HPLOT 140,1
TO 140,1 + 10; NEXT
980 REM

CICLO PRINCIPAL;

1000 IF CN THEN GOSUB 6000; GOTO 3000


1010 IF PEEK ( - 16384) < 128 THEN 2000
1020 GET At
1040 IF At = "Q" THEN MO = MO - (MO > - 5)
- 3 * ((MO = 5) + (MO = - D): GOTO
2000
1060 IF At = "A'* THEN MO = 0; GOTO 2000
1080 IF At = «<z» THEN MO = MO + (MO < 5) +
3 * ((MO = - 5)i + (MO == 1)); GOTO 2000
1100 IF At = "P" THEN Ml = Ml - (Ml > - 5)
- 3 * ((Ml = 5) + (Ml = - 1>); GOTO
2000
1120 IF At = "L" THEN Ml = 0; GOTO 2000
1140 IF At = THEN Ml = Ml + (Ml < 5) +
3 * ((Ml = - 5)i + (Ml
1980 REM

VERIFICA BORDAS;

2000 00 = YOsOl = Y1;YO = YO + MOsYl = Y1 +


Ml
2020 IF YO > 159 - RS THEN YO = 159 - RS; MO
= 0; GOTO 2060
2040 IF YO < 1 THEN YO = 1: MO - 0
2060 IF Y1 > 159 - RS THEN Yl= 159 - RS; Ml
• = 0: G0T.0 3000
2080 IF Y1 < 1 THEN Y1 = 1:M1 = 0
2980 REM

DESENHA RAQUETES;

3000 IF CN THEN 00 = YOsOl = YlsYO » YO + MO;


Y1 = Y1 + Ml
Racquet 199

3020 SCALE» RS: XDRAW 1 AT 0,80s XDRAW 1 AT


0,Y0: XDRAW 1 AT 279,01s XDRAW 1 AT 279,
Y1
3980 REM

MOVE BOLAs
)

4000 IF NOT BP THEN DS = DS + Is’ IF DS > 25


THEN BP = 1:X » 279 * S:Y = YO * NOT
S + Y1 * S + RS / 2:MX IO* NOT S -
- 10 * S:MY » RND (1) * 8 - 4s SCALE»
1: XDRAW 1 AT X,Ys & 100,10
4020 IF NOT BP THEN 1000
4040 XO = XsYO = Y
4060 X = X + MXsY = Y + MY
4080 IF Y > 158 OR Y < 1 THEN Y - Y - MY: MY
= - MY: 225,5
4100 IF X > O THEN 4180
4120 IF Y > = YO AND Y < = YÕ +- RS THEN MX
= - MX:X= 0: GOSUB 6500: & 200,10:MY --
= Y - YO - RS / 2: GOTO 1000
4140 X = 0: GOSUB 6500s 8c 25,255: SI = SI + 1:
HTAB 34: PRINT S1;:BP = Os DS = 0:S =
Is XDRAW 1 AT X,Y: IF SI > 14 THEN 15000
4160 GOTO 4000
4180 IF X < 279 THEN 4260
4200 IF Y > » Y1 AND Y < = Y1 + RS THEN MX
= - MX:X = 279: GOSUB 6500s 8c 200,10s
MY = Y - Y1 - RS / 2s GOTO 1000
4220 X = 279: GOSUB 6500: 8c 25,255s SO » SO +
1: HTAB 5: PRINT SO;:BP = Os DS = OsS
= Os XDRAW 1 AT X,Ys IF SO > 14 THEN
10000
4240 GOTO 4000
4260 GOSUB 6500: GOTO 1000
5980 REM

SUB-ROTINAS:
/
6000 PO » PDL (O) / CL + 1: IF PO > YO + 20
THEN MO = 5: GOTO 6040
6020 IF PO < YO - 20 THEN MO = - 5s GOTO 6040
6030 MO = PO - YO
6040 Pl = PDL (1) / CL + 1: IF Pl > Y1 + 20
THEN Ml = 5: RETURN
200 Jogos de Ação para o Apple

6060 IF Fl < Y1 - 20 THEN Ml = - 5: RETURN

6080 Ml = Fl - Yl: RETURN


6500 SCALE= 1: XDRAW 1 AT X0,Y0: XDRAW 1 AT
X,Y: RETURN
99B0 REM

JOGADOR DA ESQUERDA GANHA:

10000 HTAB 5: FLASH : PRINT SO: GOTO 20000


14980 REM

JOGADOR DA DIREITA GANHA:

15000 HTAB 34: FLASH : FRINT SI


20000 PRINT : NORMAL : PRINT "GOSTARIA DE
JOGAR DE NOVO? (S/N)
20020 GET A$: IF A$ = "S" THEN TEXT : HOME
: GOTO 500
20040 IF AT < > "N" THEN 20020
20060 TEXT : HOME : END
CAPÍTULO 16
ALIEN DEFENSE
202 Jogos de Áçãó para o Apple

Você é o canhoneiro artilheiro principal. Sua tarefa é defender a ci­


dade destruindo os alienígenas antes de suas bombas atingirem-na.
Sua tarefa é grandemente ajudada por morteiros guiados a laser, que
podem mudar de direção sob seu controle, rhesmo depois de terem sido
disparados. Cada vez que disparar sua arma, você perde cinco pontos e
sempre que explodir uma bomba sobre sua cidade, você perde cinqüen­
ta pontos. Cada vez que destruir um alienígena, você ganha vinte e cinco
pontos, e cada vez que derrubar uma bomba alienígena, ganha quarenta
pontos.
Discutiremos quatro novas técnicas de programação neste capítulo:
desenhar um fundo de alta resolução; usar uma chave articulável para li­
gar e desligar o som; usar dados booleanos; e programar balas dirigíveis.

COMO JOGAR ALIEN DEFENSE

Digite a Listagem 16.1 no seu computador e guarde-o em seu disco


Jogos de Ação como “ALIEN.DEFENSE”. O jogo também requer o Cria­
dor de Som (Capítulo 7) e a Tabela de Figuras Conjunto de Defesa mos­
trado na Figura 16.1. A listagem binária da tabela de figuras é dada na
Listagem 16.2. Digite “BSAVE DEFENSE.SET,A28672,L287” para guardar
o arquivo binário para o disco.
Alien Defense mostra uma cidade em contorno e seu canhão de arti­
lharia na base da tela. Um alienígena voa acima da cidade no topo da
tela. Aperte a vírgula (,) para mirar o canhão para a esquerda e aperte o
ponto (.) para mirar para a direita. Aperte <X> para disparar um mor­
teiro. A direção da bala muda quando muda a mira do canhão. Assim,
A chave lig./desl. do som é o comando final de teclado em Alien Defense.
Depois de começar o jogo, você pode apertar o <S> para desligar o
som, e apertar o <S> para ligá-lo novamente.

QUADRO 16.1
VARIÁVEIS PRINCIPAIS EM ALIEN DEFENSE
VARIAVEL EXPLICAÇÃO
BC Contagem da bomba; número de bombas explodindo
sobre a cidade
BF Indicação de bomba; BF = 1 se bomba ativa, 0 se
inativa
GN Número do canhão; número de figura para direção
do canhão
MA Incremento de movimento do alienígena
NF Indicador de ruído; NF = 1 se som ligado, 0 se desligado
SC Escore do jogo
SF Indicador de morteiro; SF = 1 se morteiro ativo, 0 se
- inativo-
Alien Defense 203

QUADRÒ 16.1 (Continuação)


VARIÁVEIS PRINCIPAIS EM ALIEN DEFENSE
VARIÁVEL EXPLICAÇÃO
X1 Antiga coordenada X.da figura
XA Coordenada X do alienígena
XB Çoordenada.X da bomba
XG Coordenada X do canhão
XS Coordenada X do morteiro
Y1 Antiga coordenada Y da figura
YA Coordenada Y do alienígena
YB Coordenada Y da bomba
YG Coordenada Y do canhão
YS Coordenada Y do morteiro

EXPLICAÇÃO DO PROGRAMA

Alien Defense segue a Organização Geral de Programas que foi dada


no Capítulo 2 e aprimorada para os gráficos de' alta resolução no Ca­
pítulo 13. O Quadro 16.1 lista as variáveis-chayes. 0 programa utili­
za muitas das técnicas de programação já discutidas, inclusive os gráfi­
cos de alta resolução (Capítulos. 11-13), efeitos sonoros (Capítulos 7-8),
éxplosões de alta resolução (Capítulo 14), animação de’ objetos múltiplos
(Capítulos 9 e 14), e localizações e eventos randômicos (Capítulos 8-9).
Se você tiver dúvidas sobre estas técnicas, consulte os capítulos apro­
priados.

Fundos de Alta Resolução

. , Em muitos jogosdealta resolução, .você poderá querer- um fundo, tal


como um labirinto, uma pista de .corrida ou uma paisagem. Em Alien De­
fense usamos um fundo simples para representar uma cidade. Os contor­
nos dos edifícios são desenhados com os comandos HPLOT (veja Capítu­
lo 11) dados na sub-rotina nas linhas 6000-606Q da Listagem 16.1.
Quando você usar fundo de alta resolução, há vários pontos que de­
vem ser lembrados: .
1. Você pope produzir fundos usando comandos HPLOT para de­
senhartanto -linhasc.omo pontinhos individuais.
2. Se seu. fundo; contiver muitos itens de uma Só espécie, tal como
árvores semelhantes, casas ou naves alienígenas, você pode usar
tabelas de figuras de alta resolução para desenhar (DRÃW ou
XDRAW) os itens para a tèía. Isto é essencialmepte o que nós
fizemos para desenhar a tela inicial no Wipeout, de Alta Resolu­
ção (Capitulo Í3) embora não tivéssemos chamado os Kloryons
e as minas espaciais de fundo.
204 Jogos de Ação para o Apple

3. Para fundos complexos, os comandos HPLOT são muito desajei­


tados. Por exemplo, desenhar um mapa detalhado com HPLOTs
levaria tempo e seria irritante. Em tais casos, você pode desejar
usar um utilitário de gráficos que lhe permite esboçar na tela de
alta resolução. Tais utilitários lhe perrrlitem mover um cursor na
tela para desenhar qualquer* tipo de figura que desejar. Você
também poderá usar umáíabdfeta dé gráficos ou qualquer aces­
sório de hardware Semelhante para ajudá-lo- a desenhar telas de
alta resolução. Estes quadros podem ser gravados em disco e
então carregados (BLOAD) durante a seção de Arranjo de seu
programa de jogo.
4. Se você desejar que seus objetos animados passem sem serem
afetados sobre o cenário de fundo, você não poderá usar o con­
tador de colisão conforme foi usado neste livro (veja Capítulos
11 e 13). O contador de colisão detectará uma colisão quando
um objeto, tal como sua espaçonave, tenta passar sobre o fun­
do. Em tais casos, você terá de comparar as coordenadas dos
objetos animados para ver se ocorreram colisões importantes.
Por exemplo, se você conhece as coordenadas X,Y de sua espa­
çonave e as coordenadas X,Y de um míssil inimigo, você pode
usar a declaração IF para ver se os dois objetos estão bastante
próximos para uma colisão.
5. Ao desenhar um fundo de alta resolução, você não precisa se­
guir as Dicas de Alta Resolução dadas no Capítulo 13. As figu­
ras de fundo são desenhadas na tela uma vez no começo do jogo
(ou no começo de cada fase do jogo) e não são animadas nem
apagadas rapidamente. Portanto, as figuras de fundo podem ser
grandes e coloridas. Por outro lado, quando você usar um fundo
com figuras animadas, você precisa seguir as Dicas de Alta Re­
solução para a animação; mantenha as formas pequenas; ajus­
te SCALE a 1; ajuste ROT a 0; ajuste HCOLOR a 3; e, acima de
tudo, use comandos XDRAW e não DRAW.
Com estas sugestões em mente, você poderá desenhar programas
contendo seus próprios fundos criativos. Eles acrescentam maior signifi­
cado e interesse a seus joogs de computador.

Chaves Articuláveis

A maioria das chaves, tal como aquela atrás de seu computador, es­
tão ligadas quando você as volta para cima e desligadas quando você as
abaixa. Uma chave articulável, porém, é como em muitas TVs; quando
você a aperta, ela liga, se está desligada, ou desliga, se estiver ligada.
As chaves articuláveis são jeitosas pois reduzem o número de co­
mandos de computador dos quais precisa se lembrar. Por exemplo, no
Editor de Tabela de Figuras, o comando DOT ON/OFF é a tecla <D>;
portanto, você só precisa se lembrar de umq tecla para ligar ou desligar
os pontinhos (veja Capitulo 12).
Alien Defense 205

A maneira mais simples de programar chaves articuláveis no Apple­


soft BASIC é usar um indicador liga/desl. Este é uma variável que pode
estar ligada (com um valor de 1) ou desligada (com um valor de 0). Por
exemplo, em Alien Defense, o comando para ligar e desligar o som é
<S>. Para programar iôto, usamos a variável indicadora NF (para indi­
cadora de Ruído). Orfginalmente a indicador está ajustado a 1 (veja linha
260) para indicar que o som está ligado. Então a linha 1080 checa se o
usuário apertou <S>. A linha 1100 então desliga o som se NF estiver
presentemente em 1 (note que a sintaxe “IF NF THEN...” é equivalente a
“IF NF = 1 THEN...”) e ajusta NF a 0. A linha 1120 liga o som se NF esti­
ver presentemente em 0 e ajusta a 1.
Outras aplicações possíveis de chaves articuláveis nos seus jogos
são: pausa e não-pausa; pular entre modo paddle e modo teclado; comu­
tar entre dois níveis de dificuldade ou duas velocidades; e pular entre
texto e gráficos.

EXPRESSÕES BOOLEANAS

Uma técnica de programação freqüentemente ignorada ou incompre­


endida é o uso de expressões booleanas. O nome em si parece complexo
e difícil de compreender. Mas o conceito, tal como iremos usar, é bastan­
te simples.
Uma expressão booleana é uma expressão que, quando avaliada, é
verdadeira ou falsa. Por exemplo, num programa com a variável A e B, a
expressão “A = B” é geralmente usada para designar o valor de B para
A; isto é, o novo valor de A é igualado ao valor atual de B. Isto é chama­
do de uma declaração de designação. Por outro lado, o programa pode
ter uma declaração tal como “IF A = B THEN...”, caso em que o pro­
grama está checando para ver se A é igual a B; o programa não está de­
signando a A o valor de B. A expressão “IF A = B THEN” no último caso
é uma expressão booleana; ela é verdadeira ou falsa. No Applesoft BA­
SIC, uma expressão avaliada como verdadeira é ajustada para 1; uma ex­
pressão avaliada como falsa é ajustada para 0.
Para ver como isto funciona carregue seu disco Jogos de Ação e
aperte <ESC> para entrar no BASIC. Agora digite “A = 5” < RETURN >
e “B = 4” <RETURN > (deixaremos de lado o < RETURN > daqui para
frente mas você deve continuar a apertá-lo para entrar seus coman­
dos). Estas duas declarações BASIC designam valores para suas variáveis
A e B.
Agora digite “PRINT A = B” e seu Apple deverá imprimir a resposta
0, pois as duas variáveis não são iguais.
A seguir digite “B - 5” seguido de “PRINT A = B” e seu Apple res­
ponderá com: 1. O programa avaliou a expressão booleana A — B como
verdadeira (e igual a 1) pois agora as duas variáveis são iguais.
206 Jogos de Ação para o Apple

As expresspes bopleanas podem lhe poupar considerável tempo de


programação e energia sob certas circunstâncias. Por exemplo, em Alien
Defense, há.três posições de canhão — direita, esquerda e centro. Se vo­
cê apertar a tecla de .movimento à direita (o^.ponto), o canhão se move
da posjção esquerda pára.o centro, ou do centro para a direita. Se você
apertar a tecla de movimento à esquerda (a vírgula), o canhão se move
da direita para o centf,o,.ou do centro para a esquerda. Você poderia pro­
gramar tudo ,isto usandp uma série de declarações ^F, e seu código se
parecerjp cpm algo çprrjo a listagem a seguir. (GN é o número da figura
do canhão; o canhão apontando direto para cima é GN = 2; apontando
para a esquerda é GN = 3; apontando para a direita é GN = 4; e XG e YG
são as coordenadas do, canhão.)

1040 IF AS THJEN XDRAW GNAT XG, YG: GOTO 1044


1042 GOTO 1060
1044 IF GN = 3 THEN 2000
1046 IF GN = 2 THEN GN = 3: XDRAW GN AT XG, YG: GOTO 2000
1048 IF GN = 4 THEN GN = 2: XDRAW GN AT XG, YG: GOTO 2000

Você teria de. continuar com a mesma quantidade de código para


ÃS “.” (á féçla de ponto).
• Damos um:procedimento mais conciso na linha 1040 da Listagem
16.1. Ao invés de usar um conjunto complexo de declarações IF para de­
signar o valor correto, de QN, o programa usa uma declaração com várias
expressões,.|>ooleanas. ;‘GN - (GN = 4) * 2 + (GN = 2) * 3 + (GN = 3) *
3”. Se; por exemplo, GN for presentemente igual a 4, o programa avalia
a expressão GN =?-4 como 1 (verdadeiro), Ele avalia GN - 2 e GN = 3 co­
rpo 0 (falso), e ajusta.# novo GN para 2: “GN = 1 *2 + 0*3 + 0*3 = 2".
Assim, um grupo desajeitado de declarações IF é reduzido a upna expres­
são .simples usapd.o os valores booleanos apropriados,
O programa também usa expressões, booleanàs para determinar pm
qúê direção •atirar osahorteirosi'com'base?na atual -direção: do canhão»
Primeiro,: oprogramàdeterminâascoordenadâs iniciais:.xs e YS do mor­
teiro (veja linhas 1180-1200): A seguir, ’o-, programa'determina a direção
em que o. mqrteiro.se.piqve ao Longo, da coordenada X. (veja linha 2020).
Assim, as vantagens, de se. usarem -expressões booleanas são uma
rçdução no número;de deçlarações ;IFí,e.;y.rn aumento na clareza do pro­
grama, A única desvantagem desta. t^cqiça- á qye, algumas vezes as ex­
pressões boQlsanas atrasam. se,u programa.
Para ver a razão, reexamine a linha 1040 da Listagem 16.1. Obser­
ve, que quando o usuário aperta a vírgul^, cada expressão booleana na
íirihaiIO4Ô dévé ser 'àtâdiada. Por pútró lado, no eXémplò dado acima (li­
nhas números 1040, 1042, ..., 1048)!, uma grande parte das declarações
Ip são .puladas,na maioria das vezes.- Portanto, sob algumas circunstân­
cias, várias .deçlarações IP podem ser, executadas mais depressa do que
uma longa declaração rcoptendp expressões boolean.as.
Alien Defense 207

Balas Dirigíveis

Programar balas dirigíveis (“morteiros guiados a laser” em Alien De­


fense) é simples, com o uso de expressões booleanas. Você faz a direção
do movimento dependendo da direção em que o canhão está apontando.
A seção Mover Morteiro da Listagem 16.1 (linhas 2000-2240) mostra isto.
A linha 2000 checa o SF (indicador de morteiro) para ver se um mor­
teiro está ativo. Semão, o programa pula a seção Mover Morteiro. A linha
2020 guarda as antigas coordenadas XS e YS do morteiro, então calcula o
incremento de movimento nas direções X e Y. A declaração “XS = XS +
(GN = 4) * 4 + (GN = 3) * (-4)” determina o incremento de movimento
ao longo de X. Se você não compreender isso, releia a seção anterior so­
bre expressões booleanas. Esta declaração dá o seguinte: se GN = 4 (o
canhão aponta para a direita), a bala se move por um incremento de qua­
tro para a direita; se GN = 3 (o canhão aponta para esquerda) a bala se
move por um incremento de quatro para a esquerda; e se GN = 2 (o ca­
nhão aponta para cima), o programa não acrescenta nada ao valor XS e
a bala se move reto para cima.
Você pode aplicar este mesmo conceito para dirigir qualquer tipo de
figura animada em seus jogos de computador. Você poderia aplicar ex­
pressões booleanas e o conceito de bala dirigível para programar os co­
mandos de teclado para dirigir um carro de corrida em volta de uma pista
circular, guiar uma nave-foguete aterrissando em Marte, ou dirigir um es­
quiador descendo numa pista de neve. Seu conhecimento e experiência
determinarão quando estes conceitos podem ou devem ser aplicados ao
escrever seus próprios jogos de computador.

MELHORIAS E MODIFICAÇÕES

As melhorias e modificações sugeridas incluem:


1. Faça a cidade parecer mais realista. Você poderia fazer uma ta­
bela de figuras para janelas e portas dos edifícios, acrescentar
telhados inclinados a alguns outros, colocar antenas no topo dos
prédios e acrescentar outros detalhes. Apenas se certifique de
que o edifício não fique alto demais ou você não terá tempo de
derrubar as bombas alienígenas antes de explodir sobre os
prédios.
2. Acrescente uma pausa no jogo (veja Capítulo 13). Uma caracte­
rística de pausa é muito benvinda num jogo como Alien Defense,
que pode continuar por um longo tempo à medida em que você
tenta atingir um escore cada vez mais alto.
3. Programe para rastreamento de escore alto (veja Capítülo 17).
4. Acrescente balas múltiplas. Como escrito, o jogo permite apenas
um de seus morteiros no ar por vez. Isto mantém o jogo simples,
rápido e fácil de compreender. Acrescentar mais balas, no entan­
208 Jogos de Ação para o Apple

to, despertaria interesse e excitamento ao jogo. Veja Capítulo 14


sobre como programar a animação de várias figuras.
5. Acelere o jogo usando um compilador. Se você decidir acrescen­
tar balas múltiplas, você não ficará satisfeito com a presente ve­
locidade do jogo (veja Capítulo 9 sobre como compilar Apple­
soft).
Estamos prestes a terminar nossa jorhada através da programação de
jogos de computador. No capítulo seguinte, você aprènderá mais alguns
truques e então se tornará um perito programador de jogos.
Alien Defense 209

Figura 16.1; DEFENSE.SET

[A figura que está no canto superior esquerdo é ajpfe 1, a figura no


canto superior direito é a #2, a figura no canto inferior esquerdo é a
it 3, etc.]
210 Jogos de Ação para o Apple

1 1 5 2>0
]L()
-A. L

10

2oJ
Alien Defense 211
212 Jogos de Ação para o Apple

Listagem 16.1: ALIEN.DEFENSE

1'0 REM #*###**#*###»***#*#*»***


20 REM * ALIEN.DEFENSE *
30 REM » BY SCOTT ZIMMERMAN *
40 REM # COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 112? EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
BO REM ************************
90 REM
190 REM

INTRODUÇÃO:

200 HIMEM: 34304: BOSUB 9000


220 IF PEEK (768) < > 169 THEN PRINT CHRS
(4);"BRUN CRTADOR.SOM"
240 IF PEEK (28672) < > 10 THEN PRINT
CHRS (4);"BLOAD DEFENSE.SET,AS7000"
260 & RESUME : HIMEM: 28671:NF = 1
290 VTAB 23: PRINT "TECLE <ESPACO> P/ COMECAR
* -> & 200,80,1: GET AS
300 DEF FN HB(A) = INT (A / 256): DEF FN
LB(A) = A - FN HB(A) * 256
320 AD = 28672: POKE 232, FN LB(AD): POKE 233,
FN HB(AD)h SCALE= 1: ROT= O: HCOLOR=
3
490 REM

ARRANJO:

500 HGR : GOSUB 6000


520 HOME :SC = O:XG = 140:YB = 142:MA = 4:
XA = 10:YA = 4:BC =0
540 XDRAW 1 AT XG,YG:GN = 2: XDRAW 6 AT XA,
YA
560 BF = 0:SF = O
580 VTAB 22: HTAB 15: PRINT "ESCORE = ": GOSUB
7Õ00
990 REM

CICLO PRINCIPAL:

1000 IF PEEK ( - 16384) < 128 THEN 2000


Alien Defense 213

1020 GET A$
1030 REM

MOVE CANHAO:

1040 IF AT = THEN XDRAW GN AT XG,YG:GN


= (GN = 4) * 2 + (GN =2) * 3 + (GN =
3) * 3: XDRAW GN AT XG,YG: GOTO 2000
1060 IF AT = THEN XDRAW GN AT XG,YG:GN
= (GN = 4) * 4 + (GN = 2) * 4 + (GN =
3) * 2: XDRAW GN AT XG,YG: GOTO 2000
1070 REM

TECLAS DE CONTROLE DO SOM:

1080 IF At < > "S" THEN 1140


1100 IF NF THEN & STOP :NF = 0: GOTO 2000
1120 & RESUME :NF = 1
1130 REM

ATIRAR BALA:

1140 IF At < > "X" THEN 2000


1160 SC = SC - 3: GOSUB 7000
1180 IF SF THEN XDRAW 5 AT XS,YS:YS = 140
- (GN = 2) * 6: XS = XG + (GN = 4) * 18
- (GN = 3) * 4 + (GN =2) * 6: XDRAW
5 AT XS,YS: & 220,5: GOTO 2000
1200 SF = 1: YS = 140 - (GN =2) * 6:XS = XG
+ (GN = 4) * 18 - (GN = 3) * 4 + (GN
= 2) *6: XDRAW 5 AT XS,YS: it 220,5
1990 REM

MOVE BALA:

2000 IF SF = 0 THEN 3000


2020 XI == XSi:Yl = YS:XS = XS + (GN = 4) * 4
+ (GN1 == 3) * ( - 4) : YS » YS - 4
2040 IF XS < 0 THEN XS = 0
2060 IF XS 270 THEN XS = 279
2080 IF YS Q THEN YS = 0
2100 XDRAW 5 AT XI,Yl: XDRAW 5 AT XS,YS
2120 IF PEEK (234) = 1 THEN 3<OOO
2140 IF BF = 0 THEN 2220
2160 XDRAW 8 AT XB,YB: XDRAW 8 AT XB,YB: IF
PEEK (234) = 20 THEN 2220
214 Jogos Ação Apple

2180 XDRAW 5 AT XS,YS: XDRAW 8 AT XB,YB: XDRAW


9 AT XB,YB: GOSUB 6500: XDRAW 9 AT XB,
YB: XDRAW 10 AT XB - 5,YB: & 240,4: XDRAW
10 AT XB - 5,YB
2200 BF = 0:SF = 0:SC = SC + 40: GOSUB 7000:
GOTO 4240
222*0 XDRAW 6 AT XA,YA: XDRAW 6 AT XA,YA: IF
PEEK (234) < > 53 THEN GOSUB 8000:
GOTO 3000 '
2240 SF = 0: XDRAW 5 AT XS,YS: & 254,4
2990 REM

MOVE ALIENÍGENA:

c«0oo XI = XA:XA = XA + MA: IF XA < 10 DR XA


> 260 THEN MA « - MA:XA = XI + MA
3020 XDRAW 6 AT X1,YA: XDRAW 6 AT XA,YA
3990 REM

SOLTA BOMBA:

4000 IF BF THEN 40B0


4020 BF = INT ( RND Cl) * 20):BF = NOT BF:
IF XA < 50 OR XA > 230 THEN BF = 0
4040 IF BF = 0 THEN 4240
4060 XB = XA + 8:YB = 20: XDRAW 8 AT XB,YB
4070 REM

MOVE BOMBA:

4030 XI = XB:Y1 = YB:YB = YB + 2


4100 XDRAW 8 AT XI,Yl: XDRAW 8 AT XB,YB
4120 IF PEEK (234) = 20 THEN 5000
4140 IF SF - 0 THEN 4180
4160 XDRAW 5 AT XS,YS: XDRAW 5 AT XS,YS: IF
PEEK (234) < >1 THEN 2180
4130 BF = 0: XDRAW 8 AT XB,YB: XDRAW 9 AT XB,
YB: & 50,8: XDRAW 9 AT XB,YB
4200 XDRAW 10 AT XB - 5,YB: GOSUB .6500: SC =
SC - 50:BC = BC + 1: GOSUB 7000
4220 IF XB > 125 AND XB < 160 THEN XDRAW 10
AT XG,YG: GOSUB 6500: GOTO 15000
4240 IF BC = 10 THEN 15000
5000 GOTO 1000
5990 REM
Alien Defense 215

DESENHA CIDADE:

6000 HPLOT 0,0 TO 279,0 TO 279,159 TO 0,159


TO 0,0
6020 HPLOT 0,115 TO 80,115 TO 80,159 TO 80,
125 TO .110,125 TO 110,159 TO 110,140
TO 125,140 TO 125,159
6040 HPLOT 165,159 TO 165,140 TO 190,140’ TO
190,159 TO 190,135 TO 240,135 TO 240,
159 TO 240,120 TG 279,120
6060 RETURN
- 6490 REM

ROTINAS DO SOM:

6500 FOR J = 1 TO 20: & RND (1) * 40 + 140,


3: NEXT : FOR J = 1 TO 10:' & 240 - J,
3: NEXT : RETURN
6600 FOR J = 1 TO 10: & RND (1) * 30 + 220,
8: NEXT : RETURN
6990 REM

MOSTRA ESCORE:

7000 VTAB 22: HTAB 24: INVERSE : PRINT SC;:


NORMAL : PRINT " ": RETURN
7990 REM

EXPLOSÃO DO ALIENÍGENA:

8000 XDRAW 5 AT XS,YS: XDRAW 6 AT XA,YA: XDRAW


7 AT XA,YA: & 100,8: GOSUB 6600: XDRAW
7 AT XA,YA: XDRAW 10 AT XA,YA: GOSUB
6500: XDRAW 10 AT XA,YA
8040 SF = O:XA = 10: XDRAW 6 AT XA,YA:SC = SC
+ 25: GOSUB 7000: RETURN
8990 REM

PAGINA DO TITULO:

9000 TEXT : HOME : VTAB 8: AS = " ALIEN DEFENSE


": INVERSE : GOSUB 9500: NORMAL
9020 VTAB 12:AS = "BY S. SCOTT ZIMMERMAN":
GOSUB 9500
9040 VTAB 14:AS = "COPYRIGHT (C) 1985”: GOSUB
9500
216 Jogos de Ação para o Apple

9060 RETURN
9490 REM

CENTRALIZA TEXTO:

9500 HTAB (20 - LEN (Aí) / 2): PRINT Aí: RETUR

14990 REM

PERDEU O JOGO:

15000 VTAB 23: HTAB 15: INVERSE : PRINT " GAME


OVER NDRMAL
15020 & 100,200: & 40
15060 VTAB 24: HTAB 1: CALL - 958: PRINT
"PUÉR JOGAR DE NOVO? (S/N) ->
GET AÍ: PRINT AÍ
15080 IF Aí = "S” THEN 300
15100 IF AÍ < > "N” THEN 15060
15120 TEXT : HOME
Alien Defense 217

Listagem 16.2: DEFENSE.SET

7000- 0A 00 16 00 4A 00 5B 00 6B 00 80 00 82 00 A4 00
7010- C6 00 D2 00 E4 00 4A 49 2D 3E 37 2D 3Ê 37 2D 3E
7020- 37 2D 3E 37 2D 4E 3F 3F 3F IE 2D 2D 2D 2D 3E 3F
7030- 3F 3F F7 2D 2D 2D 2D 2D FE IF IF IF IF 2E 2D 20
7040- 2D 2D 35 3F 3F 3F 3F 3F 06 00 4A 49 2D 3E 37 2D
7050- 3E 37 2D 3E 37 2D 3E 37 2D 06 00 92 29 0E 3F 77
7060- 2D 75 3F 77 2D 75 3F 77 2D 06 00 92 49 49 49 29
7070- 0E 3F F7 2D F5 3F F7 2D F5 3F 37 2D 06 00 92 49
7080- 06 00 49 09 2D 4E 3F 3F 3F IE 2D 2D 20 2D 3E DF
7090- DF 37 2D 2D 2D 2D 3E 3F IF 3F 77 2D 2D 2D FE 3F
70A0- IF 06 00 09 49 29 2D 4E 3F IF IF IE 2D 6D 6D 3E
7000- DF DF F7 0D 0D 2D 2D 35 FF IF 3F 77 20 2D 0D FE
70C0- IF IF 0E 0E 06 00 29 2D 0E 3F 3F 37 2D 2D F5 3F
70D0- 37 00 49 4D 0E DF F7 2B 4D 75 FF IF 0E F7 6B 09
70E0- 0D DE 06 00 49 09 IE 40 09 4E F9 IF FF IF DE 6D
70F0- 09 0D 0D 4E FF IF FF F3 6B 09 4D 6D 4D DE DF DF
7100- DF 73 4D 6D 69 3E IF DF FF 3B IE 4D 6D 69 49 Fl
7110- FB DF 3B 0E 4D F5 DB DB 4D 49 49 09 06 00 49
CAPÍTULO 17
DEATHCHASE
Death' Chase 219

Você descobriu algo estranho mas tentador: o cemitério local está,


cheio de moedas de ouro, mas uma maldição misteriosa foi lançada sobre
ele; nenhum ser vivo pode pisar na propriedade. Para não se sentir dis­
suadido, você recruta alguns duendes para recolherem as moedas de ou­
ro. Os duendes, enttetanto, não são inteiramente imunes à maldição. Três
esqueletos sinistros que guardam o cemitério têm o' poder de aniquilar
seus duendes no primei,ro contato. Além disso, qualquer duende que pas­
sar por cima de um túmulo desaparecerá no ar. Você tem somente três
duendes para agarrar tantas moedas de. ouro quanto possível. Feliz as­
sombração, quero dizer, caçada!
Além de utilizar muitos dos conceitos explicados nos capítulos ante­
riores, Death Chase demonstra os conceitos de inimigos “inteligentes”
(os esqueletos), pontos de bônus e gravação do escore máximo no disco.

DIGITANbO DEATH CHASE

Digite a Listagem 17.1 no seu computador e grave-a no seu disco


Jogos de Ação como “DEATH.CHASE”. Além disso, você precisa criar
(usando o Editor de Tabelas de Figuras) o arquivo Cháse Set, que con­
tém as figuras mostradas na Figura 17.2. Alternativamente digite o arqui­
vo binário Chase Set que damos na Listagem 17.2. Digite a declaração
“BSAVE CHASE.SET,A28672,L146” para gravá-lo no disco.
Em razão do método usado em Death Chase para gravar o escore
máximo para o disco, você precisa fazer as seguintes modificações no
Chase Set:
1. Nq modo Applesoft BASIC (com o sinal de pronto “]” e o cur­
sor piscante), digite “BLOAD ÇHASE.SET.A28672 ” para carregar
o arquivo na memória,
2. Digite “POKE 28815,0:POKE 28818,0” para zerar o escore máxr-
mo na memória no final de Chase Set.
3. Agora dígitè “BSAVE CHASE.SET,A28672,L146” para gravar o
arquivo de volta para o disco, mas com dois bytes extras para a
gravação do escore máximo.
Death Chase também precisa do Criador.de Som (Capítulo 7); certj-
fique-se então de que você tem uma boa cópia nó seu disco Jogos de
Ação.

COMO JOGAR DEATH CHASE


I
Death Chase usa as mesmas teclas de controle que Wipeout (Capítu­
lo 5) e muitos outros jogos deste,livro: a vírgula move o duende para a
esquerda: o ponto para a direita; e o <A> e o <Z> para cima e para
baixo. Além disso, você pode desligar os sons do jogo teclando <S>.
Para retomar o som, tecle < RETURN >.
Você déve acumular um certo número de moedas dé ouro em cada
“onda de ataque” antes de acabar o tempo, e sem ser aniquilado por Um
220 Jogos de Ação para o Apple

esqueleto ou passar por sobre um túmulo. Quanto mais segundos resta­


rem no cronômetro do jogo quando você completa uma onda de ataque,
mais pontos de bônus você ganha.

EXPLICAÇÃO DO PROGRAMA

Depth Chasé segue a mesma Organização Geral de Programas que


demos no Capítulo 2. O jogo também tem muitas características das se­
ções Introdução e Arranjo de Wipeout de Alta Resolução (Capítulo 13). Ò
Quadro 17.1 relaciona as variáveis chaves.

QUADRO 17.1
, VARIÁVEIS PRINCIPAIS EM DEATH CHASE
VARIÁVEL EXPLICAÇÃO
AX( ) Matriz das coordenadas X dos três esqueletos
AY( ) Matriz das coordenadas Y dos três esqueletos
BP Pontos de bônus ganhos depois de cada onda de
ataque
HS O escore máximo gravado no disco
L Nível do jogo (calculado automaticamente)
MN Incremento de movimento para a animação do
esqueleto
MX Movimento do duende ao longo da coordenada X
MY • ■ Movimento do duende ao longo da coordenada Y
NX Moximento do esqueleto ao longo da coordenada X
NY Movimento do esqueleto ao longo da coordenada Y
SC Escore do jogo
SX Coordenada X temporária para o esqueleto
SY Coordenada Y temporária para o esqueleto
TM Valor do cronômetro
TN Número de túmulos
WP Pontos ganhos ao completar uma onda de ataque
WV Número da onda de ataque
X Coordenada X corrénte do duende
X1 Coordenada X antiga do duende
Y Coordenada Y corrente do duende
Y1 Coordenada Y antiga do duende

Inimigos “Inteligentes”

Em Death Chase os esqueletos têm realmente um grau de inteligên­


cia. Eles “sabem” onde está seu duende e podem persegui-lo. A seção
chamada Movimento do Esqueleto, linhas 4000-4280, programa esta "in­
teligência”.
Death Chase 221

O método não é complicado. Um ciclo FOR.. .NEXT de um até três


move um incremento cada um dos três esqueletos. A linha 4020 calcula
o incremento MN do movimento baseado no nível corrente L de dificulda­
de. A linha 4020 também ajusta a posição corrente do esqueleto para SX
e SY, e inicializa as variáveis NX e NY para zero para o movimento do es­
queleto. As linhas 4060-4140 comparam a posição corrente do esqueleto
com a do duende, e ajustam as variáveis NX e NY de acordo. Se SX é me­
nor que X, o esqueleto está à esquerda do duende, e NX é ajustado para
um MN positivo para que o esqueleto se mova para a direita. Se SX é
maior que X, o esqueleto está à direita do duende, e NX é ajustado para
um MN negativo para que o esqueleto se mova para a esquerda. O movi­
mento na direção Y é calculado similarmente.
Colocamos as declarações IF nas linhas 4040 e 4100 porque um dos
três esqueletos é limitado ao movimento horizontal, um é limitado ao mo­
vimento vertical e um esqueleto pode mover-se horizontalmente, vertical­
mente a diagonalmente.
Uma vez que você entenda os princípios da inteligência dos esquele­
tos, o método talvez pareça muito simples. Nos seus próprios jogos de
ação você pode querer programar inimigos mais inteligentes que possam
atirar em você ou acelerar quando você acelera, por exemplo. Mas você
deve tomar cuidado. Um jogo de ação seria difícil se o inimigo fosse in­
teligente. É fácil fazer o inimigo do computador mais inteligente que o
jogador humano.

Pontos de Bônus

Em Death Chase, você completa uma onda de ataque depois que seu
duende recolhe um certo número de moedas de ouro. No final de cada
onda de ataque o programa lhe dá um certo número de pontos de bônus.
Como na maioria dos jogos de fliperama, o programa determina estes
pontos de bônus dependendo do seu nível de habilidade.
A seção chamada Onda Completada, as linhas 8000-8240, determina
os pontos de bônus em Death Chase. Especialmente, a linha 8040 dá uma
fórmula matemática que calcula BP (pontos de bônus). A linha ajusta BP
igual a cinco vezes o nível de dificuldade L (para que quanto maior a di­
ficuldade, mais pontos você ganha), mais três vezes o número restanté
de segundos TM no relógio do jogo (para que quanto mais rápido você
recolhe as moedas de ouro, mais pontos você ganha), mais quatro vezes
o número WV da onda de ataque (para que quanto mais ondas de ataque
você tenha completado, mais pontos você ganha).
Nos seus jogos de computador, você talvez baseie os pontos de bô­
nus não somente no nível de dificuldade, tempo do jogo e onda de ata­
que, mas também em fatores como: a velocidade da animação , objetivos
especiais (como acertar um alienígena de bônus), nível do combustível
da nave e tamanho do alvo. Você não deveria dar pontos de bônus pura­
mente aleatórios.
222 Jõgos dê Ação para o Apple

Gravândo o Escore Máximo no Disco

A maioria dós bons jògoS ericorajàm jogadores para tentarem mais


e mais, para se ultrapassarem eles próprios oú outros jogadores. Uma ma­
neira de sê programar isto nos seus jogos dé ação é gravando o escore
máximo no disco. Isto fornece um arquivo permanente de seu melhor es­
forço, é lança urri objetivo natural para se tentar alcançar.
Os dois, rtiétodos mais populares para a gravação do escore máximo
no disco são os seguintes: monte um pequeno arquivo de texto, do qual
o prpgr.amaderá (READ) o escore máximo corrente e gravará (WRITE) ó
novo escore máximo; monte um arquivo binário de dois bytes, que é car­
regado (BLOAD) na memória e gravado (BSAVE) de volta para o disco e
então usar PEEKs e POKEs para ler é reajustar o escore máximo. O pri­
meiro método é mais lento qüe o segundo, visto que o sistema operacional
de discô leva muito tempò parâ acessar arquivos texto. Ambos os méto­
dos sofrem do problema de que eles requerem dois setores (equivalente
a um bloço ProDOS) de espaço de disco apenas para guardar um sim­
ples núrpero. , •
Em Death Chase, usamos um método que aumenta, a velocidade e
diminui o espaço gasto no disco. Inserimos (POKE) o escore máximo na
memória no final da tabela de figuras Chase Set e gravamos (BSAVE) todo
o arquivo de volta para o disco. Toda véz que o ProDOS acessa informa­
ção no disco, ele tem que ler ou gravar um bloco inteiro de uma vez.
Então não há diferença na velocidade ou no espaço do disco quando len­
do um arquivo de 146 bytes ou de 2 bytes.
Quando você criou o arquivo Chase Set, dissemos-lhe para colocar
dois bytes extras no final dos dados da figura (veja a seção Digitando e
Gravando Death Chase). Estes dois bytes estão nas posições de memó­
ria 28815 e 28816, na ordem de byte baixo e alto. À linha 320 determina a
variável HS do escore máximo oíhandp (PEEK) estes endereços.
A linha 10040 verifica o escore corrente do jogo para ver se é o no­
vo escore máximo. Se for, a linha 10100 inclui (POKE) o novo escore ná
.memória e.a.linha 1,0140 grava-o para o disco. (Por causa de um truque na
versão 1.0,2 do ProDÓS, você tem quê ajustar HIMEM antes e depois de
gravar (BSAVE), como mostrado nas linhas 10120 e 10160., Se você esti­
ver. usando DOS 3.3, você pode omitir estas duas, linhas.)
Corpo mencionado acima, nosso método de gravação do escore má­
ximo para p disco é apenas um entre vários possíveis. Escolha o seu mé­
todo preferido e use-o. Seus jogos de computador serão mais divertidos
quando você o fizer, - .

MELHORIAS E MODIFICAÇÕES

Não vamos sugerir melhorias e modificações para Death Chase, em­


bora muitas'sejam possíveis. Você deverá estar acostumado com a maio­
ria das técnicas importantes de programação (e muitas outras pequenas)
Death Chase 223-

na criação de jogos de ação para p. Apple. Use sua imaginação e capaci­


dade para modificar Death Chase a seu gosto.
Melhor ainda, elabore um novo jogo. Temos certeza de que vócê será
capaz de escrever jogos que ultrapassarão em qualidade e excitação nos­
sos programas de demonstração. E você descobrirá, como nós, que o
“jogo” de computador mais divertido é elaborar e escrever seus próprios
jogos. Sim, jogar jogos de computador é divertido, mas escrever seus
próprios jogos de computador é o prazer máximo.
224 JogQS de Ação para o Apple

Figura 17.1 :CHASE.SET

[A figura que está no canto superior esqüerdo é a=fc1, a figura no


canto superior direito é a4^2, a figura no canto inferior esquerdo é a
=#3, etc.]
Death Chase 225

Listagem 17.1: DEATH.CHASE

10 REM ************************
20 REM * DEATH.CHASE *
30 REM * BY STEPHEN ZIMMERMAN *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM **************** ********
90 REM
190 REM

INTRODUÇÃO:

200 HIMEMs 34304: TEXT : HOME


220 INVERSE : VTAB 7: HTAB 14: PRINT “ DEATH
CHASE NORMAL
240 VTAB 10: HTAB 9: PRINT “BY STEPHEN H. ZIMMERMAN”
VTAB 12: HTAB 11: PRINT "COPYRIGHT (C)
1985"
260 IF PEEK (768) < > 169 OR PEEK (769)
< > 76 THEN PRINT CHRÍ (4);"BRUN CRIADOR.SOM"
2S0 IF PEEK (28672) < > 4 THEN PRINT CHRÍ
(4);"BLOAD CHASE.SET,AÍ7000"
300 HIMEM: 28671: & RESUME
320 HS = PEEK (28815) + PEEK (28816) * 265
340 VTAB 23: PRINT "TECLE <ESPACO> -> ";:
GET AÍ: PRINT AÍ: & 200,80,1
360 DEF FN HBÍA) = INT (A / 256)! DEF FN
LB(A) = A - FN HB(A) * 256
380 AD = 28672: POKE 232, FN LB(AD): POKE 233,
FN HB(AD): SCALE= 1: RDT= O: HCOLOR-
•2»
400 POKE 230,32: CALL 62450
420 WP = O:WV = 0:L = 1:NG = 3:SC = 0
490 REM

ARRANJO:

500 HOME : VTAB 8: HTAB 12: PRINT "SEU ESCOREs


";SC
520 VTAB 15: HTAB 15: PRINT "NIVEL ";L
540 TM = 90 + L * 5
560 BN = L + 15: FOR J = 1 TO BN + 10
226 Jogos-de Ação para o Apple

580 G = INT ( RND (1) ’* 24 + 1) "i 10’4 13:P


= W ( RND (D # 13 + 1) » IO + 14:
XDRAW 2 AT Q,P: IF PEEK <234) < > 2
THEN XDRAW 2 AT Q,F: GOTO 580.
600 NEXT
620 FOR J = 1 TO BN
640 Q = INT ( RND (1) * 245; + 20:P = INT
( RND (1) *115) rf- 20": XDRAW 3 AT Q,P:
IF PEEK (234) < > 48 THEN XDRAW 3
AT G,P: GOTO 640
660 NEXT
680 FOR J = 1 TO 3
700 Q = INT ( RND (1) .* 185) + 20: P = INT
( RND (1) * 115) + 20: XDRAW 4 AT D,P:
IF PEEK (234) < > 37 THEN XDRAW 4
AT Q,P: GOTO 700
720 AX(Ji = Q:A¥(J) - P: NEXT-J
740 X - 10:¥ = 10:XI = O:Y1 = 0
760 XDRAW’1 AT X,Y T - . .
7E0 VTAB 22; HTAB 3: PRINT "GOBLINS: NG; :
HTAB 18: PRINT "ESCORE=";SC;: HTAB 32:
PRINT "TEMPO—";TM
BOO” POKE -16297,0: POKE - 16301,0: POKE
- 16304,0 .
990 REN

CÍCLO PRINCIPAL;

1000 IF PEEK C - 16384) < 128 THEN'2000


1020 GET AT .
1040 IF AT = "A" THEN MX = O:MY = - 10: GOTO
2000 . .
1060 IFAT = "Z” THEN MX = O': MY = IO: GOTO 2000
1080 IFAT - THEN MX = 10:MY = 0: GOTO 2000
1100 IFAT = THEN MX = - TO: MY = 0: GOTO
2000 . .
1120 IF AT = "S" THEN & STOP : GOTO 2000
1140 IF AT = CHRT (13) THEN & RESUME
Í990 REM

” MOVIMENTO DO GOBLIN:

2000 XI == X:Y1 = ¥: X = X + MX:Y = Y.i MY


2020 IF X < 0 THEN X - 0
2040 IF Y < 0 THEN Y - 0
Death Chase .227

2060 IF Y > 150 THEN Y - 150


2090 IF X > 269 THEN X = 269
2100 XDRAW 1 AT XI,Yl: XDRAW 1 AT X.,Y
2140 IF PEEK (234) < 59 THEN GOSUB 7000; GOTO
500
2160 IF PEEK (234) > = 60 THEN 2200
2190 DRAW Í AT X,Y; & 249,7:SC = SC + 5:WP =
WP + 1: GOSUB 3500
2200 IF WP = BN THEN GOSUB BOOO: GOTO 500
2990 REM

CRONOMETRO DO TOGO:

3000 TM = TM - 1: VTAB 22: HTAB 39: PRINT- TM;


" 200,2,1: & 215,2
3020 IF TM = O THEN 3060
3040 GOTO 4000
3060 VTAB 22: HTAB 38: FLASH : PRINT TM;: NORMAL

3080 FOR J = 255 TO 1 STEP - 2: & J,2: NEXT

3100 GOSUB 7000: GOTO 500


3490 REM

MOSTRA ESCORE:

3500 VTAB 22: HTAB 12: PRINT NS;: HTAB 25: PRINT
SC;: HTAB 38: PRINT TM;" »
3520 RETURN
3990 REM

MOVIMENTO DO ESQUELETO:

4000 FOR J = 1 TO 3
4020 MN =. INT (L / 3) + 4:SX = AX (J): SY = AY (J):
NX = 0:NY = O
4040 IF J = 2 THEN 4120
4060 IF SX •< X THEN NX = MN: GOTO 4100
4080 IF SX > X THEN NX = - MN: IF SX < MN THEN
NX = - SX
4100 IF J = 1 THEN 4160
4120 IF SY < Y THEN NY = MN: GOTO 4160
4140 IF SY > Y THEN NY = - MN: IF SY < MN THEN
NY = - SY
4160 AX(J) = NX + SX:AY(J) = NY + SY
228 Jogos de Ação para o Apple

41S0 XDRAW 4 AT SX,SY: XDRAW 4 AT AX(J),AY(J)


4200 IF PEEK (234) = 37 THEN 4280
4220 XDRAW 1 AT X,Y: IF PEEK (234) > 2 THEN
GOSUB 7000: GOTO 500
4260 XDRAW 1 AT X,Y
4280 NEXT
5000 GOTO 1000 ' - -
6990 REM

GOBLIN MORTO:

7000 & 100,25: & 110,50: & 10,25


7020 NG = NG - 1: IF NG = 0 THEN 10000
7040 HOME : TEXT
7060 CALL 62450
7080 RETURN
7990 REM

ONDA TERMINADA:

8000 FOR J = 200 TO 230 STEP 2: & J,3: NEXT

8020- WP = 0:WV = NV + 1: TEXT : HOME : VTAB 5:


HTAB 7: PRINT "ONDA DE ATAQUE #";WV;" TERMINADA!"
8040 BP = L * 5 + TM * 3 + WV * 4
8060 FOR J = 230 TO 100 STEP - 1: & J,2: NEXT

8080 VTAB 10: HTAB 11: PRINT "PONTOS DE BONUS:


"; BP
8100 SC = SC + BP
8120 L = L + 1
8140 PRINT : HTAB 11: PRINT "VOCE ESTA AGORA ND NIVEL
”;l
8160 POKE - 16386,0
8180 VTAB 18: PRINT " TECLE'<ESPACO> P/ ONDA DE
ATAQUE #”;WV + 1;
8200 IF PEEK ( - 16384) < 128 THEN 8200
8220 GET IN$: IF IN$ < > " " THEN 8200
8240 CALL 62450: RETURN
9990 REM '

GAME OVER;

I0000 TEXT : HOME : VTAB 7: HTAB 12: PRINT "SEU


- ESCORE: ";SC
Death Chase 229

10020 VTAB 10: HTAB 12: PRINT "ESCORE MAXIMO: ";


HS
10040 IF SC < = HS THEN 10200
10060 VTAB 3: HTAB 4: PRINT "VOCE FEZ UM NOVO
ESCORE MAXIMO!!!!"
10080 FOR J = 1 TO 255 STEP 2: & J,2: NEXT :
POKE -• 16368,0
10100 HS - SC: POKE 2SS15, FN LB(HS): POKE 28B16,
FN HB(HS)
10120 HIMEM: 34304
10140 PRINT CHR$ (4 > ; "BSAVE CHASE. SET ,A2B672,
Li 46"
10160 HIMEM: 28671
10180 VTAB 10: HTAB 27: PRINT HS: & 249,7
10200 VTAB 20: CALL - 958: PRINT "QUER JOGAR
DE NOVO (Sz'N) ->
10220 GET A£: PRINT A$: IF A$ = "S" THEN 380
10240 IF AT < > "N" THEN 10200
10260 HOME : END
230 Jogos de Ação para o Apple

Listagem 17.2: CHASE.SET

7000- 04 00 0A 00 2F 00 31 00 63 00 09 2D 2D 0E 3F 3F
7010- 3F 1E 2D 2D 2D 2D 3E FF 1F 3F 6E 2D 2D 0D 3E 1F
7020- 3F 1F 37 2D 4D 29 F5 3F 3f 3F 0E 2D 2D 06 00 35
7030- 00 49 29 75 39 DF 3b 1E 4D 49 09 0E DF DB DB 33
7040- 0D 6D 0D 6D FE FF DF 1F 6E 4D 0D 4D FE DB DB 1B
7050- 6E 49 49 09 FE DB DB 1B 6E 49 49 09 3E 3F 3F 3F
7060- 3F 37 00 49 2D 3E 77 4E 39 3F 3F F7 4D 69 09 FE
7070- 3F 3F 1F 6E 09 4D F1 1B 3F 0E 0E 1F 1E 6D 35 00
7080- 09 29 41 05 53 53 53 53 53 00 20 2C FE A9 01 4A
7090- 02 00
APÊNDICE A
COMO CORRIGIR
PROGRAMAS APPLESOFT
BASIC
232 Jogos de Ação para o Apple

Este Apêndice ajudará você a detectar e corrigir erros em progra­


mas que você escrever ou que você digitar deste livro.
O Capítulo 1 explicou como digitar e gravar programas em Applesoft
BASIC. Se você tem alguma dúvida sobre como entrar programas no
seu computador, você deveria reler o Capítulo 1.
Para acompanhá-lo no trabalho de digitar e corrigir programas, reco­
mendamos fortemente que você adquira um bom editor Applesoft como
o GPLÉ (Global Program Line Editor, Editor Global de Linhas de Progra­
mas) da Beagle Bros Micro Software, 4315 Sierra Vista, São Diego, Cali­
fórnia 92103 ou GALE (Global Applesoft Line Editor, Editor Global Apple­
soft de Linhas) da MicroSPARC, Inc., 45 Winthrop St., Concord, MA 01742.
Estes utilitários permitem-lhe digitar, modificar e corrigir rapidamente li­
nhas de programas Applesoft. Eles lhe pouparão muitas horas frustrantes
de digitação (e redigitação).
Em geral, se você tem um erro no seu programa, primeiro determine
que tipo de erro (formatação de impressão? animação? sintaxe? bor­
das?), entãò verifique cuidadosamente a parte do programa que lida com
este código. Além disso, sugerimos o seguinte:
1. Sempre que digitar algumas linhas de código, rode (RUN) o
programa. Desta maneira você pode achar a maioria dos SYN­
TAX ERRORS (explicados abaixo) e muitos outros tipos de er­
ros. O único problema deste método é que alguns comandos na
parte inicial do programa fazem referências a linhas da parte
final que você talvez não digitou ainda. Por exemplo, nos Pro­
gramas dos Jogos de Ação colocamos a maioria das sub-rotinas
nos números de linhas 6000-9000, mas as chamamos nos núme­
ros de linhas iniciais 200-500. Quando o seu programa incomple­
to chama um número de linha que ainda não foi digitado, você
receberá um UNDEF'D STATEMENT ERROR. Você pode ignorá-
lo e apenas continuar digitando o programa até completá-lo ou
você pode digitar as sub-rotinas conforme forem chamadas.
2. Quando receber um SYNTAX ERROR, você digitou algo que o
computador não pôde entender. Por exemplo, se você digitar
esta linha (que contém um erro) “500 GR HOME” e rodar o pro­
grama, você receberá a mensagem ?SYNTAX ERROR IN 500.
Depois de executar o comando GR, o Applesoft espera dois pon­
tos (:). Ao invés você deu a ele um comando inesperado HOME,
então o programa dá a você a mensagem SYNTAX ERROR. Do
mesmo modo, se você não colocar ponto-e-vírgula, sinais de
igualdade, ou qualquer outro caractére requisitado ou se você
escrever um comando Applesoft de maneira errada, você tal­
vez receberá um SYNTAX ERROR. Para corrigir o problema, lis­
te (LIST) a linha na qual o erro ocorreu (o Applesoft lhe diz o
número da linha). Então compare a sua linha com a listagem do
livro. Olhe cuidadosamente! Pequenos erros têm uma maneira
de se esconderem. Uma vez que você achou o erro, redigite a
linha ou corrija-a usando o seu editor Applesoft.
Apêndice A Como Corrigir Pragramas Applesoft BASIC 233

3. Se títulos, escores ou outras mensagens parecem erradas ou


fora de lugar, ache a linha que imprime esta mensagem. Verifi-I
que para ter certeza que você digitou os valores de VTAB e
HTAB corretos. Em declarações PRINT, inclua cuidadosamen­
te quaisquer ponto-e-vírgulas (;) que estão no final de aspas.
Estes são requeridos para a formatação de texto apropriada na
tela:
4. Se uma quantidade impressa (como o tempo, o.s pontos, as es-
paçonaves restantes) parece estar com o valor errado, ache a
linha Applesoft que mostra o número. Depois determine qual
variável está sendo mostrada. Por exemplo, se você receber
uma saída como ESCORE = -64332, você pode estar certo que
o número -64332 está errado. É o simples trabalho de achar a
linha que mostra o escore. Daí, ache a variável que tem o valor
errado (por exemplo, pode ser a variável SC). Uma vez que vo­
cê sabe a variável errada, procure na listagem impressa todas
as ocorrências desta variável. Verifique duas vezes o seu pro­
grama para ter certeza de que você digitou todas estas li­
nhas corretamente. Talvez em. uma outra linha você digitou al­
go parecido com SG quando deveria ser SC.
5. Se você teclar um comando de teclado de um jogo e nada acon­
tecer, verifique cuidadosamente as linhas do Ciclo Principal que
lidam com entrada via teclado (linhas 1040-1980). Você talvez
digitou o caractere errado para a entrada via teclado ou talvez
ajustou as variáveis de movimento (MX e MY) incorretamente.
Verifique cuidadosamente cada declaração Applesoft dentro do
limite dos números das linhas.
6. Se uma figura animada sai da tela e dá a você um OUT OF
RANGE ERROR, verifique as linhas número 2000-3000 que li­
dam com as bordas da tela de figuras animadas.
7. Se o seu programa age como se uma colisão ocorreu entre fi­
guras de alta resolução, mas, na verdade, não há nenhuma coli­
são visível na tela, o problema é geralmente causado por um
erro no uso do contador de colisões. Certifique-se de que os
números dos pixels de sua figura estão corretos. Por exemplo,
na declaração “IF PEEK(234) - NP GOTO 3000” o programa
não funcionará se NP não for ajustado corretamente. Você tal­
vez tenha que revisar o programa inteiro e verificar todas as ve­
zes que NP é usado para ter certeza de que você copiou o pro­
grama corretamente.
8. Se, durante a animação de uma figura de alta resolução, você
receber lixo na trilha ao longo da tela atrás do seu objeto que
está se movendo, o problema talvez esteja no comando de apa­
gar XDRAW. Você guardou a figura e as coordenadas antigas
e essas você usou para apagar a figura? (Verifique as linhas
2000-3000) Você calculou corretamente as coordenadas e o
número da figura novos? (Novamente, verifique as linhas 2000-
3000.) Além disso, certifique-se de que não há comandos DRAW
no programa, apenas XDRAW.
234 Jogos de Ação, para o Apple

9. Siga a organização geral de programas em todos os seus pro­


gramas e os erros serão mais fáceis de se achar e eliminar.
Você saberá em qual parte de seu programa você deve procurar
cada tipo de erro.
10. Se todo o resto falhar, olhe no seu programa e compare-o linha
a linha, declaração por declaração, com a listagem impressa
até que você ache o erro.
Achar é corrigir erros — o processo é chamado “debugging” (cor­
rigindo) — é uma habilidade de programação tão importante quanto
aprender a sintaxe da linguagem e métodos de programação. Ele requer
trabalho árduo, experiência e paciência.
APÊNDICE B
COMO DIGITAR ARQUIVOS
BINÁRIOS
236 Jogos de Açãò para o Apple

Usamos dois tipos de arquivos binários neste livro: informação sobre


tabela de figuras e programas em linguagem de máquina. Tabelas de fi­
guras são informações binárias geradas com o Editor de Tabela de Figu­
ras ou criadas usando-se o método descrito no seu Manual de Applesoft
BASIC. Programas em linguagem de máquina são programas auxiliares e
sub-rotinas, escritos originalmente em uma.linguagem de baixo nível cha­
mada assembly. Estes geralmente têm funções especiais que não podem
ser lidadas pelo Applesoft
Por exemplo, o Criador de Som é um programa em linguagem de
máquina, usado na maioria dos jogos deste livro, para produzir música
e efeitos sonoros impossíveis de duplicar em Applesoft. Do mesmo modo,
o Editor de Tabela de Figuras usa várias sub-rotinas em linguagem de
máquina (ver Capítulo 12) que fazem operações como traduzir sua figura
de edição da tela de baixa resolução para informação binária no arquivo
de tabela de figuras.

O MONITOR DO APPLE

Na ROM (read-only memory, memória apenas de leitura) de todo


Apple II +, // e ou // c, há um conjunto de programas chamado monitor.
Este conjunto poderoso de utilitários permite aos programas acessar dire­
tamente os trabalhos interiores do computador. Ele permite a você ver e
modificar os conteúdos da memória de uma maneira muito mais eficiente
do que é possível com PEEKs e POKEs do BASIC. Ele fornece os meios
de entrar e listar rotinas em linguagem de máquina. Permite até mesmo
que você examine e modifique os registradores internos dos micropro­
cessadores 6502 e 65C02.
Como o monitor permite a você lidar com qualquer parte do sistema,
um aviso é dado a seguir:
AVISO: Uso indiscriminado do monitor ou simples erros de digitação
feitos quando se usa o monitor, podem causar efeitos imprevisíveis
e desastrosos em seu programa e informação na memória ou podem
causar danos irreparáveis a programas e informações do disco.
Para evitar tais problemas, certifique-se de que qualquer coisa que
compensa guardar na memória foi gravada e certifique-se de que você
tem uma cópia do disco deixado no drive com a porta fechada. Se você
está interessado nas informações do seu disco, deixe as portas dos drives
abertas enquanto você trabalha no monitor.
Os erros feitos enquanto no monitor nunca podem causar danos ao
seu hardware (periféricos e o próprio computador). O pior que pode acon­
tecer é que você não possa fazer com que o seu Apple funcione mais
(ele fica “pendurado”). Apenas desligue a máquina, carregue o DOS no­
vamente e comece tudo de novo. Contanto que você tenha tomado as
devidas precauções contra perder informações, você não tem nada a
temer. Não tenha medo de experimentar e tentar coisas novas. Não tenha
medo de fazer um erro. É assim, que se aprende.
Apêndice B Como Digitar Arquivos Binários 237

TUTOR DO MONITOR
Digite “CALL-151” para acessar o monitor (“entrar no monitor”).
Como você pode ver, o colchete direito normal (]) do prompt do Applesoft
não é mais usado e você pode ver um prompt asterisco (*) seguido do
conhecido cursor piscante. O seu Apple não mais aceitará os comandos
Applesoft, embora ainda possa permitir comandos do DOS 3.3 ou ProDOS,
seja qual for o sistema operacional que você estiver usando. Até mesmo
o sistema de numeração é mudado. Você não pode mais usar valores
decimais quer na saída de tela, quer na entrada do usuário; você deve
expressar todos os valores em hexadecimal. De fato, neste Apêndice,
expressaremos todos os números na forma hexadecimal a não ser que
se tenha mencionado especificamente.
Examine os conteúdos da memória usando o comando dump (saída
de memória do monitor (também chamado hex dump). Por exemplo, sé
você quer ver o valor armazenado ha posição de memória FF58 (isto é
65368 em decimal), digite “FF58” < RETURN > (daqui em diante não men­
cionaremos o < RETURN >). O computador responde repetindo o endere­
ço de memória, seguido de um traço e então o valor hex desta posição,
como este “FF58- 60”. Se você quer1 ver um limite de posições de memó­
ria, digite o endereço inicial, um ponto, e então o endereço finál. Por
exemplo, digite “FF00.FF20” se você quer ver os valores de FFOO a FF20.
O computador então mostrará todos os valores hexadecimals dentro do
limite de memória, da maneira seguinte:

FFOO- 1A 1C 32 34 3A 3C 52 5A
FF08- 64 72 74 7A 7C 89 92 9C
FF10- 9E B2 D2 F2 FC 38 FB 37
FF18- FB 39 21 36 21 3A F8 FA
FF20- 3B

Uma outra maneira de se examinar a memória do Apple é com o co­


mando disassembly do monitor. Este comando permite-lhe ver os valores
hexadecimais armazenados em um limite de memória e mostra os opco­
des (comandos) assembly de qualquer rotina em linguagem de máquina
que resida nessas posições da memória. Para executar o comando disas­
sembly, digite o endereço inicial de memória seguido de um “L” e < RE­
TURN >. Digite “FF4AL” por exemplo. Isto produz uma página de lista­
gens disassembly começando no endereço FF4A, como segue:

FF4A- 85 45 STA $45


FF4C- 86 46 STX $46
FF4E- 84 87 STY $47
FF50- 08 PHP
FF51- 68 PLA
FF52- 85 48 STA $48
FF54- BA TSX
238 Jogos de Açãopara o Apple

FF55- 86 49 STX $49


FF57- D8 CLD
FF58- 00 RTS
FF59- 20 84 FE JSR SFE84
etc.
A primeira coluna de números é o endereço hexadecimal de memória
seguido dé um hífen (-). As próximas três colunas (que podem ter um,
dois ou três númerõs) são os valores hexadecimais contidos dentro do
Limite designado da memória. A próxima coluna contém o mnemônico. (ou
opcode) de três letras em linguagem assembly. Estas são traduções (di­
sassemblies) da infonfiaçãô binária da esquerda. Eías representam instru­
ções para o cérebro do Apple, o microprocessador 6502 ou 65C02. Por
exemplo, STX $46 (que é o disassembly do comando de dois bytes 86 46
quer dizer “armazene o registrador X no endereço de memória $46”. (Se
você está interessado em aprender mais sobre linguagem assembly e de
máquina, consulte o seu Manual de Referência do Apple II ou um dos
muitos, livros disponíveis sobre programação de linguagem assembly.)
Pára mudar o conteúdo da memória ou digitar qualquer informação
binária, primeiro digite o endereço de memória, depois dois pontos (:) e
finalménte a informação hexadecimal. Cada byte de informação deve ser
separado por um espaço. Por exemplo, digite este programa curto em
linguagem de máquina. Se você não está no monitor (com o prompt*)
digite “CALL-151” e digite as seguintes linhas exatamente como mos­
trado. Certifique-se de teclar <RETURN> no final de cada linha.
300:A2 F0
302:2C 30 CO
305:A9 20
307:20 A8 FC
30A:CA
30B:D0 F5
30 D :60

Na verdade, você póderia ter digitado toda a listagem em apenas


umá linha:
300:A2 F0 2C 30 CO A9 20 20 A8 FC CA DO F5 60
Em ambos os casos, o programa armazena os valores da direita dos
dois pontos na memória de acordo com o endereço dado à esquerda dos
dois pontos. Deste modo, A2 é armazenado em 300, F0 em 301, 2C em
302, 30 em 303, etc.
Para ter certeza de que você digitou as informações corretamente,
digite “300.30D” para dar um dump de memória. O seu Apple deverá
então fornecer o seguinte:
0300- A2 F0 2C 30 CO A9 20 20
0308- A8 FC CA DO F5 60

Apêndice B Corno Digitar Arquivos .Binários 239

Ao contrário, você poderia verificar os resultados usando o comando


disassembly, visto que a informação digitada é um programa em lingua-
gem de máquina. Digite “300L” e você deverá ver o seguinte:

0300- A2 F0 LDX $F0


0302- 2C 30 CO BIT SC030
0305- A9 20 LDA S20
0307- 20 A8 FC JSR SFC58
030A- CA DEX
030B- 60 RTS

Isto será seguido de qualquer informação que por acaso esteja no


seu computador antes de você digitar esta rotina.
Depois de você verificar as informações cuidadosamente para ter
certeza de que você digitou tudo corretamente, digite “300G” para rodar
o programa. O G quer dizer “go” (vá) em inglês. Como você pode ouvir,
esta é uma rotina de som, uma versão simplificada do Criador de Som
dada no Capítulo 7.
Digite “301 :d” para mudar a duração, onde d é um número hexade­
cimal qualquer entre 01 e FF. Digite “306:p” para mudar o pitch, onde p é
também qualquer número entre 01 e FF. Então redigite “300G” para rodar
o programa novamente.

DIGITANDO ARQUIVOS BINÁRIOS

Em suma, os passos para digitar arquivos binários são:


1. Digite “CALL -151” para entrar no monitor. Em seguida, você verá
o prompt.
2. Digite o endereço de memória do primeiro byte do arquivo, se­
guido de dois pontos(:). Por exemplo, se o arquivo é digitado na
memória no endereço “S300”, digite “300:” (não tecle <RE-
TURN> ainda).
3. Digite o primeiro byte (um número hexadecimal de dois dígitos)
seguindo imediatamente os dois pontos digitados no passo 2. A
sua entrada parecerá agora com isso: “300:A2”.
4. Digite um espaço antes de digitar o próximo número hexadeci­
mal e então digite o segundo número. A sua entrada parecerá
agora com isso: “300:A2 F0”.
5. Continue digitando a informação, certificando-se de que os bytes
são separados por um espaço.
6. Quando você acabar de digitar várias informações — geralmente
uma linha de informações como aparece na página impressa —
tecle < RETURN >.
7. Agora digite o endereço de memória para o qual deverá ir a pró­
xima informação. As listagens impressas conterão linhas de infor­
240 Jogos de Ação para o Apple

mações, com ó endereço correto na coluna esquerda de cada


linha, seguido de um hífen (-) e então as informações que serão
digitadas nesta linha. Você deVeria digitar sempre os dois pontos
(não um traço) quando digitar as informações.
8. Continue a entrar as informações até que você complete o arqui­
vo binário.
9. Para gravar o arquivo binário para o disco, digite “BSAVE NO­
MEARQUIVO,A$nnnn,L$mmmm ” onde o NOMEARQUIVO é um
nome legal para o seu arquivo binário, nnnn é o endereço hexa­
decimal do início do arquivo binário e mmmm é o valor hexade­
cimal para o número de bytes do arquivo. Ao contrário, você
pode gravar o arquivo usando informações decimais: “BSAVE
NOMEARQUIVO,Annnnn.Lmmmmm”, onde nnnnn é o valor deci­
mal para o endereço inicial do arquivo binário e mmmmm’é o
valor decimal para o tamanho do arquivo.

DIGITANDO PROGRAMAS EM LINGUAGEM DE MÁQUINA


Useos mesmos nove passos dados acima para digitar programas em
linguagem de máquina que são dados com códigos em linguagem assem­
bly. Entretanto, as informações a serem digitadas no monitor consistem
somente dos endereços e valores hexadecimais dos bytes dados nas qua­
tro colunas esquerdas da listagem assembly. Por exemplo, no Criador de
Som, (Listagem 7.1) o código assembly começa com números de linhas
na página 57, mas o código de máquina não começa até o número de
linha 54 na página 58. Ignore os números de linha de código assembly e
tudo à direita dos números de linhas.
APÊNDICE C
MAPA DA MEMÓRIA DO
APPLE II
242 Jogôs dè Ação para' o Apple '

A figura abaixo mostra o mapa da memória dos computadores da fa­


mília Apple II. Em um Apple 64K, o limite dos endereços de memória é de
0 a 65535 (equivalente ao número hexadecimal $0000 a $FFFF).
Alguns limites de memória são freqüentemente chamados de pági­
nas. A página zero é o limite da memória dos endereços 0 a 255 ($0000-
$00FF). A página 1 cobre o limite de endereço 256 a 511 ($0100-$01FF);
esta contém a pilha (“stack?) usàda pêlos programas de linguagem assem­
bly. A página 2 abrangê os endereços 512 á 767 ($0200 a $02FF); ele con­
tém o buffer-dp entrada, que sãp as posições de memória onde a infor­
mação (“data”) digitada via teclado é guardada temporariamente. A pá­
gina 3, endereços 768 a 1023 ($Ó300-$03FF), está livre para o uso de
programadores assembly, ekceto para o limite $3D0 a $3FF, que é reser­
vado para o uso do DOS. Ó Criador de Som (Capítulo 7) está guardado
na memória na página 3. Como você pode ver no Mapa da Memória, a
página 4 até a 7 contêm a tela de texto e a de baixa resolução; a página 8
é onde os programas Applesoft BASIC começam e assim por diante.

____________ MAPA DA MEMÓRIA DO APPLE II____________


Endereço Endereço
decimal hexadecimal
65535 SFFFF
ROM (ou ProDOS na memória auxiliar)
53248 SD000
ROM
49408 $C100
INTERRUPTORES SOFT E/S
41952 SC000
SISTEMA OPERACIONAL DE DISCO
38400 $9600
HIMEM do Applesoft (default)
24576 $6000
TELA DE ALTA RESOLUÇÃO#2
16384 $4000
TELA DE ALTA RESOLUÇÃO#1
8192 $2000
PROGRAMA APPLESOFT (default)
2048 $0800
TELA de TEXTO e de BAIXA RESOLUÇÃO
1024 $0400
PONTEIROS DO DOS
976 S03D0
ESPAÇO DO USUÁRIO
768 $0300
BUFFER DE ENTRADA
512 $0200
PILHA
256 $0100
PÁGINA ZERO
0 $0000
APÊNDICE D
TEXTO NA TELA DE ALTA
RESOLUÇÃO
244 Jogos de Ação para o Apple

Texto na tela de alta resolução requer a criação de um tipo especial


de arquivo de tabela de figuras (usando o Editor de Tabela de Figuras)
chamado conjunto de caracteres ou fonte. O conjunto de caracteres deve
conter todos os números, letras (tanto maiúsculas como minúsculas) e
caracteres especiais (!, j,4t, S, etc.) usados pelo Apple. O Quadro D mos­
tra todos os caracteres, em ordem de 1 a 96, necessários para gerar uma
fonte completa.
Para criar o conjunto de caracteres Fonte Padrão, feito dos caracte­
res padrão do Apple como eles aparecem na tela de texto de 40 colunas,
use o Editor de Tabela de Figuras para criar as 96 figuras mostradas na
Figura D.
Ao contrário, você pode fazer a Fonte Padrão digitando o arquivo
binário da Listagem D. Para um exemplo de como digitar arquivos biná­
rios, veja o Apêndice B. Digite “BSAVE FONTE.PADRÃO,A28672,L1263”
para gravar o arquivo.

FAZENDO AS SUAS PRÓPRIAS FONTES


A maneira mais fácil de fazer as suas próprias fontes — incluindo
conjunto de caracteres estrangeiros, itálicos, letras gregas, escrita cursi­
va ou qualquer outra — é editar uma fonte existente com o Editor de
Tabela de Figuras. Para fazê-lo, siga esses passos:
1. Carregue uma de suas fontes existentes do disco para a memó­
ria do modo “DOS” do Editor de Tabela de Figuras.
2. Usando o modo “ARQUIVAR” do Editor de Tabela de Figuras,
carregue uma figura de arquivo no modo “EDITAR”.
3. Modifique a figura da maneira que desejar.
4. Se necessário, movimente a figura na tela de edição (usando as
teclas de setas direita e esquerda) para que ela fique centraliza­
da dentro do tamanho da sua figura. Por exemplo, se você está
criando uma fonte grande, 10 por 14 pixels, uma maiúscula I de­
veria ser centralizada entre X = 1 e X = 14 na tela de edição.
5. Se necessário, movimente a figura para cima ou para baixo (usan­
do as teclas de seta para cima e para baixo ou <CTRL-K> e
<CTRL-J>) para que a posição vertical fique correta. Por exem­
plo, na maioria das fontes, todas as letras maiúsculas começam
no topo da tela (X = 1 na tela de edição) e o resto em linha de
base especificada. Outras letras, como a minúscula j, não come­
çam no topo da tela e descem poucos pixels abaixo da linha de
base-. Veja a Fonte Padrão da Figura D.
6. Grave a nova figura dó caractere de volta ao arquivo da memória
usando o modo “ARQUIVAR”, inserindo-o na posição correta.
7. Apague a figura antiga (não modificada).
8. Repita os passos de 1 - 7 até que você tenha modificado todos
os 96 caracteres.
Apêndice D Texto na Tela de Alta Resolução 245

9. Finalmente, grave todo o conjunto de caracteres de volta à me­


mória usando um nome de arquivo diferente.
Uma precaução: não tente fazer uma fonte inteira de 96.caracteres de
letras extremamente grandes, visto que o Editor de Tabela de Figuras tem
um limite de memória de 3260 bytes.
Você pode passar por cima do problema de tabelas de figuras exces­
sivamente grandes, entretanto, dividindo as figuras entre vários arquivos
de tabelas de figuras. Isto traz dificuldades extras de programação, visto
que você deve carregar (BLOAD) mais de um arquivo para a memória de
uma só vez. Você pode misturar (“merge”) as tabelas de figuras indivi­
duais em uma tabela de figura grande, usando o programa Mistura de Ta­
bela de Figuras, que está incluso no disco Jogos de Ação se você o adqui­
rir dos autores.

USANDO FONTES DE ALTA RESOLUÇÃO


EM PROGRAMAS APPLESOFT

Um método simples de se imprimir texto na tela de alta resolução é


usar uma pequena sub-rotina que converte valores numéricos ou strings
para números de tabela de figuras. Para isso, siga estes passos:
1. Na seção Arranjo de seu programa, inicialize a tela de alta reso­
lução com o comando HGR ou HGR2.
2. Ajuste ROT = 0, SCALE = 1 e HCOLOR = 3. Normalmente, você
não deveria mudar estes valores durante o seu programa (veja
Dicas de Gráficos de Alta Resolução no Capítulo 13). Se por al­
guma razão você modificar alguma dessas três quantidades, cer­
tifique-se de ajustá-la de volta para esse valor antes de chamar
as sub-rotinas de texto de alta resolução.
3. Para imprimir um valor numérico ou string, o seu programa deve­
rá ajustar TX e TY para as coordenadas da tela de alta resolu­
ção onde você quer que o seu texto apareça. As coordenadas
TX,TY deverão designar o pixel no canto superior esquerdo do
primeiro caractere de texto. (Pense em ajustar TX e TY, analoga­
mente a ajustar HTAB e VTAB.)
4. Ajuste qualquer valor numérico a ser mostrado na tela de alta
resolução para a. variável A ou ajuste qualquer string para a va­
riável AS. As sub-rotinas de texto de alta resolução usam estas
duas variáveis como explicado abaixo.
5. Dê um GOSUB 8000 para imprimir um valor numérico ou um
GOSUB 8500 para imprimir uma string na tela de alta resolução.
6. Finalmente, inclua no seu programa o seguinte código:

8000 AS = STRS (A) + “ ”


8500 L -= LEN (AS): FOR GN = 1 TO L: N = ASC (MIDS (AS.GN,
1)) - 31
246 Jogos de Ação para o Apple

8520 HCOLOR = 0: DRAW 96 AT TX,TY: HCOLOR = 3: XDRAW N


AT TX,TY: TX = TX + 7: IF TX > 272 THEN TX = 0: TY =
TY + 8: IF TY > 184 THEN TY = 0
8540 NEXT GN: RETURN

A linha 8000 converte um valor numérico para uma string e adiciona


urrr espaço no fim. (Para limpar dígitos finais de ir de um número de dois
dígitos para um de um dígito, veja as linhas 2120 e 2200 da Listagem 5.1 e
a explicação do Capítulo 5.) A linha 8500 calcula o comprimento L da
string, começa um ciclo com os caracteres e calcula o número N da figura
corrente baseado no código ASCII. A linha 8520 desenha em preto, o
cursor (figura 96) na tela, apagando portanto qualquer coisa que por
acaso esteja lá. A linha então desenha a figura N do caractere corrente
na tela e calcula as posições TX,TY para o próximo caractere. Finalmente,
a linha 8540 acaba o ciclo do caractere e então retorna (RETURN) da sub-
rotina.

QUADRO D
NÚMEROS DAS FIGURAS CORRESPONDENTES
AOS CARACTERES DO TECLADO
Número da Caractere Número da Caractere Número da Caractere
figura do teclado figura do teclado figura do teclado

1 (espaço) 33 @ 65 ■
2 l 34 •A 66 a
tt
3 35 ,B 67 b
4 #
36 C 68 c
5 $ 37 D 69 d
6 % 38 E 70 e
7 & 39 F 71 f
8 40 G 72 g
9 -( 41 H 73 h
10 ) 42 I 74 i
11
★ 43 J 75 i
12 + 44 K 76 k-
13 ! 45 L 77 I
Apêndice D Texto na Tela de Alta Resolução 247

QUADRO D (continuação)
NÚMEROS DAS FIGURAS CORRESPONDENTES
AOS CARACTERES DO TECLADO
Número da Caractere Número da Caractere Número da Caractere
figura do teclado figura do teclado figura do teclado

14 - 46 M 78 m
15 47 N 79 n
16 / 48 0 80 0
17 0 49 P 81 P
18 1 50 Q 82 q
19 2 51 R 83 r
20 3 52 S 84 s
21 4 53 T 85 t
22 Ô 54 U 86 u
23 6 55 V 87 V
24 7 56 W 88 w
25 8 57 X 89 X
26 9 58 -Y 90 y
27 59 Z 91 z
28 J 60 I 92 I
29 < 61 \ 93 I
30 = 62 l 94 I
31 > 63 A
95
32 ? 64 — 96 (cursor)
248 Jogos de Ação para o Apple

Figura D: FONTE.PADRAO
Apêndice D Texto na Tela de Alta Resolução 249
250 Jogos de Ação para o Apple
Apêndice D Texto na Tela de Alta Resolução 251
252 Jogos de Ação para o Apple

1 5 10

10:

1 5 10

1 5 10
Apêndice D Texto na Tela de Alta Resolução 253

1 5 10
254 Jogos de Ação para o Apple
Apêndice D Texto na Tela de Alta Resolução 255
256 Jogos de Ação para o Apple

Listagem D: FONTE.PADRAO

7000- 60 00 C2 00 C4 00 CA 00 CF 00 DE 00 EC 00 F7 00
7010- 04 01 08 01 10 01 18 01 27 01 2F 01 34 01 39 01
7020- 3E 01 46 01 56 01 5E 01 6A 01 75 01 80 01 8D 01
7030- 9B 01 A3 01 B2 01 C0 01 D0 01 D5 01 DE 01 E6 01
7040- EE 01 F7 01 06 02 16 02 25 02 31 02 40 02 4D 02
7050- 58 02 68 02 78 02 82 02 8D 02 9A 02 Al 02 BI 02
7060- Cl 02 D0 02 DD 02 ED 02 FC 02 0A 03 11 03 20 03
7070- 2E 03 3E 03 4C 03 57 03 61 03 6C 03 72 03 7D 03
7080- 87 03 8E 03 92 03 9B 03 A7 03 B2 03 BF 03 CB 03
7090- D4 03 El 03 ED 03 F5 03 FD 03 08 04 0F 04 1C 04
7 0A0- 28 04 34 04 41 04 4D 04 55 04 60 04 69 04 75 04
70B0- 80 04 8D 04 98 04 A4 04 AF 04 BA 04 C0 04 CA 04
70C0- Dl 04 02 00 09 36 36 16 06 00 69 FE 6E 06 00 69
70D0- FE 1E 2D 2D 1E 1F 1E 2D 2D 1E 1F 6E 06 00 09 4E
70E0- 3F 77 1F 0E 2D 0E 1F 0E 3F 77 31 00 39 2E 4D 1E
70F0- 1E 1E 1E 4D 35 37 00 B9 0D FE 0E 1E 0D 0D 1E DF
7100- 0E 6D 06 00 09 36 06 00 09 1E 1E 36 0E 0E 06 00
71L,0- 09 0E 0E 36 1E 1E 06 00 09 9F 0D 0D 1E 3F 0E 0E
7120- 3F 1E 0D 0D DE 06 00 4A 76 39 3F 77 31 06 00 92
7130- 4A F6 06 00 92 2D 2D 06 00 92 92 09 06 00 4A 09
7140- 1E 1E 1E 1E 06 00 29 75 DF 33 4D 35 1F 1F 2E 4D
7150- FE 1B 0E 2D 06 00 09 3E 0E 36 76 3F 06 00 29 F5
7160- 1B 4D 31 1E F7 1E 2E 2D 35 00 2D 2D F6 3E 4E FE
7170- 1B 0E 2D 06 00 49 3E 1E 00 FE 33 2D 2D 1E 36 00
7180- 49 39 3F 37 2E 2D 0E 3-6 DF 73 2D 06 00 09 2D DE
7190- F3 2E 2D 0E DF 33 4D F1 3F 06 00 2D 2D F6 1E 1E
71A0- 36 06 00 29 75 DF 33 4D F1 3F 1E 4D 31 DF 73 2D
71B0- 06 00 29 75 DF 33 4D 31 3F 77 09 1E 1E 3F 06 00
71C0- 52 BI 06 00 4D 31 DF 33 2D 2D FE 1B 6E 09 06 00
71D0- 52 BI F6 06 00 49 1E IE 1Ê 0E 0E 0E 06 00 12 2D
71E0- 2D 16 3F 3F 06 00 71 0E 0E 1E 1E 1E 06 00 29 75
71F0- DF 73 09 1E B6 06 00 29 75 DF 33 0D 0D 3E FF 4E
7200- 39 1F 76 2D 35 00 09 15 1F 17 4D 31 DF 33 2D 2D
7210- FE 1B 6E 09 06 00 2D AD DF 33 4D F1 3F 37 4D 31
7220- DF 33 2D 35 00 29 AD DF 33 36 4D 11 DF 73 2D 06
7230- 00 2D AD DF 33 4D 31 DF 33 4D 31 DF 33 20 35 00
7240- 2D 2D DE 1B 6E 11 3F 37 36 2D 2D 06 00 2D 2D DE
7250- 1B 6E 11 3F 37 36 06 00 29 AD DF 33 4D 11 3F 1F
7260- 6E 09 FE 1B 0E 2D 06 00 4D 31 DF 33 4D 31 3F 3F
7270- 6E 09 FE 1B 6E 09 06 00 2D 2D DE 36 36 9F 2D 2D
7280- 06 00 29 2D 1E 36 DF 6A 31 DF 0E 35 00 4D F1 DF
7290- 6E 1E 37 0D 15 DF 6E 09 06 00 36 36 36 2D 2D 06
72A0- 00 4D 31 FF 37 0D 0D FE 1F 6E 09 FE 1B 6E 09 06
Apêndice D Texto na Tela de Alta Resolução 257

72B0- 00 4D 31 DF 33 6D 31 1F 1F 6E 29 FE 1B 6E 09 06
72C0- 00 29 AD DF 33 4D 31 DF 33 4D 31 DF 73 2D 06 00
72D0- 2D AD DF 33 4D 31 DF 33 2D F5 1B 36 00 29 AD DF
72E0- 33 4D 31 DF 33 0D 0D 1E DF 0E 6D 06 00 2D AD DF
72F0- 33 4D 31 DF 33 2D 35 DF 6E 09 06 00 29 AD DF 33
7300- 4D 3A 77 09 FE 1B 0E 2D 06 00 2D 2D DE 36 36 36
7310- 00 4D 31 DF 33 4D 31 DF 33 4D 31 DF 73 2D 06 00
7320- 4D 31 DF 33 4D 31 DF 33 4D F1 1F 0E 06 00 4D 31
7330- DF 33 4D 31 1F 1F 6E 0D 3E 1F 37 4D 31 00 4D 31
7340- DF 73 0D 1E 17 0D- 15 DF 33 4D 31 00 4D 31 DF 33
7350- 4D F1 1F 0E 36 06 00 2D 2D BE 1E 17 1E 2E 2D 35
7360- 00 2D F5 3B 2E 3E 2E 3E 2E 2D 06 00 72 0E 0E 0E
7370- 06 00 29 2D 3E 2E 3E 2E 3E DE 2D 35 00 09 0E 3F
7380- 1E 0D 0D DE 36 36 00 92 92 2A 2D 2D 35 00 49 1E
7390- 06 00 52 75 3E F7 4D 0E 1F 37 00 36 0D 75 DF 37
73A0- 4D 31 DF 37 0D 35 00 52 2D 0E DF 33 6E 09 1E 3F
73B0- 06 00 49 31 FE F7 4D 35 DF 33 4D 35 1F 37 00 52
73C0- 2D 0E DF 73 49 3F 3F 76 2D 06 00 09 75 DF 0E 3F
73D0- 0E 36 36 00 52 6D 3E DF 6E 29 FE 77 09 1E 3F 06
73E0- 00 36 2D 75 DF 33 4D 31 DF 33 4D 31 0.0 09 16 77
73F0- 36 0E 3F 06 00 49 16 77 36 FE 73 35 00 36 4D F1
7400- DF 6E 0E 1F 37 4D 31 00 29 36 36 F6 2D 06 00 12
7410- 6D 0E 1F 1F 6E 0D FE 1F 6E 0D 06 00 12 0D 75 DF
7420- 37 4D 31 DF 33 4D 31 00 52 2D 0E DF 33 4Ó 31 DF
7430- 73 2D 06 00 12 0D 75 DF 37 4D 31 DF 77 09 FF 36
7440- 00 52 6D 3E DF 6E 09 3E DF 0E 6D 36 00 12 0D 75
7450- DF 37 36 06 00 52 49 3F F7 0E 2D 0E 1E 3F 37 00
7460- 0A 4E 3F 77 36 4D 1E 37 00 12 4D 31 DF 33 4D 31
7470- FF 73 6D 06 00 12 4D 31 DF 33 4D F1 1F 0E 06 00
7480- 12 4D 31 1F 1F 6E 0D FE 1F 0E 0D 06 00 12 4D F1
7490- 1F 0E 0E 1F 1E 4D 31 00 12 4D 31 DF 33 4D F1 1F
74A0- 0E 1E 37 00 12 2D 2D 1E 1E 1E 1E 2D 2D 06 00 09
74B0- 2D DE 73 1E 77 F1 0E 2D 06 00 09 36 36 36 36 00
74C0- 2D 0E 1E 4E F7 0E 1E 3F 06 00 29 4D 1E FF 33 00
74D0- 49 2D 2D 2D 3E 3F 3F 37 2D 2D 2D 3E 3F 3F 37 2D
74E0- 2D 2D 3E 3F 3F 37 2D 2D 2D 3E 3F 3F 37 00 2D
APÊNDICE E
GUIA DE REFERÊNCIA
RÁPIDA PARA O EDITOR DE
TABELA DE FIGURAS
Apêndice E Guia de Referência Rápida para o Editor de Tab. de Figuras 259

Geral: >
V : Ver a lista dos comandos do EDITOR DE TABELA DE
• FIGURAS
Q : Para o EDITOR DE TABELA DE FIGURAS

Modo EDITAR FIGURA


Movendo o Cursor:
U : Move o cursor diagonalmente para cima e para a esquerda
I : Move o cursor para cima
O : Mbve o cursQr diagonalmente para cima e para a direita
J : Move o cursor para a esquerda
L : Move o cursor diagonalmente para baixo e para a
esquerda
, : Move o cursor para baixo
. : Move o cursor diagonalmente para baixo e para a direita
P : Modo “PADDLE”/modo “TECLADO” interruptor de
mudança
K : Seleciona o modo “TECLADO” (do modo “PADDLE”)
PDL(1) : Move o cursor verticalmente
PDL(O) : Move o cursor horizontalmente

Desenhando e Apagando:
D : Chave LIGA/DESLIGA do PONTO (LIGADO = desenhar)
DESLIGADO = não desenhar
T : (o mesmo que D) TARTARUGA para BAIXO/CIMA (para
BAIXO = desenhar, CIMA = não desenhar)
1 : Modo“DESENHAR”
0 : Modo“APAGAR”
2 : Modo “FUNDO”
W : Desenhar um único ponto
E : Apagar um único ponto
A : Ajustar A,B para o X,Y corrente (origem da linha ou caixa)
X : Desenhar uma linha de A,B para X,Y
B : Desenhar um retângulo com um canto em A,B e o canto
(diagonal) oposto em X.Y

Movendo a Figura da Edição:


seta esquerda (CTRL-H) : Movimentar a figura de edição para a esquerda
seta direita (CTRL-U) : Movimentar a figura de edição para a direita
seta p/ cima (CTRL-K) : Movimentar a figura de edição para cima
seta p/ baixo (CTRL-J) : Movimentar a figura de edição para baixo
260 Jogos de Ação para o Apple

Modo ARQUIVAR
F : Entrar o modo “ARQUIVAR" (do modo “EDITAR FIGURA”)
Estes são os comandos do modo “ARQUIVAR”:
<espaço> : Sair do modo "ARQUIVÀR” (para o modo “EDITAR
FIGURA”)
A : Adicionar a FIGURA DE EDIÇÃO ao ARQUIVO.DE
TABELA DE FIGURAS (Então tecle I para Inserir
ou A para Adicionar)
F : Status do arquivo (dá o número de figuras e tamanho)
—> : Ver a próxima figura no ARQUIVO DE TABELA DE
FIGURAS
<—: Ver a figura anterior no ARQUIVO DE TABELA DE
FIGURAS
L : Carregar a FIGURA DO ÁRQUIVO corrente na FIGURA
DE EDIÇÃO
V : Sobrepor a FIGURA DO ARQUIVO corrente na FIGURA
DE EDIÇÃO
S : Selecionar o número da figura que você quer ver
D : Apagar a atual figura mostrada (ou apagar todo o
ARQUIVO DE TABELA DE FIGURAS)

Modo COMANDO DOS


S : Entrar o modo “COMANDO DOS" (do modo “EDIÇÃO
DE FIGURA”)
Estes são os comandos do modo “COMANDO DOS”:
< espaço : Sair do modo “DOS” (para o modo “EDIÇÃO DE FIGURA”)
P : Muda o Prefixo do ProDOS (o default é / JOGOS.AÇÃO)
C : Catalogar o drive por drive ou prefixo
L : Carregar o ARQUIVO TABELA DE FIGURAS do drive
corrente
APÊNDICE F
PROGRAMANDO O MOUSE
DO APPLE
262 Jogos de Ação para o Apple

O Mouse do Apple é um periférico pequeno, quase do tamanho de


um (você acreditaria?) rato. Ele tem um rolamento embaixo, um dispositi­
vo de apertar em cima e um cabo ("rabo”) conectado ao seu computador
Apple //e ou //c. O aparecimento do computador Apple Macintosh tor­
nou o mouse famoso, e agora ele está disponível para a maioria dos
computadores.
O folheto de instruções que acompanha o mouse do Apple é claro e
fácil de entender. Ele dá exemplos curtos e simples sobre como progra­
mar o mouse do Applesoft BASIC.
Não repetiremos estas instruções aqui. O objetivo deste Apêndice é
dar um programa-exemplo de jogo usando o mouse.
A Listagem F é uma versão mouse do jogo Wipeout, dado original­
mente no Capítulo 5. Ela mostra o código BASIC necessário para inicia-
lizar o mouse (ver linha 860), ler o mouse (ver linha 1000 no começo do
Ciclo Principal) e calcular o movimento da nave estelar baseado na entra­
da via mouse (ver linhas 1020-1200).
Leia o manual do usuário do mouse e então olhe a listagem Wipeout
Mouse para entender como interfacear o mouse com todos os tipos de
jogos.
Apêndice F Programando o Mouse do Apple 263

Listagem F: WIPEOUT.MOUSE

10 REM #***»*#*#»*#****#*#*****
20 REM * WIPEOUT.MOUSE *
30 REM * BY SCOTT BRENT Z. *
40 REM * COPYRIGHT (C) 1985 *
50 REM * COMPUTER EXPRESSIONS *
60 REM * 1129 EAST 470 NORTH *
70 REM * OREM, UTAH 84057 *
80 REM *************************
90 REM
190 REM

INTRODUÇÃO:

200 TEXT : i-ÍOME


220 VTAB 10:AS = " WIPEOUT INVERSE : GOSUB
6000: NORMAL
240 VTAB 12:AS = "BY S. SCOTT ZIMMERMAN”:
GOSUB 6000: VTAB 14:AS = "COPYRIGHT (C)
1985": GOSUB 6000
320 VTAB 23: PRINT "TECLE <ESPACO> -> "; :
GET AS
490 REM

ARRANJO:

500 GR : HOME :TM = 60:TL = O:KL = 50:SM »


10:SN = - 16336
510 REM

DESENHA KLORYONS:

520 COLOR= 15: FOR I = 1 TO KL


540 X = INT ( RND Cl) * 39)
560 Y = INT ( RND (1) 39) *
580 IF SCRN ( X,Y) X
0 THEN 540
600 PLOT X,Y: NEXT I
610 REM

DESENHA MINAS ESPACIAIS:

620 COLOR-' 1: FOR I = 1 TO SM


640 = INT C RND (1) * 39)
660 INT ( RND (1) 39)
*

680 IF SCRN ( X,Y) < 0 THEN 640


X*
264 Jogos de Ação para o Apple

700 PLOT X,Y: NEXT I


790 REM

DESENHA NAVE ESTELAR, ETC.

aoo COLOR= 12: X = 20:Y = 39:MX = 1:MY = 0:


PLOT X,Y
820 VTAB 22: PRINT "KLORYONS88”;KL
840 VTAB 22: HTAB 29: PRINT ”TEMPO=";TM
850 REM

MOUSE PRONTO:

860 D* = CHRS? (4): PRINT D$"PR#4": PRINT


CHR$ (1) : PRINT D£"PR#0": PRINT D$"IN#4"
aso DM = 10:XC = DM:YC = DM
990 REM

CICLO PRINCIPAL:

1000 VTAB 21: INPUT ”";A,B,C


1020 IF A > XC THEN IF A - XC > ABS (B -
YC) THEN MX = 1:MY = 0: GOTO 1140
1040 IF A < XC THEN IF ABS (A - XC) *•> ABS
(B - YC) THEN MX = - 1:MY = 0
1060 IF B > YC THEN IF Ei - YC > ABS <A ...
XC) THEN MY = 1:MX = 0: GOTO 11 40
1080 IF B < YC THEN IF ABS (B - YC) y ABS
(A - XC) THEN MY = - 1:MX = 0
1140 IF A > XC + DM THEN XC = A - DM: GOTO
1180
1160 IF A < XC - DM THEN XC = A + DM
1180 IF B > YC +• DM THEN YC,= B - DM: GOTO
2000
1200 IF B < YC - DM THEN YC = B + DM
1990 REM

CALC . MDV. DA NAVE ESTELAR:

2000 XI - X:¥l = Y
2020 X = X i- MX:Y = Y + MY
2030 REM

VERIFICA BORDA DA TELA:

2040 IF X < 0 THEN X = 39: GOTO 2120


2060 IF Y < 0 THEN Y = 39: GOTO 2120
Apêndice F Programando o Mouse do Apple 265

2080 IF X > 39 THEN X = 0: GOTO 2120


2100 IF Y > 39 THEN Y = 0
2110 REM

PEGA COR EM X,Y NOVO:

2120 SP = SCRN( X,Y)


2130 REM

APAGA VELHO, DESENHA NOVO:

2140 COLOR» 0: PLOT X1,Y1: COLOR» 12: PLOT


X,Y:S = PEEK (SN) + PEEK (SN)
2150 REM

VERIFICA POR COLISOES:

2160 IF SP = 1 THEN 15000


2180 IF SP = 15 THEN FOR J = 1 TO 80:S =
PEEK (SN): NEXT :KL = KL - 1: VTAB 22:
HTAB 10: PRINT KL; " IF KL = O THEN
10000
2190 REM

CRONOMETRO:

2200 TL = TL + 1: IF TL = 15 THEN TM = TM -
1:TL = 0: VTAB 22: HTAB 35: PRINT TM;
, ” IF TM = O THEN 15000
5000 GOTO 1000
5990 REM

SUB-ROT. CENTR. IMPRESSÃO:

6000 HTAB (40 - LEN (A$)) / 2: PRINT A$: RETURN

9990 REM

FINAIS DE PERDER E GANHAR:

10000 CALL - 198: TEXT : HOME : VTAB 10: HTAB


14: PRINT "VOCE VENCEU!!": GOTO 20000
15000 CALL - 198: TEXT : HOME : VTAB 10: HTAB
14: PRINT "VOCE PERDEU!"
20000 VTAB 18: PRINT "KLORYONS»";KL: PRINT “TEMPO»"TM
20020 PRINT D$"IN#O": VTAB 22: CALL - 958:
266 Jogos de Ação para o Apple

PRINT"JOGAR DE NOVO? (S/N) ";:, GET At:


PRINT At
20040 IF At = "S,! THEN 500
20060 IF At < > "N" THEN 20020
APÊNDICE G
BIBLIOGRAFIA
268 Jogos de Ação para o Apple

Referências para Programação de Applesoft BASIC

1. The Applesoft Tutorial, Apple Computer Inc., Cupertino, CA, 1979. Se


você não sabe Applesoft BASIC, deveria começar a aprender com es*
te livro. Se você não sabe os gráficos de alta resolução do Apple, tarn,
bém deveria começar aqui.
2. Manual de Referência do Programador dè Applesoft BASIC, Apple
Computer, Inc., Cupertino, CA 1982. Certifique-se de estar familiar
com todos os comandos de gráficos dados nos çapítulos dé gráficos
de alta e baixa resolução.
3. Lon Poole, Apple II User’s Guide, Osborne/McGraw-Hill, Berkeley, CA,
1981. Um bom texto suplementar de Applesoft BASIC, com excelentes
explicações de gráficos no Apple. Preste atenção especial para pp.
203-224, no Capítulo 6.
4. Brian D. Blackwood and George H. Blackwood, Applesoft Language,
2.a ed., Howard Sams, Indianápolis, 1983. Um bom e abordante tutor
de programação Applesoft.
5. All About Applesoft, Apple PugetSound Program Library Exchange,
Kent, Washington, 1980. Uma visão excelente, detalhada, abordante e
técnica do Applesoft BASIC.

Referências para Gráficos do Apple

6. David Luar, “The Graph Paper”, em Creative Computing, vol. 8, n.° 7


(julho, 1982) ao vol. 9, n.° 3 (março, 1983). Uma série de nove partes
de Gráficos do Apple. Dois artigos (agosto e setembro de 1982) co­
brem tabelas de figuras de alta resolução.
7. Mark Pelczarski, “Graphically Speaking”, em Softalk, de maio de 1982
a setembro de 1983. Os artigos de maio de 1982 até novembro de 1982
abrangem tabelas de figuras de alta resolução.
8. Jeffrey Stanton, Apple Graphics & Arcade Game Design, The Book
Company, Los Angeles, 1982. O Capítulo 1 abrange gráficos e tabelas
de figuras de alta resolução. O livro também discute rotinas de lingua­
gem assembly para animação.
9. Bill Dudge, “The Graphics Page”, em Softalk, de outubro de 1983 a
julho de 1984.
10. Nibble (revista), MicroSPARK, Inc., Concord, Mass. Quase todos os
números têm um ou mais artigos sobre gráficos no Apple. Uma revis­
ta excelente para programadores de Applesoft.

Referências para Sistemas Operacionais de Disco do Apple

11. The DOS Manual, Apple Computer, Inc., Cupertirio, CA, 1981. A refe­
rência padrão do usuário jpara DOS 3.3.
Apêndice G Bibliografia 269

12. The ProDOS User’s Manual, Apple Computer* Inc., Cupertino, CA, 1984.
13. BASIC Programming with ProDOS, Apple Computer, Inc., Cupertino,
CA, 1984.
14. Don Worth and Pieter Lechner, Beneath Apple DOS, 1981 e Beneath
Apple ProDOS, 1984, Quality Software, Reseda, CA.
15. Sandy Mossberg, “An Introduction to ProDOS”, Nibble, março de
1984.Informações sobre as diferenças entre o DOS .3.3 e o ProDOS.
16. All About DOS, Apple PugetSound Program Library Exchange, Kent,
Washington, 1983. Contém boas informações e utilitários para o DOS
3.3.
Outros títulos publicados pela Editora Manole

BASIC Ba»±
David iluTiro

Vo

MSX A mb 1

MSX Ac

MSX R s Gra-Fic mb 1 i
Stere Hebb

MSX mms »m 1— x riçgux


Stere Hebb'

MSX d

Mai Jogo® e Gra-F i par < MSX


Graham Carter

SPECTRUM Jogo® d A
Pierre Honsaut

Aul * d BASIC
1 Hubert Alqueres

250 R de
Ledi n

Caso nao encontrar os livros na sua livraria, procurer


na editora que fica na Rua 13 de Maio , 1026 - Bela Vista - SP
(travessa da Av. Brig. Luis Antonio)
Fone: 2 S 77 — O 77 cS

Este livro foi impresso pela


arte* fíáfIo» çvmi í/a.
Rod. Presidente Dutra.km 214
Fone: 912^1388- Guarulhos
I

/
Faça os seus próprios jogos no seu
Apple II +, lie, lie ou computador compa­
tível.
Escrito para programadores experientes
de BASIC, este livro explica a criação sólida
de jogos e técnicas de programação — e
inclui 11 jogos originais que mostram estas
técnicas em ação.
Jogos de Ação para o Apple ensina métodos úteis de criação de jo­
gos que aumentarão seu divertimento e diminuirão sua frustração. Este
livro inclui:
• instruções claras, fáceis de se entender, para escrever jogos de ação
para computadores
• 3 utilitários poderosos para colocar gráficos e som nos seus programas
• explicações e exemplos de animação, efeitos sonoros do tipo de flipe-
rama, música, gráficos de alta e baixa resolução e cronômetros de
jogos
e sugestões para a melhoria e a modificação de cada jogo
• jogos excitantes como: Snake, Space Hunter, Race Car, Alien Defense,
Nuclear Fallout e outros.
Os programas e as técnicas de programação deste livro foram testa­
dos com sucesso por centenas de estudantes da Brigham Young Univer­
sity Youth Computer Academy — você pode estar certo então de que eles
funcionam.

Dr. S. Scott Zimmerman é Professor Associado na Brigham Young


University em Provo, Utah. Ele é o diretor curricular da B.Y.U. Computer
Academy, um editor colaborador da revista Nibble e autor de vários sof-
wares comerciais.
Como instrutora para o B.Y.U. Continuing Education Department,
Beverly B. Zimmerman tem ensinado processamento de dados e aplica­
ções de computadores a muitos jovens e adultos. Ela é sócia da Com­
puter Expressions, uma firma de consultoria de computadores.

EDITORA
MANOLE
LTDA.
s

MANOLE

Você também pode gostar