Professional Documents
Culture Documents
IntroduoaDesenvolvimentode JogosemJava
Corrigido e ampliado em 20/Fev/2009
Java e OO
Intro OO
Aplicaes
Est. Dados
Mais Java
GUIs Applets
Componentes Graphics
Layouts Threads
+ Componentes
RafaelSantos
Jogos e Java Verso 1 Verso 2 Verso 3 Exerccios
Organizao
Apoio
Extras Showcase Empacotando Omisses
Referncias
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 1 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 2
Ementa
Ementa
Encapsulamento: classes, instncias, atributos e mtodos. Herana e polimorfismo. Aplicaes executveis. Estruturas de dados.
Aplicaes grficas (applets e aplicaes desktop). Componentes de interfaces grficas e layout de tela. Criando componentes. Programao com eventos. Imagens e cones. Threads (linhas de execuo).
Java e OO
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 3 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos
Mais Java
4
Ementa
Loop do jogo. Sprites. Deteo de Coliso. Criao e remoo de objetos durante o jogo.
Java como opo para programao de jogos simples. Design grfico. 3D. udio. Deployment e distribuio. Inteligncia Artificial.
No veremos:
Exerccios.
Jogos e Java
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 5
Fevereiro/2009
(des)motivao ?
D pra aprender a programar jogos em Java em algumas horas? Livros (veja na Amazon e nas referncias!):
Java 1.4 Game Programming: 647pp. Java 2 Game Programming: 784pp. Developing Games in Java: 996pp. Killer Game Programming in Java: 970pp. Pro Java 6 3D Game Development: Java 3D, JOGL, JInput and JOAL APIs: 528 pp. Beginning Java Game Programming: 346 pp. Practical Java Game Programming: 508pp. Java Game Programming for Dummies: 384 pp.
http://www.lac.inpe.br/~rafael.santos 7 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 8
Fevereiro/2009
O que aprender?
Threads Java e OO Colees
I/O e Rede
Swing/AWT
Abstrao x velocidade. Partes dependentes/independentes de arquitetura. Velocidade de aplicaes grficas/Swing. Veja o Showcase! Novas APIs, esforos comunitrios. Verdade...
Persistncia e DB
Componentes
Eventos
Renderizao
Java2D
Temporizadores
Java3D
Images e cones
Performance
Som e udio
Sprites
Deteo de Colises
Inteligncia Artificial
Fevereiro/2009
Sistemas Distribudos
http://www.lac.inpe.br/~rafael.santos
Outras APIs
9
Fevereiro/2009
Atributos e funes relevantes a um domnio ou problema so encapsulados em uma classe de forma que:
Somente atributos e funes relevantes sejam representados; Uma interface seja criada para que usurios/desenvolvedores tenham acesso somente a funes e atributos que devam ser acessados diretamente.
O desenvolvedor esconde os detalhes sobre o funcionamento da classe, mostrando apenas as funes que so relevantes ao objeto representado.
11 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 12
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Deve ter uma posio (par de coordenadas X e Y). Deve ter um ngulo de orientao. Podemos modificar o ngulo da nave em pequenos incrementos. A posio deve ser modificada por uma regra interna (ex. em funo de tempo, velocidade, orientao, etc.) Cdigo externo classe pode recuperar posio da nave, mas no modificar a posio diretamente.
public void move() { } // modifica X e Y public void desenha() { } // desenha nave na posio e orientao }
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
14
Classes devem ser organizadas em pacotes. Classes so geralmente pblicas. Atributos so geralmente privados (veremos herana adiante).
Criamos novos objetos ou instncias a partir das classes usando a palavra-chave new.
public Nave() { } // inicializa variveis com valores adequados public int getX() { return x; } public int getY() { return y; }
public void giraHorrio() { ngulo += 5; if (ngulo > 360) ngulo = ngulo - 360; } public void giraAntiHorrio() { ngulo -= 5; if (ngulo < 0) ngulo = ngulo + 360; }
Devemos ter uma boa idia do que so construtores e mtodos e das palavras-chave usadas nestes exemplos!
public void move() { } // modifica X e Y public void desenha() { } // desenha nave na posio e orientao }
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 15 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 16
Permitido.
Proibido.
Exemplo: uma nave em um jogo que tem algumas capacidades adicionais, representadas por atributos.
Devemos escrever mtodos adicionais para manipular estes atributos. Podemos sobreescrever ou chamar mtodos j existentes.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
17
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
18
public NaveEspecial() { super(); // construtor da classe ancestral } // inicializa variveis com valores adequados public void habilitaRaios() { temRaios = true; }
Permitido.
Proibido.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
19
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
20
giraHorrio, giraAntiHorrio, move, desenha, etc. No pode acessar diretamente atributos como x,y, ngulo!
Classes preferencialmente no mesmo pacote. Atributos devem ser protected. Protected: classes no mesmo pacote podem acessar atributos diretamente! Interfaces: somente contm declaraes dos mtodos que devem ser implementados: contratos para as classes. Classes abstratas no podem ser instanciadas, podem conter declaraes ou mtodos completos.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
21
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
22
Associado herana: se a classe B herda da classe A, ela contm os mesmos mtodos de A (ou mtodos sobrepostos).
B -um-tipo-de A. Podemos manipular instncias de classes herdeiras da mesma forma que instncias de classes ancestrais.
J vimos exemplo: classes com mtodo main. Deve ser public, static, void e receber um array de strings como parmetro.
til para algumas generalizaes e estruturas de dados. Podemos manipular colees de muitos objetos da mesma forma, executando mtodos comuns.
Outros mtodos estticos podem ser executados como funes, sem precisar criar instncia da classe. Aplicaes executveis em Java no so arquivos .exe! Podemos empacotar aplicaes em arquivos .jar, executveis pelo Java Runtime Environment.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
23
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
24
Estruturas de dados servem para armazenar vrias instncias diferentes com alguma relao entre si. A mais simples: arrays.
package exemplos; public class ArrayNaves2 { public static void main(String[] args) { Nave[] frota = new Nave[50]; for(int i=0;i<25;i++) frota[i] = new Nave(); for(int i=25;i<frota.length;i++) frota[i] = new NaveEspecial(); for(Nave n:frota) n.move(); for(Nave n:frota) n.habilitaRaios(); } }
Tamanho fixo, todos elementos iguais (respeitando herana). Rpida e indexada diretamente.
public class ArrayNaves { public static void main(String[] args) { Nave[] frota = new Nave[50]; for(int i=0;i<frota.length;i++) frota[i] = new Nave(); } }
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
25
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
26
Podem ter melhor performance (HashSet) ou manter a ordem natural dos elementos (TreeSet). add: adiciona um objeto ao set. remove: remove um objeto do set. contains: retorna true se o set contm o objeto. addAll: adiciona um set a outro. retainAll: retm em um set tudo o que estiver em outro: interseo de sets. containsAll: retorna true se o set conter todos os elementos de outro.
http://www.lac.inpe.br/~rafael.santos 27
Fevereiro/2009
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
28
Diferente de arrays: tamanho pode aumentar e diminuir. Melhor performance geral (LinkedList), melhor quando no h redimensioamento (ArrayList), especial para pilhas (Stack). add: adiciona um objeto lista. remove: remove um objeto da lista. contains: retorna true se a lista contm o objeto. get: recupera um objeto da lista (por ndice). indexOf: retorna o ndice do objeto ou -1 se no existir na lista.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
29
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
30
Breve introduo Java: Estruturas de Dados Mapas: Listas com objetos como ndices.
Mapas associativos: conjuntos de (chave, valor). Interface Map, classes HashMap (boa performance) e TreeMap (chaves ordenadas). put: adiciona um objeto ao mapa. remove: remove um objeto do mapa. get: recupera um objeto do mapa. keySet: retorna um set com todas as chaves. values: retorna uma coleo com todos os valores.
package simon; public class DemoSimon { public static void main(String[] args) { Simon s = new Simon(6,10); // seis cores, mximo de 10 entradas. s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.adiciona(); s.imprime(); // [verde, azul, amarelo, amarelo, vermelho, verde, magenta, azul, verde, ciano] } } Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 31
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
32
Mais Java
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
33
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
34
Cdigo gerado por IDEs pode ser complexo. Interfaces grficas podem ser declaradas pelo programador. Simples! Criamos uma classe que herda de JFrame.
O construtor pode ser usado para montar a interface grfica. A prpria classe pode ter um mtodo main que cria uma instncia dela mesma. Vrios mtodos para JFrames podem ser executados pela nossa classe. Podemos sobreescrever mtodos com comportamento especfico.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
35
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
36
Ao executar o cdigo, nada aparece! Faltou executar mtodos que definem aparncia e comportamento bsico da aplicao.
http://www.lac.inpe.br/~rafael.santos 37
Fevereiro/2009
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
38
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
39
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
40
Ativamos ou modificamos o contedo de um componente. Movemos o mouse ou usamos o teclado em componentes com foco. Modificamos de qualquer forma uma janela. Causados por temporizadores.
Passos:
1. Criamos objetos. 2. Criamos classes que contm listeners para determinados tipos de eventos. 3. Registramos listeners para eventos nos objetos criados.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
41
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
42
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
43
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
44
http://java.sun.com/docs/books/tutorial/ui/features/components.html
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 45
JFrame
JApplet
http://www.lac.inpe.br/~rafael.santos
48
JDialog
Aplicao para exibir imagens em JFrames internas. Primeiro, a classe principal (com um JDesktopPane).
java.awt.*; java.awt.event.*; java.awt.image.BufferedImage; java.io.IOException; java.net.*; javax.imageio.ImageIO; javax.swing.*;
JDesktopFrame/ JInternalFrame
public class MostraMultiplasImagens extends JFrame implements ActionListener { private JDesktopPane desktop; private JTextField url; private JComboBox escala; private String[] escalas = {"0.01","0.05","0.1","0.2","0.5","1","2","5","10","20"};
Pula?
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 49 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 50
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
51
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
52
package exemplos; import java.awt.Image; import javax.swing.*; public class ImagemIF extends JInternalFrame { public ImagemIF(String name,float escala,ImageIcon cone) { // Resizable, closable, maximizable e iconifiable. super(name,true,true,true,true); // Vamos mudar a escala da imagem? float width = cone.getIconWidth(); float height = cone.getIconHeight(); width *= escala; height *= escala; cone = new ImageIcon(cone.getImage().getScaledInstance((int)width, (int)height,Image.SCALE_SMOOTH)); // Mostra em um JLabel. getContentPane().add(new JScrollPane(new JLabel(cone))); pack(); setVisible(true); } } Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 53 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 54
Layouts para GUIs Como os componentes sero arranjados e exibidos na interface grfica?
Layouts.
Para usar um layout, executamos um mtodo para indicar o layout do painel de contedo da aplicao. O layout tambm indica como os componentes sero rearranjados se o tamanho da janela mudar.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
55
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
56
BoxLayout FlowLayout
GridBagLayout GroupLayout
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 57 Fevereiro/2009
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html
http://www.lac.inpe.br/~rafael.santos 58
Usando JPanels, cada um com seu layout. Devemos posicionar cada componente manualmente, com coordenadas em pixels. Mtodos teis:
Exibio de dados (jogos) com formato especfico; Entrada de informaes especializadas; Exibir comportamento diferente dos componentes j existentes. Criar componentes que herdam de outros, j existentes, com funes similares. Criar novos componentes a partir de um componente genrico.
Duas abordagens:
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
59
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
60
Herdar de classe que tem comportamento semelhante. No construtor, chamar construtor ancestral, inicializar atributos relevantes e modificar comportamento atravs de mtodos. Sobreescrever mtodos get{Maximum,Minimum,Preferred}Size(). Sobreescrever paintComponent().
import javax.swing.JButton; public class Peca extends JButton { private static int tamanho = 64; private Estado estado; public Peca() { super(); estado = Estado.VAZIO; }
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 61 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 62
Criando Novos Componentes Grficos Para mostrar a interface grfica precisamos de:
Classe Peca, que representa botes para o jogo. Classe Tabuleiro, que um conjunto 8x8 de peas. Classe Jogo, que a aplicao que usa Tabuleiro. Regras do jogo, que possivelmente devem ser implementadas com cdigo em todas as classes. Mecanismo do adversrio: rede (para adversrio humano), inteligncia artificial (para computador).
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
63
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
64
http://www.lac.inpe.br/~rafael.santos
66
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
67
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
69
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
70
Criando Novos Componentes Grficos Outro exemplo: componente que processa seus prprios eventos.
package rabisco; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import javax.swing.JComponent; public class ComponenteParaRabiscos extends JComponent implements MouseListener,MouseMotionListener,KeyListener { private ArrayList<Point> pontos; private int size = 8; private int halfsize = size/2; private Color cor; public ComponenteParaRabiscos(Color cor) { this.cor = cor; pontos = new ArrayList<Point>(1024); addMouseListener(this); addMouseMotionListener(this); addKeyListener(this); setFocusable(true); requestFocus(); } Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 71 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos
Pula?
72
public void keyPressed(KeyEvent e) { System.out.println(e.getKeyCode()); if (e.getKeyCode() == KeyEvent.VK_C) { pontos.clear(); repaint(); } } public void keyReleased(KeyEvent e) { } // NOP public void keyTyped(KeyEvent e) { } // NOP }
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
73
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
74
package rabisco; import java.awt.Color; import java.awt.Container; import javax.swing.JFrame; public class AppRabiscos extends JFrame { public AppRabiscos() { ComponenteParaRabiscos c = new ComponenteParaRabiscos(new Color(50,120,250)); Container cp = getContentPane(); cp.add(c); setSize(400,400); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new AppRabiscos(); } }
package exemplos; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComponenteLuzVermelha extends JComponent implements ActionListener { private int nvel,passo; private Timer timer; public ComponenteLuzVermelha(int passo) { this.passo = passo; nvel = 0; setPreferredSize(new Dimension(200,200)); timer = new Timer(50,this); timer.setCoalesce(true); timer.start(); }
75 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos
Pula?
76
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
77
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
78
Applets Aplicaes com interface grfica que so executadas em um navegador. Mais seguras (para o cliente) do que aplicaes. Menos flexveis do que aplicaes (sandbox). Herdam da classe JApplet. Tm mtodos que podem ser sobreescritos, em particular:
init(): inicializa a applet. paint(Graphicsg): faz com que a applet seja pintada/desenhada.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
79
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
80
Applets
package exemplos; import java.awt.Color; import java.awt.Graphics; import javax.swing.JApplet; public class Applet1 extends JApplet { public void paint(Graphics g) { g.setColor(Color.BLUE); g.drawString("Ol, Mundo",5,15); } }
package rabisco; import java.awt.*; import javax.swing.*;
Applets
public class AppletRabiscos extends JApplet { public void init() { ComponenteParaRabiscos c1 = new ComponenteParaRabiscos(Color.RED); c1.setBorder(BorderFactory.createLineBorder(Color.RED)); ComponenteParaRabiscos c2 = new ComponenteParaRabiscos(Color.BLUE); c2.setBorder(BorderFactory.createLineBorder(Color.BLUE)); getContentPane().setLayout(new GridLayout(1,2)); getContentPane().add(c1); getContentPane().add(c2); } }
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
81
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
82
Graphics/Graphics2D
Graphics/Graphics2D
package graphics; import java.awt.*; import javax.swing.JApplet; public class AppletTexto extends JApplet { public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.BLUE); g2d.setFont(new Font("SansSerif",Font.ITALIC,24)); g2d.drawString("SansSerif",5,25); g2d.setFont(new Font("Serif",Font.ITALIC|Font.BOLD,36)); g2d.drawString("Serif",5,65); g2d.setFont(new Font("Dialog",Font.PLAIN,48)); g2d.drawString("Dialog",5,115); g2d.setFont(new Font("DialogInput",Font.PLAIN,48)); g2d.drawString("DialogInput",5,175); } }
Vimos os mtodos paintComponent (JComponents) e paint (JApplets), que recebem como argumento uma instncia de Graphics. Graphics: contexto grfico, sabe onde e como desenhar objetos grficos.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
83
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
84
Graphics/Graphics2D
package graphics;
Graphics/Graphics2D
import java.awt.*; import java.awt.geom.Point2D; import javax.swing.JApplet; public class AppletFills extends JApplet { public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.RED); g2d.fillRoundRect(10,10,120,20,20,20); GradientPaint degrade = new GradientPaint(0,0,Color.BLUE,110,20,Color.GREEN); g2d.setPaint(degrade); g2d.fillRoundRect(10,40,120,20,10,10); Point2D centro = new Point2D.Float(60,60); float raio = 60; float[] fraes = {0f, 1f}; Color[] cores = {Color.RED, Color.BLUE}; RadialGradientPaint radial = new RadialGradientPaint(centro,raio,fraes,cores); g2d.setPaint(radial); g2d.fillRoundRect(10,80,120,120,40,40); } } 85 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 86
package graphics; import java.awt.*; import javax.swing.JApplet; public class AppletLinhas extends JApplet { public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(new Color(180,20,100)); g2d.drawLine(10,10,300,10); g2d.setStroke(new BasicStroke(3f)); g2d.drawLine(10,20,300,20); float[] dash = new float[]{12f}; BasicStroke s = new BasicStroke(7f,BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,0f, dash, 0.0f); g2d.setStroke(s); g2d.drawLine(10,40,300,40); g2d.drawRect(10,60,300,100); } } Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos
Graphics/Graphics2D
package graphics; import java.awt.*; import javax.swing.*; public class AppletImage extends JApplet { private Image imagem; public void init() { imagem = getImage(getDocumentBase(),"Sprites/spongebob.jpg"); } public void paint(Graphics g) { g.drawImage(imagem,10,10,this); g.drawImage(imagem,80,80,120,120,this); } } package graphics;
Graphics/Graphics2D
import java.awt.*; import javax.swing.JApplet; public class AppletPolys extends JApplet { public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.GREEN.darker()); int[] x = new int[]{10,30,50,50,30,10}; int[] y = new int[]{10,30,10,70,50,70}; Polygon poly = new Polygon(x,y,x.length); g2d.drawPolygon(poly); g2d.setColor(Color.YELLOW.darker()); g2d.drawArc(10,80,40,40,0,360); g2d.setColor(Color.RED); g2d.fillArc(10,130,40,40,40,280); } }
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
87
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
88
package exemplos; public class CarroDeCorrida { private String nome; private int distncia; private int velocidade; public CarroDeCorrida(String n, int vel) { nome = n; distncia = 0; velocidade = vel; } public void executa() { while (distncia <= 1200) { System.out.println(nome + " rodou " + distncia + " km."); distncia += velocidade; // Causa um delay artificial. for (int sleep = 0; sleep < 1000000; sleep++) { double x = Math.sqrt(Math.sqrt(Math.sqrt(sleep))); } } } } Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 89
package exemplos; public class SimulacaoSemThreads { public static void main(String[] args) { // Criamos instncias da classe CarroDeCorrida. CarroDeCorrida penlope = new CarroDeCorrida("Penlope Charmosa",60); CarroDeCorrida dick = new CarroDeCorrida("Dick Vigarista",100); CarroDeCorrida quadrilha = new CarroDeCorrida("Quadrilha da Morte",120); // Criados os carros, vamos executar as simulaes. penlope.executa(); dick.executa(); quadrilha.executa(); } }
Penlope Charmosa rodou 0 km. Penlope Charmosa rodou 60 km. Penlope Charmosa rodou 120 km. ... Penlope Charmosa rodou 1140 km. Penlope Charmosa rodou 1200 km. Dick Vigarista rodou 0 km. Dick Vigarista rodou 100 km. Dick Vigarista rodou 200 km. ... Dick Vigarista rodou 1100 km. Dick Vigarista rodou 1200 km. Quadrilha da Morte rodou 0 km. Quadrilha da Morte rodou 120 km. ... Quadrilha da Morte rodou 1080 km. Quadrilha da Morte rodou 1200 km.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
90
Cdigo executado na ordem explicitada dentro dos mtodos. Mtodos podem ser executados concorrentemente.
Mtodo mais simples de concorrncia: classe herda de Thread e implementa o mtodo run.
Mtodos podem ser executados concorrentemente em classes que herdam da classe Thread.
Estas classes devem implementar o mtodo run (o mtodo que ser executado concorrentemente).
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
91
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
92
Quadrilha da Morte rodou 1200 km. Dick Vigarista rodou 900 km. Penlope Charmosa rodou 360 km. Dick Vigarista rodou 1000 km. Dick Vigarista rodou 1100 km. Penlope Charmosa rodou 420 km. Dick Vigarista rodou 1200 km. Penlope Charmosa rodou 480 km. Penlope Charmosa rodou 540 km. ... Penlope Charmosa rodou 1200 km.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
93
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
94
Precisamos de um mtodo que crie a instncia local de Thread e que execute start.
public void inicia() { if (thread == null) { thread = new Thread(this); thread.start(); } } public void run() { while (distncia <= 1200) { System.out.println(nome + " rodou " + distncia + " km."); distncia += velocidade; // Causa um delay artificial. Try { Thread.sleep(4800/velocidade); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package exemplos; public class CarroDeCorridaRunnable implements Runnable { private String nome; private int distncia; private int velocidade; private Thread thread; public CarroDeCorridaRunnable(String n, int vel) { nome = n; distncia = 0; velocidade = vel; }
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
95
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
96
Jogos em Java
... Dick Vigarista rodou 1100 km. Penlope Charmosa rodou 420 km. Dick Vigarista rodou 1200 km. Penlope Charmosa rodou 480 km. Penlope Charmosa rodou 540 km. ...Penlope Charmosa rodou 1140 km. Penlope Charmosa rodou 1200 km.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
97
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
98
Jogo: Invaders
Jogo: Invaders
Shoot-em-up simples: invasores voando, defensor atirando. Exemplo incompleto: o objetivo demonstrar tcnicas e dar idias!
Cdigo apresentado em iteraes de desenvolvimento. Usaremos classes especializadas para objetos mveis (sprites). Usaremos um JPanel para controle do jogo e animao (veja o livro Killer Game Programming in Java). Uma aplicao conter a instncia do JPanel.
http://www.lac.inpe.br/~rafael.santos 99
Fevereiro/2009
package simpleinvaders0; import java.awt.*; import javax.swing.ImageIcon; // Esta classe representa um invasor (UFO) no jogo. public class Invader { // Posio e velocidade do UFO em pixels. private int x,y; private int dx,dy; // Tamanho do UFO em pixels. private int iw,ih; // Imagem do UFO. private Image icon; // rea do painel do jogo (para controlar movimento). private Dimension area; Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 101
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
102
Jogo: Invaders (classe Shooter) A classe Shooter deve conter (entre outros):
package simpleinvaders0; import java.awt.*; import javax.swing.ImageIcon; // Esta classe representa um defensor no jogo. public class Shooter { // Posio do defensor em pixels. private int x,y; // Tamanho do defensor em pixels. private int iw,ih; // Imagem do defensor. private Image icon; // rea do painel do jogo (para controlar movimento). private Dimension area;
103 Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 104
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
105
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
106
Lista de sprites; Thread para execuo; Mtodos para desenhar e mover. Mtodos para controle (interface) de jogo.
package simpleinvaders0; import java.awt.*; import java.awt.event.*; import javax.swing.JPanel; // Classe que implementa o painel do jogo. O painel controlar os elementos // do jogo e a renderizao. public class InvadersPanel extends JPanel implements Runnable,KeyListener { // Dimenses da rea do jogo. private static final int largura = 800; private static final int altura = 600;
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 107
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
108
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
110
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
111
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
112
Jogo: Invaders
Jogo: Invaders (iterao 2) Nave atira, nmero de tiros limitado, elimina invasores. Interao entre algumas classes (sprites). Lista de sprites modificada com o tempo!
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
113
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
114
package simpleinvaders1; import java.awt.*; import javax.swing.ImageIcon; // Esta classe representa um invasor (UFO) no jogo. public class Invader { // Posio e "velocidade" do UFO em pixels. private int x,y; private int dx,dy; private boolean estAtivo; // Tamanho do UFO em pixels. private int iw,ih; // Imagem do UFO. private Image icon; // rea do painel do jogo (para controlar movimento). private Dimension area;
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Jogo: Invaders 2 (classe Shooter) A classe Shooter deve mtodos para recuperar posio e tamanho (entre outros).
package simpleinvaders1; import java.awt.*; import javax.swing.ImageIcon; // Esta classe representa um defensor no jogo. public class Shooter { private int x,y; // Posio do defensor em pixels. private int iw,ih; // Tamanho do defensor em pixels. private Image icon; // Imagem do defensor. // rea do painel do jogo (para controlar movimento). private Dimension area; // Construtor, inicializa atributos e posiciona o shooter. public Shooter(Dimension a) { area = a; icon = new ImageIcon(getClass().getResource("/Sprites/shooter.png")).getImage(); iw = icon.getWidth(null); ih = icon.getHeight(null); // x e y iniciais centrados na rea de movimentao. x = (int)(iw/2+(a.width-iw)/2); y = (int)(a.height-100+ih/2); }
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
117
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
118
A classe Bullet deve mtodos para criar e desativar balas, moviment-las e desenh-las, recuperar posio e tamanho (entre outros).
package simpleinvaders1; import java.awt.*; import javax.swing.ImageIcon; // Esta classe representa um tiro no jogo. public class Bullet { // Posio do tiro em pixels. private int x,y; // Este tiro est ativo? private boolean estAtivo; // Tamanho do tiro em pixels. private int iw,ih; // Imagem do tiro. private Image icon; // rea do painel do jogo (para controlar movimento). private Dimension area;
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 120
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
121
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
122
// Classe que implementa o painel do jogo. O painel controlar os elementos // do jogo e a renderizao. public class InvadersPanel extends JPanel implements Runnable,KeyListener { // Dimenses da rea do jogo. private static final int largura = 800; private static final int altura = 600; // Uma thread para controlar a animao. private Thread animator; private boolean isPaused = false;
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 123
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
124
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
126
Sem modificaes.
http://www.lac.inpe.br/~rafael.santos
128
Nave atira bombas, uma de cada vez, nmero limitado. Pequenas (muito pequenas!) melhorias na interface grfica. Vamos ter que reescrever algumas classes...
// Posio do tiro em pixels. private int x,y; // Direo do tiro. private Direcao direo; ... // Construtor, inicializa atributos, cria a bala. public Bullet(Dimension a,int x,int y,Direcao dir) { area = a; icon = new ImageIcon(getClass().getResource("/Sprites/bullet.png")).getImage(); iw = icon.getWidth(null); ih = icon.getHeight(null); // x e y passados direto como argumentos this.x = x; this.y = y; direo = dir; estAtivo = true; }
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
129
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
130
package simpleinvaders2; import java.awt.*; import java.util.ArrayList; import javax.swing.ImageIcon; // Esta classe representa uma bomba no jogo. public class Bomb { // Posio da bomba em pixels. private int x,y; // Esta bomba est ativa? private boolean estAtivo; // Tamanho da bomba em pixels. private int iw,ih; // Imagem da bomba. private Image icon; // rea do painel do jogo (para controlar movimento). private Dimension area;
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
131
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
132
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
133
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
134
package simpleinvaders2; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.JPanel; public class InvadersPanel extends JPanel implements Runnable, KeyListener { private static final int largura = 800; private static final int altura = 600; // Uma thread para controlar a animao. private Thread animator; private boolean isPaused = false; // Teremos alguns UFOs passeando na tela. private ArrayList<Invader> invasores; private static final int NUM_INVASORES = 20; // O shooter e sua direo de movimento. private Shooter shooter; private Direcao dir; // Um conjunto de tiros. private ArrayList<Bullet> tiros; private static final int MAX_TIROS = 5; // Uma nica bomba. private Bomb bomba; private int numBombas; private static final int NUM_BOMBAS_DISPONIVEL = 10; Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
138
Jogo: Invaders 3
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
139
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
140
Como implementar...
Algum esquema de pontuao? Inimigos atirando? Game Over? Teleporte da nave (com nmero de usos)? Fases (com invasores diferentes)? Dificuldades em fases? Poderes adicionais (capturados pelo shooter)? Bosses? Comparar com clssicos, pensar em novidades. Evitar comparao com jogos profissionais (times de desenvolvedores, meses para desenvolver).
http://www.lac.inpe.br/~rafael.santos 141
Aprendendo OO: Vale a pena reorganizar classes que representam sprites? Como fazer isto? Criar um JPanel especfico para este tipo de jogo? Como resolver problemas potenciais com Thread.sleep()?
Nmero de objetos pode influenciar na velocidade do jogo. Soluo (complexa): Killer Game Programming in Java. Serializao! Controle via rede!
http://www.lac.inpe.br/~rafael.santos 142
Fevereiro/2009
Fevereiro/2009
Visite um dos inmeros sites com jogos em Flash. Veja um com lgica e matemtica/fsica simples. Implemente uma verso feia em Java. Vasculhe http://www.java4k.com/ para idias, tente melhorar os jogos (ignorando o limite de 4K).
Extras
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
143
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
144
Showcase
Puzzle Pirates, http://www.puzzlepirates.com
Showcase
Kingdoms of War, http://www.abandonedcastle.com
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
145
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
146
Showcase
FlyingGuns, http://www.flyingguns.com
Showcase
Escape, http://javaisdoomed.sourceforge.net
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
147
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
148
Showcase
Wurm Online, http://wurmonline.com/
Showcase
http://www.arcadepod.com/java
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
149
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
150
Showcase
http://www.arcadepod.com/java
Showcase
http://www.java4k.com
Miners4K
Lode Runner 4k
Realms of Rivalry
Tantrix Xero
Fevereiro/2009 http://www.lac.inpe.br/~rafael.santos 151 Fevereiro/2009
Cubis
http://www.lac.inpe.br/~rafael.santos
Lady Bug 4k
152
Ferramentas
Ferramentas
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
153
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
154
Empacotando
Classes e arquivos necessrios podem ser empacotados em um arquivo .jar, que pode ser executado por uma mquina virtual. Arquivos .jar so como arquivos .zip, com informaes adicionais.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
155
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
156
O arquivo .jar conter todos os arquivos do projeto, mas executar somente a classe do Launch Configuration.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
157
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
158
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
159
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
160
Empacotando
Omisses
Modo simples: 104198 bytes Modo pouco menos simples: 9927 bytes Empacotamento para applets semelhante, mas modo simples no Eclipse no pode ser usado.
Modo Full Screen: ainda existem problemas de compatibilidade entre sistemas operacionais. udio. Performance de renderizao.
Renderizao ativa.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
161
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
162
Srie de pesadelos envolvendo Ubuntu, Fedora, Xinerama, FSEM. Varia de verso para verso! Soluo 1: Faux FSEM? Soluo 2 (arriscada!): sedi s/XINERAMA/ZINERAMA/g /usr/bin/X11/Xorg
Referncias
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
163
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
164
Referncias
Referncias
Java 1.4 Game Programming; Andrew Mulholland e Glenn Murphy; Wordware, 2003, 647pp.
Introduo Java, OO, I/O, threads, controles, animao, JDBC, MySQL, rede, etc.
Fevereiro/2009
Introduo a Java, OO, AWT, Java2D, animaes, controles, gerenciamento de cenas. Exemplo: Nodez! (puzzle).
165 Fevereiro/2009
Animao, imagens, sons, sprites, Java3D, sprites 3D, sistemas de partculas, etc. Exemplos: worms, side-scroller, isomtrico, labirinto 3D, FPS. fivedots.coe.psu.ac.th/~ad/jg/
166
http://www.lac.inpe.br/~rafael.santos
http://www.lac.inpe.br/~rafael.santos
Referncias
Referncias
Filthy Rich Clients; Chet Haase, Romain Guy; Prentice-Hall/Sun, 2007, 608pp.
Interfaces ricas em Swing, threads, animao de interfaces, temporizao, processamento de imagens (para tela).
Introduo Programao Orientada a Objetos Usando Java; Rafael Santos; Campus/SBC, 2003, 352pp.
Computer Graphics Using Java 2D and 3D; Hong Zhang, Y. Daniel Liang; Prentice-Hall, 2007, 632pp.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
167
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
168