Introdução à Ciência
da Computação com Jogos
Preencha a ficha de cadastro no final deste livro
e receba gratuitamente informações
sobre os lançamentos e as promoções da Elsevier.
Consulte também nosso catálogo completo,
últimos lançamentos e serviços exclusivos no site
www.elsevier.com.br
Introdução à Ciência
da Computação com Jogos
© 2010, Elsevier Editora Ltda.
Todos os direitos reservados e protegidos pela Lei no 9.610, de 19/02/1998.
Nenhuma parte deste livro, sem autorização prévia por escrito da editora, poderá ser reproduzida ou
transmitida sejam quais forem os meios empregados: eletrônicos, mecânicos, fotográficos, gravação ou
quaisquer outros.
Copidesque: Adriana Kraner
Revisão: Marília Pinto de Oliveira
Editoração Eletrônica: SBNIGRI Artes e Textos Ltda.
Elsevier Editora Ltda.
Conhecimento sem Fronteiras
Rua Sete de Setembro, 111 – 16o andar
20050-006 – Centro – Rio de Janeiro – RJ – Brasil
Rua Quintana, 753 – 8o andar
04569-011 – Brooklin – São Paulo – SP – Brasil
Serviço de Atendimento ao Cliente
0800-0265340
[email protected]
ISBN 978-85-352-3419-0
Nota: Muito zelo e técnica foram empregados na edição desta obra. No entanto, podem ocorrer erros
de digitação, impressão ou dúvida conceitual. Em qualquer das hipóteses, solicitamos a comunicação
ao nosso Serviço de Atendimento ao Cliente, para que possamos esclarecer ou encaminhar a questão.
Nem a editora nem o autor assumem qualquer responsabilidade por eventuais danos ou perdas a
pessoas ou bens, originados do uso desta publicação.
CIP-Brasil. Catalogação-na-fonte.
Sindicato Nacional dos Editores de Livros, RJ
_________________________________________________________________________
F328i Feijó, Bruno
Introdução à ciência da computação com jogos : aprendendo a
programar com entretenimento / Bruno Feijó, Esteban Clua e Flavio
S. Corrêa da Silva. – Rio de Janeiro: Elsevier, 2010.
Apêndice
ISBN 978-85-352-3419-0
1. Programação (Computadores). 2. Jogos por computador. 3. Animação por computador. 4. Computação. I. Clua, Esteban. II. Silva,
Flavio S. Corrêa da. III. Título.
09-4873.
CDD: 005.1
CDU: 004.42
_________________________________________________________________________
Agradecimentos
Muitas pessoas contribuíram para a realização desta obra. Em primeiro
lugar estão as nossas famílias, que se privaram do nosso convívio e da nossa
atenção durante a nossa contínua e exagerada jornada extra de trabalho. Para
eles vão os agradecimentos, literalmente infinitos, pelos apoio, compreensão
e paciência. Bruno agradece à sua esposa Carmem e aos seus filhos Marcelo e
Leonardo. Esteban agradece à sua esposa Luciana. Flávio agradece à sua esposa Renata e à sua filha Maria Clara.
Este livro não teria surgido sem o espírito inovador de Karin Breitman
(professora e pesquisadora do Departamento de Informática da PUC-Rio)
que, na qualidade de Diretora de Publicações da Sociedade Brasileira de Computação, deu toda a atenção e todo o estímulo aos autores.
Agradecimentos efusivos vão para a equipe da Editora Campus Elsevier
que com rigor, competência e muita paciência nos acompanharam passo a
passo. Em especial, gostaríamos de citar André Gerhard Wolff, Vanessa Vilas
Bôas Huguenin e Silvia Barbosa Lima.
Sem a ajuda de Lucas Machado e Rodrigo Martins, o motor javaPlay não
teria sido possível. Não temos como agradecer suficientemente a dedicação
desses dois pesquisadores do VisionLab/PUC-Rio. Raros profissionais no país
têm a competência desses dois pioneiros da área de jogos digitais.
A equipe por detrás deste livro é ainda maior e a muitos devemos palavras de agradecimento: Luciana Rocha Mariz Clua, por sua ajuda em design
gráfico; Fernando Ribeiro e Pablo Bioni, pela arte nos elementos visuais dos
jogos; Anselmo Antunes Montenegro e Dante Corbucci Filho, professores do
Instituto de Computação/UFF, como consultores em Java; e Marcelo Pana-
ro Zamith, pela ajuda no material de demonstração colocado no site. Com o
receio de não sermos suficientemente abrangentes e considerando o grande
número de pessoas, nos limitamos a agradecer, em bloco, a todos os nossos
alunos – nossa primeira fonte de inspiração e de colaboração na pesquisa e
no ensino – por seus permanentes questionamentos, suas incuráveis mentes
criativas e suas alegrias em aprender e ajudar.
Os Autores
Bruno Feijó possui graduação em Engenharia Aeronáutica pelo
ITA, mestrado em simulação dinâmica pela PUC-Rio e doutorado em CAD
(Computer-Aided Design) pela University of London. Atualmente é professor
associado do DI (Departamento de Informática) da PUC-Rio, no Grupo de
Computação Gráfica e Entretenimento Digital, e Coordenador do VisionLab/
PUC-Rio – Laboratório de Visualização, TV/Cinema Digital, Games e Produção de Conteúdo Digital. É pioneiro em 3 áreas de pesquisa em Informática
no país: CAD, Animação e Jogos. Foi um dos criadores da Comissão Especial
da SBC em Jogos e Entretenimento Digital e foi o seu primeiro Presidente. Ele
também é um dos fundadores do SBGames (Simpósio Brasileiro de Jogos e
Entretenimento Digital). Foi o idealizador da Rede Brasileira de Visualização
(RBV) ligada ao MCT. Também foi um dos principais colaboradores na idealização do curso profissionalizante do Núcleo de Pesquisa em Educação, criado
pelo Instituto Oi Futuro. Na pós-graduação do Departamento de Informática
da PUC-Rio, da qual já foi Coordenador, ministra cursos de jogos, animação
e efeitos especiais. Na graduação do DI/PUC-Rio, da qual já foi Coordenador,
tem ministrado os cursos de introdução à ciência da computação por cerca de
15 anos.
Esteban Clua possui graduação em Computação pela USP, mestrado
pela PUC-Rio e doutorado também pela PUC-Rio. Atualmente é professor
do Instituto de Computação da UFF e coordenador geral do UFF Media Lab,
além de atuar na pós-graduação dessa universidade. Atua especialmente na
área de Computação Gráfica em tempo real, Games, Realidade Virtual, GPUs,
visualização e simulação. É membro do conselho administrativo da ABRAGAMES, membro da Comissão Especial de Jogos e Entretenimento Digital
da SBC e um dos pioneiros na área de pesquisa científica em jogos e entretenimento digital. Também é um dos criadores do SBGames e um grande entusiasta da área de jogos digitais.
Flávio S. Correa da Silva possui graduação em Engenharia de Produção pela USP, mestrado pela Politécnica da USP e doutorado em Inteligência Artificial pela University of Edinburgh. Atualmente é professor associado
da USP, revisor do Journal of Information Technology Research e membro do
corpo editorial da Applied Intelligence (Boston).
Prefácio
Estamos vivendo a revolução do mundo digital, onde ter noções de
programação é tão essencial quanto saber o básico da matemática, da física,
da economia, e quem sabe até dos primeiros socorros médicos... Até mesmo
artistas e designers já perceberam que programar está na essência das novas
mídias. Se você abriu este livro, muito provavelmente você ou é um fissurado
por jogos, ou é um estudante, ou é um educador, ou pelo menos é um curioso
incorrigível (uma das maiores qualidades do novo profissional criativo). Em
qualquer desses casos, você deve estar buscando uma introdução à arte de programar que esteja mais próxima das novas demandas do mundo digital e que
seja menos maçante para acompanhar. Você também pode estar procurando
uma introdução à arte de desenvolver jogos digitais, quer porque você almeja
ser um profissional da área, quer porque lhe disseram que o jogo digital é uma
aplicação onde convergem os maiores desafios da computação (um jogo tem
que ser multimídia, visualmente elaborado, distribuído, artificialmente inteligente ... e tudo isso rodando em tempo real). Como educador, muito provavelmente você deve estar buscando um texto mais leve e estimulante para
a geração de jovens Y. Este livro pretende atender a todas essas expectativas.
Muita coisa mudou desde que a primeira linguagem de programação de
alto nível foi lançada há mais de 50 anos. Desde então, as linguagens e os paradigmas de programação têm evoluído constantemente. Linguagens caem em
desuso e novas surgem. E qual a melhor linguagem para aprender no momento? Essa é uma pergunta que vem sendo formulada desde o momento em que
surgiram duas linguagens diferentes e os primeiros cursos de computação; e
provavelmente continuará a ser feita até o dia em que não precisaremos mais
dos computadores... Muito dificilmente haverá um consenso na resposta a essa
pergunta, mesmo entre os mais conceituados cientistas de computação do país.
Não existe a situação ideal de que podemos aprender os conceitos da ciência da
computação sem nos incomodarmos com as idiossincrasias e as complexidades
de uma particular linguagem. Talvez o Lisp seja a que mais tenha se aproximado deste ideal (sua qualidade é atestada pelo fato de ser a segunda mais antiga
linguagem do planeta ainda viva). Mas o Lisp está longe de ser uma opção para
as novas demandas do mundo digital. A linguagem C já está distante dos novos
paradigmas de programação. C++ é muito eficiente, especialmente no mundo
dos jogos 3D, mas além de estar se tornando antiga, não é uma linguagem de
fácil aprendizado. Neste livro optamos pela linguagem Java por várias razões.
Primeiro, o Java possibilita aplicações em uma grande variedade de plataformas:
internet nos servidores, PCs, celulares e sistemas embarcados. Segundo, o Java
roda em mais de um sistema operacional (Windows, Linux, ...) e conta com um
bom ambiente de desenvolvimento gratuito (NetBeans). Terceiro, o Java é uma
linguagem orientada a objetos – um paradigma atual de programação. Quarto,
Java é o ponto de partida para a programação da internet – a invenção que determinará o futuro da computação. Quinto, a próxima geração de linguagens
orientadas a objetos será a evolução natural do Java (como já o é a linguagem
C#). Sexto, Java serve muito bem para desenvolver jogos 2D – o tipo de aplicação que estamos usando neste livro.
Independente da escolha do Java, este livro procura, antes de mais nada,
apresentar os conceitos e os bons hábitos da arte de programar. Dessa maneira, o livro está organizado em duas partes. A primeira parte se concentra na
programação procedimental estruturada (capítulos 2 a 6) e a segunda parte é
dedicada aos paradigmas de orientação orientada a objetos e de programação
guiada a eventos (capítulos 7 a 9). Introduzir o conceito de orientação a objetos não é uma tarefa fácil, mas é indispensável no cenário atual da ciência
da computação. Este livro procura ir trazendo esse novo conceito aos poucos,
sem pretender esgotar o assunto, nem aspirar ser usado como um livro de
referência. Este é um livro didático que funciona como ponto de partida para
os modernos conceitos em ciência da computação. O projeto deste livro inclui
uma terceira parte, disponível na internet, que pode sustentar um curso mais
avançado e/ou pode dar continuidade a uma especialização na área de desenvolvimento de jogos:
www.inf.puc-rio.br/livroicc
A melhor maneira de usar este livro é implementar cada exemplo citado
no texto e fazer os exercícios no final de cada capítulo. Um motor de jogo 2D,
chamado javaPlay, foi especialmente desenvolvido para este livro. O javaPlay
é conciso, didático, mas tem uma estrutura profissional, moderna e com possibilidade de ser usado com eficiência pela indústria. O javaPlay é apresentado em várias versões de graus crescentes de complexidade: Mini (a versão
minimalista, para começar), Versão 00 (a versão intermediária) e Versão 0 (a
versão-base mais completa). A Versão 1 deverá ser a que o leitor mais dedicado certamente criará.
Os apêndices complementam o estudo e servem de referência. Recomendamos, em especial, que sejam feitos os projetos de jogos do Apêndice B.
Os amantes de desenvolvimento de jogos acharão muito interessante o Apêndice A. Os Apêndices C e D servem de referência para o motor de jogo javaPlay.
Este é um livro texto para um primeiro curso de introdução à ciência da
computação, usando a criação de jogos digitais como instrumento de aprendizado e motivação. Esta obra é organizada em uma sequência de tópicos que
correspondem a um curso de 64 horas, em blocos de 4h/semana (16 semanas,
ao total). Sugestões de sequência de assuntos e material de suporte ao professor e ao aluno podem ser encontrados na página Web citada anteriormente.
Uma possível sequência para 16 semanas pode ser:
semana 1:
apresentação e cap.1
semana 2:
cap.2
semana 3:
cap.3
semanas 4 a 6:
cap.4
semana 7:
cap.5
semana 8:
cap.6
semanas 9 a 11:
cap.7
semanas 12 a 14: cap.8
semanas 15 e 16: cap.9
Uma outra sequência de aprendizado pode ser proposta através de dois
cursos, com mais tempo para elaborar os conceitos:
Curso I – Programação Procedimental Estruturada
Cap. 1 ao Cap. 5
Cap.6 como preparação ao Curso II
Curso II – Programação Orientada a Objetos e Guiada a Eventos
Cap. 7 ao Cap. 9
Material extra no site sobre estruturas de dados
A presente obra é resultado de anos de experiência dos autores no ensino de programação e de disciplinas de jogos, em três das melhores universidades do país. Este livro representa uma contribuição tanto para iniciar as
pessoas na arte da programação como para ajudar na formação básica da mão
de obra necessária para as oportunidades que surgem com a indústria do entretenimento (jogos e TV digital interativa) e com as aplicações de simulação
em tempo real.
Sumário
Capítulo 1 – Computadores ........................................................................ 1
1.1. A Long Long Time ago…............................................................................. 1
1.2. al-Khowarizm ................................................................................................ 3
1.3. Para que serve a computação? ..................................................................... 5
1.4. Qual é o idioma dos computadores? .......................................................... 6
1.5. Insetos ............................................................................................................. 9
1.6. Sintaxe e semântica ..................................................................................... 10
1.7. Arquitetura de computadores.................................................................... 11
CPU............................................................................................................... 12
Memória ....................................................................................................... 14
Barramento .................................................................................................. 14
1.8. Dispositivos de entrada e saída ................................................................. 15
Capítulo 2 – Variáveis, Tipos de Dados e Expressões ............................... 17
2.1. Primeiros passos, ou melhor, primeiras palavras em Java ..................... 18
2.2. Saída de dados ............................................................................................. 21
2.3. Comentários ................................................................................................ 22
2.4. Variáveis ....................................................................................................... 23
2.5. Entrada de dados......................................................................................... 29
2.6. Expressões .................................................................................................... 31
Exercícios................................................................................................................ 40
Capítulo 3 – Controle de Fluxo por Comandos de Seleção...................... 43
3.1. O comando if-else ....................................................................................... 44
3.2. O comando Switch ...................................................................................... 48
3.3. Um pouco mais sobre controle de fluxo .................................................. 52
Exercícios................................................................................................................ 52
Capítulo 4 – Métodos e Soluções .............................................................. 55
4.1. Métodos ........................................................................................................ 55
4.2. Criando um método estático ..................................................................... 57
4.3. Sobrecarga de métodos............................................................................... 60
4.4. Soluções Iterativas com laços .................................................................... 61
4.4.1. O Laço while ............................................................................... 62
4.4.2. Erros Numéricos em Soluções Iterativas .................................... 64
4.4.3. Os Laços for e do-while ........................................................ 68
4.5. Soluções recursivas ..................................................................................... 70
Exercícios................................................................................................................ 77
Capítulo 5 – Dados compostos como vetores ........................................... 79
5.1. Vetores unidimensionais ............................................................................ 80
5.2. Vetores bidimensionais .............................................................................. 85
Exercícios ................................................................................................... 87
Capítulo 6 – Usando Mais Objetos e Classes Simples .............................. 89
6.1. Um programa, muitas classes... ................................................................. 90
6.2. O tipo de dados String................................................................................ 93
6.3. Leitura e gravação de arquivos .................................................................. 96
6.4. Classes abstratas e interfaces ..................................................................... 98
Exercícios..............................................................................................................101
Capítulo 7 – Classes, Objetos e Herança..................................................103
7.1. Classes e objetos ........................................................................................104
7.2. O modificador Static .................................................................................107
7.3. Instância versus estático ...........................................................................108
7.4. Abstração de classe e encapsulamento ...................................................109
7.5. A referência this ....................................................................................113
7.6. Herança ......................................................................................................114
7.7. A palavra-chave super ...........................................................................118
7.8. Classes abstratas ........................................................................................119
7.9. As classes GameObject e Player ..............................................................123
Exercícios..............................................................................................................125
Capítulo 8 – Programação Gráfica ..........................................................127
8.1. As classes Graphics e Color.......................................................................128
8.2. Escrevendo texto no modo gráfico .........................................................138
8.3. O Game Loop ............................................................................................140
8.4. Incrementando o modo gráfico...............................................................144
8.5. Colisão ........................................................................................................153
8.6. Opsss... tratamento de exceção................................................................156
Exercícios..............................................................................................................160
Capítulo 9 – Programação Guiada a Eventos ..........................................163
9.1. Eventos e ações simples ............................................................................164
9.2. Eventos de teclado.....................................................................................167
9.3. Eventos definidos no contexto do jogo ..................................................170
Exercícios..............................................................................................................177
APÊNDICES
A – Desenvolvimento e Design de Jogos ..................................................181
A.1. Introdução..................................................................................................181
A.2. Design de um jogo ....................................................................................182
A.3. Desenvolvimento artístico .......................................................................188
Modelagem 3D ..........................................................................................188
Terrenos ......................................................................................................190
A.4. Programação / Motores de jogos ............................................................191
Módulo de Visualização ...........................................................................194
Módulo de Física .......................................................................................196
Módulo de Áudio ......................................................................................197
Módulo de Inteligência Artificial ............................................................197
A.5. Motores de jogos: Qual usar? ..................................................................198
Bibliografia ...........................................................................................................199
B – Sugestões de Projetos .........................................................................201
B.1. Frogger........................................................................................................201
B.2. SpaceWar!...................................................................................................202
B.3. Tetris ...........................................................................................................203
C – O Motor 2D javaPlay..........................................................................205
C.1. JavaPlay – Versão Mini .............................................................................206
C.1.1. Demo da Versão Mini .................................................................207
C.1.2. javaPlay reduzido para a Versão Mini.......................................209
C.2. Demo Versão 00 ........................................................................................213
C.3. Demo da Versão 0 .....................................................................................222
C.4. javaPlay para as Versões 00 e 0 ................................................................233
D – O Projeto do javaPlay ........................................................................250
D.1. Arquitetura geral .......................................................................................250
D.2. Sistema Motor............................................................................................251
D.3. Sistema de estado ......................................................................................252
D.4. Objetos de jogo ..........................................................................................253
D.5. Sistemas de entrada...................................................................................253
D.6. Sistema gráfico ...........................................................................................254
D.7. Sprites .........................................................................................................256
D.8. Exemplo de loop........................................................................................256
Índice Remissivo ......................................................................................259
Download

Introdução à Ciência da Computação com Jogos