Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Jogos em Java
Corrigido e
ampliado em
20/Fev/2009
Rafael Santos
Organizao
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Apoio
Mapa
Java e OO
Intro OO
Aplicaes
Est. Dados
Mais Java
GUIs
Componentes
Layouts
Applets
Graphics
Threads
Jogos e Java
Verso 1
Verso 2
Verso 3
Extras
Showcase
Empacotando
Omisses
+ Componentes
Exerccios
Referncias
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Ementa
Java e OO
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Ementa
Mais Java
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Ementa
Loop do jogo.
Sprites.
Deteo de Coliso.
Criao e remoo de objetos durante o jogo.
Exerccios.
Jogos e Java
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
No veremos:
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
(des)motivao ?
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
O que aprender?
Threads
Java e OO
Colees
I/O e Rede
Swing/AWT
Persistncia e DB
Componentes
Eventos
Renderizao
Java2D
Temporizadores
Java3D
Images e cones
Performance
Som e udio
Sprites
Deteo de Colises
Inteligncia Artificial
Sistemas Distribudos
Outras APIs
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Veja o Showcase!
Abstrao x velocidade.
Partes dependentes/independentes de arquitetura.
Velocidade de aplicaes grficas/Swing.
Verdade...
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
10
Java e Orientao
a Objetos
Apesar de ser um curso introdutrio, detalhes sobre
Java e mecanismos bsicos de orientao a objetos
sero vistos de forma superfcial.
O leitor deve ter noes bsicas de programao em
Java para melhor aproveitamento deste material.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
11
http://www.lac.inpe.br/~rafael.santos
12
http://www.lac.inpe.br/~rafael.santos
13
giraHorrio()
5;
giraAntiHorrio()
5;
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
14
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
15
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
16
Permitido.
Proibido.
}
}
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;
}
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
19
Permitido.
Proibido.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
20
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
21
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
22
B -um-tipo-de A.
Podemos manipular instncias de classes herdeiras da mesma
forma que instncias de classes ancestrais.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
23
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
24
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
25
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();
}
}
Fevereiro/2009
NaveEspecial -um-tipo-de
Nave.
Nave no um tipo de
NaveEspecial.
http://www.lac.inpe.br/~rafael.santos
26
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
27
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
28
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
29
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
30
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
Fevereiro/2009
Mais Java
http://www.lac.inpe.br/~rafael.santos
33
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
34
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
35
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
36
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
37
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
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://www.lac.inpe.br/~rafael.santos
45
http://www.lac.inpe.br/~rafael.santos
46
http://www.lac.inpe.br/~rafael.santos
47
JFrame
JApplet
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
48
JDesktopFrame/
JInternalFrame
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
49
package exemplos;
import
import
import
import
import
import
import
java.awt.*;
java.awt.event.*;
java.awt.image.BufferedImage;
java.io.IOException;
java.net.*;
javax.imageio.ImageIO;
javax.swing.*;
Pula?
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
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
55
Layouts.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
56
GridLayout
BoxLayout
FlowLayout
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
57
GridBagLayout
CardLayout
GroupLayout
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
58
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
59
Duas abordagens:
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
60
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
61
package reversi;
import
import
import
import
java.awt.Color;
java.awt.Dimension;
java.awt.Graphics;
java.awt.Graphics2D;
package reversi;
public enum Estado { VAZIO, PRETO, BRANCO }
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
62
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
63
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
64
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
65
Fevereiro/2009
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
68
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
69
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
70
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
71
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
Pula?
72
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
73
void
void
void
void
mouseReleased(MouseEvent e) { } // NOP
mouseClicked(MouseEvent e) { } // NOP
mouseExited(MouseEvent e) { } // NOP
mouseMoved(MouseEvent e) { } // NOP
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();
}
}
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
75
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();
}
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
Pula?
76
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
77
package exemplos;
import java.awt.*;
import javax.swing.*;
public class LuzVermelhaApp extends JFrame
{
public LuzVermelhaApp()
{
super("Luz Vermelha");
getContentPane().setLayout(new GridLayout(2,2));
ComponenteLuzVermelha c1,c2,c3,c4;
c1 = new ComponenteLuzVermelha(10);
c2 = new ComponenteLuzVermelha(50);
c3 = new ComponenteLuzVermelha(100);
c4 = new ComponenteLuzVermelha(250);
getContentPane().add(c1); getContentPane().add(c2);
getContentPane().add(c3); getContentPane().add(c4);
pack();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{ new LuzVermelhaApp(); }
}
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
78
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
79
Applets
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);
}
}
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
81
Applets
package rabisco;
import java.awt.*;
import javax.swing.*;
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
82
Graphics/Graphics2D
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
83
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);
}
}
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
84
Graphics/Graphics2D
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
85
Graphics/Graphics2D
package graphics;
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);
}
}
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
86
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);
}
}
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
87
Graphics/Graphics2D
package graphics;
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
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();
}
}
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
90
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
91
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
92
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
93
...
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
94
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
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
97
Fevereiro/2009
Jogos em Java
http://www.lac.inpe.br/~rafael.santos
98
Jogo: Invaders
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
99
Jogo: Invaders
Invasores se
movimentam nesta
rea (aleatoriamente)
Shooter se movimenta
nesta rea
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
100
Posio e velocidades;
cone para exibio;
Mtodos para desenhar e mover.
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
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
103
Posio e direo;
cone para exibio;
Mtodos para desenhar e mover.
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;
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
104
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
109
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
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
113
Problemas de sincronizao.
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
115
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
116
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
117
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
118
int
int
int
int
getX() { return x; }
getY() { return y; }
getWidth() { return iw; }
getHeight() { return ih; }
package simpleinvaders1;
public enum Direcao { UP,DOWN,LEFT,RIGHT }
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
119
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
package simpleinvaders1;
import
import
import
import
java.awt.*;
java.awt.event.*;
java.util.*;
javax.swing.JPanel;
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
125
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
126
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
127
Sem modificaes.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
128
Invader
Shooter
Direcao
InvadersApp
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
129
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
130
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
131
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
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
135
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
136
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
137
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
138
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
139
Jogo: Invaders 3
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
140
Como implementar...
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
141
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
142
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
143
Fevereiro/2009
Extras
http://www.lac.inpe.br/~rafael.santos
144
Showcase
Puzzle Pirates, http://www.puzzlepirates.com
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
145
Showcase
Kingdoms of War, http://www.abandonedcastle.com
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
146
Showcase
FlyingGuns, http://www.flyingguns.com
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
147
Showcase
Escape, http://javaisdoomed.sourceforge.net
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
148
Showcase
Wurm Online, http://wurmonline.com/
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
149
Showcase
http://www.arcadepod.com/java
Solitaire
Think Tint
Real Space 2
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
150
Showcase
http://www.arcadepod.com/java
Realms of Rivalry
Tantrix
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
151
Showcase
http://www.java4k.com
Lode Runner 4k
Miners4K
Xero
Fevereiro/2009
Cubis
http://www.lac.inpe.br/~rafael.santos
Lady Bug 4k
152
Ferramentas
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
153
Ferramentas
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
154
Empacotando
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
155
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
156
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
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
161
Omisses
Renderizao ativa.
Deployment.
Inteligncia artificial.
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
162
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
163
Fevereiro/2009
Referncias
http://www.lac.inpe.br/~rafael.santos
164
Referncias
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
165
Referncias
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
166
Referncias
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
167
Referncias
Fevereiro/2009
http://www.lac.inpe.br/~rafael.santos
168