O documento apresenta uma introdução sobre desenvolvimento de jogos em Java 2D. Apresenta conceitos básicos sobre jogos, animação, sprites e colisões. Explica como construir jogos utilizando Swing e threads em Java.
2. MINILABS: JOGOS EM JAVA
MARIO JORGE PEREIRA
▸ Desde 2002 desenvolvendo com softwares
com Java. Certificado de Programador Java
(SCJP) em 2005. Desenvolvimento JSE, JEE e
JME.
▸ Atualmente Analista de Tecnologia da
Informação (IFBaiano), Docente (UCSal) e
Artesão de Software (Dev)
3. MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
4. MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
5. "A GAME IS A SYSTEM IN WHICH PLAYERS
ENGAGE IN AN ARTIFICIAL
CONFLICT, DEFINED BY RULES, THAT RESULTS
IN A QUANTIFIABLE OUTCOME.
Salen e Zimmerman (Rules of play, 2004)
MINILABS: JOGOS EM JAVA
6. MINILABS: JOGOS EM JAVA
GAME LOOP
CARREGAR
LOAD
ENTRADAS
INPUTS
ATUALIZAR
UPDATE
APRESENTAR
RENDER
DESCARREGAR
UNLOAD
8. MINILABS: JOGOS EM JAVA
SWING
▸ conjunto de componentes para a construção de
interfaces gráficas de usuário (GUIs)
▸ funcionalidade gráficos ricos e interatividade
aos aplicativos Java.
▸ Os componentes Swing são implementados
inteiramente na linguagem de programação
Java.
9. MINILABS: JOGOS EM JAVA
COMPONENTES E CONTAINERS
▸ JFrame
▸ JPanel
▸ JButtons
▸ JLabel
▸ JTable
10. MINILABS: JOGOS EM JAVA
Jogo.java
import javax.swing.JPanel;
public class Jogo extends JPanel {
public Jogo() {
}
}
11. MINILABS: JOGOS EM JAVA
Aplicacao.java
import java.awt.EventQueue;
import javax.swing.JFrame;
public class Principal extends JFrame {
public Principal() {
initUI();
}
private void initUI() {...}
public static void main(String[] args) {...}
}
12. MINILABS: JOGOS EM JAVA
MÉTODOS BÁSICOS
▸ add(new Jogo());
▸ Adiciona o local do jogo / tabuleiro
▸ setSize(300, 300);
▸ Define o tamanho da Janela
▸ setTitle(“Aplicação");
▸ Titulo da Janela
▸ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
▸ Define que ao clicar no botão fechar da janela ele vai fechar a aplicação.
▸ setLocationRelativeTo(null);
▸ Faz com que a aplicação inicie no centro da tela
13. MINILABS: JOGOS EM JAVA
Application.java
private void initUI() {
add(new Jogo());
setSize(300, 300);
setTitle("Aplicação");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
14. MINILABS: JOGOS EM JAVA
SWING VS. THREAD-SAFE
▸ A api Swing não é thread-safe
▸ Event-Dispatch Thread (EDT)
▸ SwingUtilities.invokeLater(Runnable) ou EventQueue.invokeLater(Runnable)
▸ Recomendação: Java 5
15. MINILABS: JOGOS EM JAVA
Application.java
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Aplicacao ex = new Aplicacao();
ex.setVisible(true);
}
});
}
24. MINILABS: JOGOS EM JAVA
Jogo.java
import java.awt.*;
import javax.swing.*;
public class Jogo extends JPanel {
private Image imagem;
public Jogo() {
initJogo();
}
private void initJogo() {...}
private void carregaImagem() {...}
public void paintComponent(Graphics g) {…}
private void desenhar(Graphics g) {...}
}
25. MINILABS: JOGOS EM JAVA
Jogo.java
private void initJogo() {
carregaImagem();
int w = imagem.getWidth(this);
int h = imagem.getHeight(this);
setPreferredSize(new Dimension(w, h));
}
26. MINILABS: JOGOS EM JAVA
CARREGANDO IMAGEM
▸ Image imagem
▸ ImageIcon imageIcon
▸ g.drawImage(imagem, 0, 0, null);
27. MINILABS: JOGOS EM JAVA
Jogo.java
private void carregaImagem() {
ImageIcon ii = new ImageIcon(getClass().getResource("salvador.png"));
imagem = ii.getImage();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
desenhar(g);
}
private void desenhar(Graphics g) {
g.drawImage(imagem, 0, 0, null);
}
28. MINILABS: JOGOS EM JAVA
Aplicacao.java
private void initUI() {
add(new Jogo());
pack();
setTitle("Aplicação");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
29. MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
30. MINILABS: JOGOS EM JAVA
PROCESSOS E THREADS
▸ Processo
▸ ambiente de execução auto-suficiente.
▸ cada processo tem seu próprio espaço de
memória.
▸ Thread
▸ processos leves.
▸ criação de um novo segmento requer menos
recursos do que a criação de um novo
processo.
33. MINILABS: JOGOS EM JAVA
REDIMENSIONAMENTO
▸ setResizable ()
▸ define se o JFrame pode ser redimensionado.
▸ pack()
▸ redimensiona o JFrame para ajustar ao tamanho ideal.
▸ Note que a ordem pela qual estes dois métodos são chamados é importante.
34. MINILABS: JOGOS EM JAVA
Jogo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Jogo extends JPanel implements ActionListener {
private final int B_WIDTH = 350;
private final int B_HEIGHT = 350;
private final int INITIAL_X = -40;
private final int INITIAL_Y = -40;
private final int DELAY = 25;
private Image imagem;
private Timer timer;
private int x, y;
...
}
35. MINILABS: JOGOS EM JAVA
Jogo.java
public class Jogo extends JPanel implements ActionListener {
public Jogo() {...}
private void carregaImagem() {...}
private void initJogo() {...}
public void paintComponent(Graphics g) {...}
private void desenhar(Graphics g) {...}
public void actionPerformed(ActionEvent e) {...}
}
36. MINILABS: JOGOS EM JAVA
Jogo.java
public Jogo() {
initJogo();
}
private void carregaImagem() {
ImageIcon ii = new ImageIcon("estrela.png");
imagem = ii.getImage();
}
37. MINILABS: JOGOS EM JAVA
DOUBLEBUFFER
▸ setDoubleBuffered(true);
▸ O componente JPanel vai usar um Buffer para apresentar.
▸ Significa que todos os desenhos serão feitos na memória primeiro.
▸ O buffer fora da tela será copiado para a tela.
38. MINILABS: JOGOS EM JAVA
Jogo.java
private void initJogo() {
setBackground(Color.BLACK);
setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
setDoubleBuffered(true);
carregaImagem();
x = INITIAL_X;
y = INITIAL_Y;
timer = new Timer(DELAY, this);
timer.start();
}
39. MINILABS: JOGOS EM JAVA
TIMER
▸ timer = new Timer(DELAY, this);
▸ timer.start();
▸ TimerSwing e chamar o método start ().
▸ A cada ciclo (DELAY) de tempo o temporizador irá chamar o método
actionPerformed().
▸ Para utilizar o método actionPerformed (), que deve implementar a
interface ActionListener.
40. MINILABS: JOGOS EM JAVA
TOOLKIT.GETDEFAULTTOOLKIT
▸ no desenhar() chamamos a imagem na janela utilizando o método
drawImage().
▸ o Toolkit.getDefaultToolkit (). Sync ()
▸ sincroniza a parte gráfica
▸ protege os eventos gráficos
▸ Sem essa linha, a animação pode não ser suave no Linux.
41. MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
desenhar(g);
}
private void desenhar(Graphics g) {
g.drawImage(imagem, x, y, this);
Toolkit.getDefaultToolkit().sync();
}
42. MINILABS: JOGOS EM JAVA
ACTION PERFORMED
▸ actionPerformed()
▸ é chamado pelo timer repetidamente
▸ Dentro do método, alteramos os valores x e y do objeto estrela
▸ repaint ()
▸ Faz com que o método paintComponent () seja chamado
43. MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void actionPerformed(ActionEvent e) {
x += 1;
y += 1;
if (y > B_HEIGHT) {
y = INITIAL_Y;
x = INITIAL_X;
}
repaint();
}
45. MINILABS: JOGOS EM JAVA
Jogo.java
import java.awt.*;
import javax.swing.*;
import java.util.TimerTask;
import java.util.Timer;
public class Jogo extends JPanel {
private final int B_WIDTH = 350;
private final int B_HEIGHT = 350;
private final int INITIAL_X = -40;
private final int INITIAL_Y = -40;
private final int INITIAL_DELAY = 100;
private final int PERIOD_INTERVAL = 25;
private Image star;
private Timer timer;
private int x, y;
...
}
46. MINILABS: JOGOS EM JAVA
UTILITY TIMER
▸ Usamos o java.util.Timer em vez do javax.Swing.Timer
▸ Para os jogos Java Swing desta forma deve ser mais preciso
▸ timer = new Timer();
▸ timer.scheduleAtFixedRate(new ScheduleTask(), INITIAL_DELAY, PERIOD_INTERVAL);
▸ executa o metodo run do ScheduleTask a cada intervalo
47. MINILABS: JOGOS EM JAVA
Jogo.java
private void initJogo() {
setBackground(Color.BLACK);
setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
setDoubleBuffered(true);
carregaImagem();
x = INITIAL_X;
y = INITIAL_Y;
timer = new Timer();
timer.scheduleAtFixedRate(new ScheduleTask(), INITIAL_DELAY, PERIOD_INTERVAL);
}
48. MINILABS: JOGOS EM JAVA
Jogo.java
private class Tarefa extends TimerTask {
@Override
public void run() {
x += 1;
y += 1;
if (y > B_HEIGHT) {
y = INITIAL_Y;
x = INITIAL_X;
}
repaint();
}
}
50. MINILABS: JOGOS EM JAVA
Jogo.java
import java.awt.*;
import javax.swing.*;
public class Jogo extends JPanel implements Runnable {
private final int B_WIDTH = 350;
private final int B_HEIGHT = 350;
private final int INITIAL_X = -40;
private final int INITIAL_Y = -40;
private final int DELAY = 25;
private Image star;
private Thread thread;
private int x, y;
...
}
51. MINILABS: JOGOS EM JAVA
THREAD
▸ O método run () é chamado apenas uma vez.
▸ loop chamamos de cycle() and the repaint()
▸ addNotify()
▸ executado após o JPanel foi adicionado ao componente JFrame.
▸ Este método é muitas vezes usado para diversas tarefas de inicialização.
52. MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void addNotify() {
super.addNotify();
thread = new Thread(this);
thread.start();
}
private void ciclo() {
x += 1;
y += 1;
if (y > B_HEIGHT) {
y = INITIAL_Y;
x = INITIAL_X;
}
}
53. MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void run() {
long beforeTime, timeDiff, sleep;
beforeTime = System.currentTimeMillis();
while (true) {
ciclo();
repaint();
timeDiff = System.currentTimeMillis() - beforeTime;
sleep = DELAY - timeDiff;
if (sleep < 0) {
sleep = 2;
}
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
System.out.println("Interrupted: " + e.getMessage());
}
beforeTime = System.currentTimeMillis();
}
}
54. MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
56. MINILABS: JOGOS EM JAVA
Aplicacao.java (Sem mudanças)
import java.awt.EventQueue;
import javax.swing.JFrame;
public class Aplicacao extends JFrame {
private static final long serialVersionUID = 1L;
public Aplicacao() {
initUI();
}
private void initUI() {...}
public static void main(String[] args) {...}
}
57. MINILABS: JOGOS EM JAVA
Jogo.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Jogo extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private Timer timer;
private Nave nave;
private final int DELAY = 10;
public Jogo() {
initJogo();
}
...
}
58. MINILABS: JOGOS EM JAVA
Jogo.java
private void initJogo() {
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
nave = new Nave();
timer = new Timer(DELAY, this);
timer.start();
}
60. MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void actionPerformed(ActionEvent e) {
nave.move();
repaint();
}
private class TAdapter extends KeyAdapter {
@Override
public void keyReleased(KeyEvent e) {
nave.keyReleased(e);
}
@Override
public void keyPressed(KeyEvent e) {
nave.keyPressed(e);
}
}
61. MINILABS: JOGOS EM JAVA
Nave.java
import java.awt.Image;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
public class Nave {
private int dx;
private int dy;
private int x;
private int y;
private Image image;
public Nave() {
initNave();
}
...
}
62. MINILABS: JOGOS EM JAVA
Nave.java
private void initNave() {
ImageIcon ii = new ImageIcon("nave.png");
image = ii.getImage();
x = 40;
y = 60;
}
public void move() {
x += dx;
y += dy;
}
public int getX() { return x; }
public int getY() { return y; }
public Image getImage() { return image; }
63. MINILABS: JOGOS EM JAVA
Nave.java
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = -1;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 1;
}
if (key == KeyEvent.VK_UP) {
dy = -1;
}
if (key == KeyEvent.VK_DOWN) {
dy = 1;
}
}
64. MINILABS: JOGOS EM JAVA
Nave.java
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = 0;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 0;
}
if (key == KeyEvent.VK_UP) {
dy = 0;
}
if (key == KeyEvent.VK_DOWN) {
dy = 0;
}
}
66. MINILABS: JOGOS EM JAVA
Jogo.java
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class Jogo extends JPanel implements ActionListener {
private final int ICRAFT_X = 40;
private final int ICRAFT_Y = 60;
private final int DELAY = 10;
private Timer timer;
private Nave nave;
public Jogo() {
initJogo();
}
...
}
67. MINILABS: JOGOS EM JAVA
Jogo.java
private void initJogo() {
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);
nave = new Nave(ICRAFT_X, ICRAFT_Y);
timer = new Timer(DELAY, this);
timer.start();
}
68. MINILABS: JOGOS EM JAVA
Jogo.java
private void desenhar(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(nave.getImage(), nave.getX(), nave.getY(), this);
ArrayList<?> ms = nave.getMissiles();
for (Object m1 : ms) {
Missil m = (Missil) m1;
g2d.drawImage(m.getImage(), m.getX(), m.getY(), this);
}
}
69. MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void actionPerformed(ActionEvent e) {
updateMissiles();
updateCraft();
repaint();
}
70. MINILABS: JOGOS EM JAVA
Jogo.java
private void updateMissiles() {
ArrayList<?> ms = nave.getMissiles();
for (int i = 0; i < ms.size(); i++) {
Missil m = (Missil) ms.get(i);
if (m.isVisible()) {
m.move();
} else {
ms.remove(i);
}
}
}
71. MINILABS: JOGOS EM JAVA
Jogo.java
private void updateCraft() {
nave.move();
}
private class TAdapter extends KeyAdapter {
@Override
public void keyReleased(KeyEvent e) {
nave.keyReleased(e);
}
@Override
public void keyPressed(KeyEvent e) {
nave.keyPressed(e);
}
}
72. MINILABS: JOGOS EM JAVA
Sprite.java
import java.awt.Image;
import javax.swing.ImageIcon;
public class Sprite {
protected int x;
protected int y;
protected int width;
protected int height;
protected boolean vis;
protected Image image;
public Sprite(int x, int y) {
this.x = x;
this.y = y;
vis = true;
}
...
}
73. MINILABS: JOGOS EM JAVA
Sprite.java
protected void carregarImagem(String imageName) {
ImageIcon ii = new ImageIcon(imageName);
image = ii.getImage();
}
protected void getImageDimensions() {
width = image.getWidth(null);
height = image.getHeight(null);
}
74. MINILABS: JOGOS EM JAVA
Sprite.java
public Image getImage() {
return image;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public boolean isVisible() {
return vis;
}
public void setVisible(Boolean visible) {
vis = visible;
}
75. MINILABS: JOGOS EM JAVA
Missil.java
public class Missil extends Sprite {
private final int BOARD_WIDTH = 390;
private final int MISSILE_SPEED = 2;
public Missil(int x, int y) {
super(x, y);
initMissil();
}
private void initMissil() {
carrregarImagem("missil.png");
getImageDimensions();
}
public void move() {
x += MISSILE_SPEED;
if (x > BOARD_WIDTH) {
vis = false;
}
}
}
76. MINILABS: JOGOS EM JAVA
Nave.java
import java.awt.event.KeyEvent;
import java.util.ArrayList;
public class Nave extends Sprite {
private int dx;
private int dy;
private ArrayList<Missil> missiles;
public Nave(int x, int y) {
super(x, y);
initNave();
}
...
}
77. MINILABS: JOGOS EM JAVA
Nave.java
private void initNave() {
missiles = new ArrayList<Missil>();
carrregarImagem("nave.png");
getImageDimensions();
}
public void move() {
x += dx;
y += dy;
}
78. MINILABS: JOGOS EM JAVA
Nave.java
public ArrayList<Missil> getMissiles() {
return missiles;
}
public void atira() {
missiles.add(new Missil(x + width, y + height / 2));
}
79. MINILABS: JOGOS EM JAVA
Nave.java
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_SPACE) {
atira();
}
if (key == KeyEvent.VK_LEFT) {
dx = -1;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 1;
}
if (key == KeyEvent.VK_UP) {
dy = -1;
}
if (key == KeyEvent.VK_DOWN) {
dy = 1;
}
}
80. MINILABS: JOGOS EM JAVA
Nave.java
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = 0;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 0;
}
if (key == KeyEvent.VK_UP) {
dy = 0;
}
if (key == KeyEvent.VK_DOWN) {
dy = 0;
}
}
81. MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
83. MINILABS: JOGOS EM JAVA
Inimigo.java
public class Inimigo extends Sprite {
private final int INITIAL_X = 400;
public Inimigo(int x, int y) {
super(x, y);
initInimigo();
}
private void initInimigo() {
carregaImagem("alien.png");
getImageDimensions();
}
public void move() {
if (x < 0) {
x = INITIAL_X;
}
x -= 1;
}
}
84. MINILABS: JOGOS EM JAVA
Sprite.java
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
85. MINILABS: JOGOS EM JAVA
Jogo.java
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class Jogo extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private Timer timer;
private Nave nave;
private ArrayList<Inimigo> aliens;
private boolean ingame;
private final int ICRAFT_X = 40;
private final int ICRAFT_Y = 60;
private final int B_WIDTH = 400;
private final int B_HEIGHT = 300;
private final int DELAY = 15;
...
}
87. MINILABS: JOGOS EM JAVA
Jogo.java
public Jogo() {
initJogo();
}
private void initJogo() {
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
ingame = true;
setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
nave = new Nave(ICRAFT_X, ICRAFT_Y);
initAliens();
timer = new Timer(DELAY, this);
timer.start();
}
88. MINILABS: JOGOS EM JAVA
Jogo.java
public void initAliens() {
aliens = new ArrayList<>();
for (int[] p : pos) {
aliens.add(new Inimigo(p[0], p[1]));
}
}
89. MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (ingame) {
drawObjects(g);
} else {
drawGameOver(g);
}
Toolkit.getDefaultToolkit().sync();
}
90. MINILABS: JOGOS EM JAVA
Jogo.java
private void drawObjects(Graphics g) {
if (nave.isVisible()) {
g.drawImage(nave.getImage(), nave.getX(), nave.getY(),
this);
}
ArrayList<Missil> ms = nave.getMissiles();
for (Missil m : ms) {
if (m.isVisible()) {
g.drawImage(m.getImage(), m.getX(), m.getY(), this);
}
}
for (Inimigo a : aliens) {
if (a.isVisible()) {
g.drawImage(a.getImage(), a.getX(), a.getY(), this);
}
}
g.setColor(Color.WHITE);
g.drawString("Inimigos restantes: " + aliens.size(), 5, 15);
}
91. MINILABS: JOGOS EM JAVA
Jogo.java
private void drawGameOver(Graphics g) {
String msg = "Game Over";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics fm = getFontMetrics(small);
g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (B_WIDTH - fm.stringWidth(msg)) / 2, B_HEIGHT / 2);
}
92. MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void actionPerformed(ActionEvent e) {
inGame();
updateNave();
updateMissils();
updateInimigo();
checkCollisions();
repaint();
}
93. MINILABS: JOGOS EM JAVA
Jogo.java
private void inGame() {
if (!ingame) {
timer.stop();
}
}
private void updateNave() {
if (nave.isVisible()) {
nave.move();
}
}
94. MINILABS: JOGOS EM JAVA
Jogo.java
private void updateMissils() {
ArrayList<Missil> ms = nave.getMissiles();
for (int i = 0; i < ms.size(); i++) {
Missil m = ms.get(i);
if (m.isVisible()) {
m.move();
} else {
ms.remove(i);
}
}
}
95. MINILABS: JOGOS EM JAVA
Jogo.java
private void updateInimigos() {
if (aliens.isEmpty()) {
ingame = false;
return;
}
for (int i = 0; i < aliens.size(); i++) {
Inimigo a = aliens.get(i);
if (a.isVisible()) {
a.move();
} else {
aliens.remove(i);
}
}
}
96. MINILABS: JOGOS EM JAVA
Jogo.java
public void checkCollisions() {
Rectangle r3 = nave.getBounds();
for (Inimigo alien : aliens) {
Rectangle r2 = alien.getBounds();
if (r3.intersects(r2)) {
nave.setVisible(false);
alien.setVisible(false);
ingame = false;
}
}
ArrayList<Missil> ms = nave.getMissiles();
for (Missil m : ms) {
Rectangle r1 = m.getBounds();
for (Inimigo alien : aliens) {
Rectangle r2 = alien.getBounds();
if (r1.intersects(r2)) {
m.setVisible(false);
alien.setVisible(false);
}
}
}
}
97. MINILABS: JOGOS EM JAVA
Jogo.java
private class TAdapter extends KeyAdapter {
@Override
public void keyReleased(KeyEvent e) {
nave.keyReleased(e);
}
@Override
public void keyPressed(KeyEvent e) {
nave.keyPressed(e);
}
}