SlideShare uma empresa Scribd logo
1 de 98
Baixar para ler offline
LABS.DGTI: JOGOS EM JAVA
DESENVOLVIMENTO DE JOGOS EM JAVA 2D.
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)
MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
"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
MINILABS: JOGOS EM JAVA
GAME LOOP
CARREGAR
LOAD
ENTRADAS
INPUTS
ATUALIZAR
UPDATE
APRESENTAR
RENDER
DESCARREGAR
UNLOAD
BASIC0
Versão 1
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.
MINILABS: JOGOS EM JAVA
COMPONENTES E CONTAINERS
▸ JFrame
▸ JPanel
▸ JButtons
▸ JLabel
▸ JTable
MINILABS: JOGOS EM JAVA
Jogo.java
import javax.swing.JPanel;
public class Jogo extends JPanel {
public Jogo() {
}
}
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) {...}
}
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
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);
}
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
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);
}
});
}
BASICO
Versão 2
MINILABS: JOGOS EM JAVA
DESENHANDO
▸ void paintComponent(Graphics g) {…}
▸ Método que desenha o componentes
MINILABS: JOGOS EM JAVA
Jogo.java
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JPanel;
import static java.awt.RenderingHints.*;
public class Jogo extends JPanel {
public void paintComponent(Graphics g) {...}
private void desenhar(Graphics g) {...}
}
MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
desenhar(g);
}
MINILABS: JOGOS EM JAVA
DESENHANDO
▸ Graphics2D
▸ RenderingHints
▸ Dimension
▸ Ellipse2D
▸ AffineTransform
MINILABS: JOGOS EM JAVA
Jogo.java (basico)
private void desenhar(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Dimension size = getSize();
double w = size.getWidth();
double h = size.getHeight();
Ellipse2D e = new Ellipse2D.Double(0, 0, 80, 130);
for (double deg = 0; deg < 360; deg += 5) {
AffineTransform at = AffineTransform.getTranslateInstance(w / 2, h / 2);
at.rotate(Math.toRadians(deg));
g2d.draw(at.createTransformedShape(e));
}
}
MINILABS: JOGOS EM JAVA
Jogo.java (com perfumaria)
private void desenhar(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
RenderingHints rh = new RenderingHints(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
rh.put(KEY_RENDERING, VALUE_RENDER_QUALITY);
g2d.setRenderingHints(rh);
Dimension size = getSize();
double w = size.getWidth();
double h = size.getHeight();
Ellipse2D e = new Ellipse2D.Double(0, 0, 80, 130);
g2d.setStroke(new BasicStroke(1));
g2d.setColor(Color.gray);
for (double deg = 0; deg < 360; deg += 5) {
AffineTransform at = AffineTransform.getTranslateInstance(w / 2, h / 2);
at.rotate(Math.toRadians(deg));
g2d.draw(at.createTransformedShape(e));
}
}
BASICO
Versão 3
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) {...}
}
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));
}
MINILABS: JOGOS EM JAVA
CARREGANDO IMAGEM
▸ Image imagem
▸ ImageIcon imageIcon
▸ g.drawImage(imagem, 0, 0, null);
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);
}
MINILABS: JOGOS EM JAVA
Aplicacao.java
private void initUI() {
add(new Jogo());
pack();
setTitle("Aplicação");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
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.
MINILABS: JOGOS EM JAVA
THREADS
ANIMAÇÃO
Versão 4
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.
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;
...
}
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) {...}
}
MINILABS: JOGOS EM JAVA
Jogo.java
public Jogo() {
initJogo();
}
private void carregaImagem() {
ImageIcon ii = new ImageIcon("estrela.png");
imagem = ii.getImage();
}
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.
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();
}
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.
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.
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();
}
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
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();
}
ANIMAÇÃO
Versão 5
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;
...
}
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
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);
}
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();
}
}
ANIMAÇÃO
Versão 6
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;
...
}
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.
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;
}
}
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();
}
}
MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
SPRITES
Versão 7
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) {...}
}
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();
}
...
}
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();
}
MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
desenhar(g);
Toolkit.getDefaultToolkit().sync();
}
private void desenhar(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(nave.getImage(), nave.getX(), nave.getY(), this);
}
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);
}
}
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();
}
...
}
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; }
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;
}
}
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;
}
}
SPRITES
Versão 8
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();
}
...
}
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();
}
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);
}
}
MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void actionPerformed(ActionEvent e) {
updateMissiles();
updateCraft();
repaint();
}
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);
}
}
}
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);
}
}
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;
}
...
}
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);
}
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;
}
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;
}
}
}
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();
}
...
}
MINILABS: JOGOS EM JAVA
Nave.java
private void initNave() {
missiles = new ArrayList<Missil>();
carrregarImagem("nave.png");
getImageDimensions();
}
public void move() {
x += dx;
y += dy;
}
MINILABS: JOGOS EM JAVA
Nave.java
public ArrayList<Missil> getMissiles() {
return missiles;
}
public void atira() {
missiles.add(new Missil(x + width, y + height / 2));
}
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;
}
}
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;
}
}
MINILABS: JOGOS EM JAVA
AGENDA
▸ Conceitos Básicos
▸ Animação
▸ Sprites
▸ Colisões
COLISÃO
Versão 9
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;
}
}
MINILABS: JOGOS EM JAVA
Sprite.java
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
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;
...
}
MINILABS: JOGOS EM JAVA
Jogo.java
private final int[][] pos = {
{2380, 29}, {2500, 59}, {1380, 89},
{780, 109}, {580, 139}, {680, 239},
{790, 259}, {760, 50}, {790, 150},
{980, 209}, {560, 45}, {510, 70},
{930, 159}, {590, 80}, {530, 60},
{940, 59}, {990, 30}, {920, 200},
{900, 259}, {660, 50}, {540, 90},
{810, 220}, {860, 20}, {740, 180},
{820, 128}, {490, 170}, {700, 30}
};
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();
}
MINILABS: JOGOS EM JAVA
Jogo.java
public void initAliens() {
aliens = new ArrayList<>();
for (int[] p : pos) {
aliens.add(new Inimigo(p[0], p[1]));
}
}
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();
}
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);
}
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);
}
MINILABS: JOGOS EM JAVA
Jogo.java
@Override
public void actionPerformed(ActionEvent e) {
inGame();
updateNave();
updateMissils();
updateInimigo();
checkCollisions();
repaint();
}
MINILABS: JOGOS EM JAVA
Jogo.java
private void inGame() {
if (!ingame) {
timer.stop();
}
}
private void updateNave() {
if (nave.isVisible()) {
nave.move();
}
}
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);
}
}
}
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);
}
}
}
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);
}
}
}
}
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);
}
}
REFERENCIAS
▸ http://www.javaworld.com/article/2077754/core-java/swing-threading-and-
the-event-dispatch-thread.html
▸ http://www.oracle.com/technetwork/articles/java/index-jsp-135444.html
▸ http://zetcode.com
▸ Salen. Katie; Zimmerman, Eric. Rules of Play: Game Design Fundamentals. MIT
PRESS, 2004

Mais conteúdo relacionado

Mais procurados

GraalVM Native Images by Oleg Selajev @shelajev
GraalVM Native Images by Oleg Selajev @shelajevGraalVM Native Images by Oleg Selajev @shelajev
GraalVM Native Images by Oleg Selajev @shelajevOracle Developers
 
ES6 presentation
ES6 presentationES6 presentation
ES6 presentationritika1
 
Making The Move To Java 17 (JConf 2022)
Making The Move To Java 17 (JConf 2022)Making The Move To Java 17 (JConf 2022)
Making The Move To Java 17 (JConf 2022)Alex Motley
 
Java 9 New Features
Java 9 New FeaturesJava 9 New Features
Java 9 New FeaturesAli BAKAN
 
TestNG - The Next Generation of Unit Testing
TestNG - The Next Generation of Unit TestingTestNG - The Next Generation of Unit Testing
TestNG - The Next Generation of Unit TestingBethmi Gunasekara
 
Lambda Expressions in Java
Lambda Expressions in JavaLambda Expressions in Java
Lambda Expressions in JavaErhan Bagdemir
 
Hibernate
HibernateHibernate
HibernateAjay K
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introductionRasheed Waraich
 
Type script - advanced usage and practices
Type script  - advanced usage and practicesType script  - advanced usage and practices
Type script - advanced usage and practicesIwan van der Kleijn
 
NestJS - O framework progressivo
NestJS - O framework progressivoNestJS - O framework progressivo
NestJS - O framework progressivoWender Machado
 
Java 8 - Features Overview
Java 8 - Features OverviewJava 8 - Features Overview
Java 8 - Features OverviewSergii Stets
 
Karatê DSL - Automatizando testes de API de forma simples - GUTS RS - Junho
Karatê DSL - Automatizando testes de API de forma simples - GUTS RS - JunhoKaratê DSL - Automatizando testes de API de forma simples - GUTS RS - Junho
Karatê DSL - Automatizando testes de API de forma simples - GUTS RS - JunhoSamuel Lucas
 
Java script final presentation
Java script final presentationJava script final presentation
Java script final presentationAdhoura Academy
 
Spring bootでweb 基本編
Spring bootでweb 基本編Spring bootでweb 基本編
Spring bootでweb 基本編なべ
 
Java vs JavaScript | Edureka
Java vs JavaScript | EdurekaJava vs JavaScript | Edureka
Java vs JavaScript | EdurekaEdureka!
 
An Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
An Introduction to JUnit 5 and how to use it with Spring boot tests and MockitoAn Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
An Introduction to JUnit 5 and how to use it with Spring boot tests and Mockitoshaunthomas999
 

Mais procurados (20)

GraalVM Native Images by Oleg Selajev @shelajev
GraalVM Native Images by Oleg Selajev @shelajevGraalVM Native Images by Oleg Selajev @shelajev
GraalVM Native Images by Oleg Selajev @shelajev
 
ES6 presentation
ES6 presentationES6 presentation
ES6 presentation
 
Making The Move To Java 17 (JConf 2022)
Making The Move To Java 17 (JConf 2022)Making The Move To Java 17 (JConf 2022)
Making The Move To Java 17 (JConf 2022)
 
Java 9 New Features
Java 9 New FeaturesJava 9 New Features
Java 9 New Features
 
TestNG - The Next Generation of Unit Testing
TestNG - The Next Generation of Unit TestingTestNG - The Next Generation of Unit Testing
TestNG - The Next Generation of Unit Testing
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
 
Getting started with typescript
Getting started with typescriptGetting started with typescript
Getting started with typescript
 
Lambda Expressions in Java
Lambda Expressions in JavaLambda Expressions in Java
Lambda Expressions in Java
 
Hibernate
HibernateHibernate
Hibernate
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introduction
 
Type script - advanced usage and practices
Type script  - advanced usage and practicesType script  - advanced usage and practices
Type script - advanced usage and practices
 
NestJS - O framework progressivo
NestJS - O framework progressivoNestJS - O framework progressivo
NestJS - O framework progressivo
 
Java 8 - Features Overview
Java 8 - Features OverviewJava 8 - Features Overview
Java 8 - Features Overview
 
Karatê DSL - Automatizando testes de API de forma simples - GUTS RS - Junho
Karatê DSL - Automatizando testes de API de forma simples - GUTS RS - JunhoKaratê DSL - Automatizando testes de API de forma simples - GUTS RS - Junho
Karatê DSL - Automatizando testes de API de forma simples - GUTS RS - Junho
 
Java script final presentation
Java script final presentationJava script final presentation
Java script final presentation
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Spring bootでweb 基本編
Spring bootでweb 基本編Spring bootでweb 基本編
Spring bootでweb 基本編
 
Java vs JavaScript | Edureka
Java vs JavaScript | EdurekaJava vs JavaScript | Edureka
Java vs JavaScript | Edureka
 
An Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
An Introduction to JUnit 5 and how to use it with Spring boot tests and MockitoAn Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
An Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
 

Destaque (7)

Socket
SocketSocket
Socket
 
HTTP
HTTPHTTP
HTTP
 
Java www
Java wwwJava www
Java www
 
Html
HtmlHtml
Html
 
Hands-On Java web passando por Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...
Hands-On Java web passando por  Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...Hands-On Java web passando por  Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...
Hands-On Java web passando por Servlets, JSP, JSTL, JDBC, Hibernate, DAO, MV...
 
Curso de Android - aula 3
Curso de Android - aula 3Curso de Android - aula 3
Curso de Android - aula 3
 
Minicurso de HTML básico - Atualizado para HTML5
Minicurso de HTML básico - Atualizado para HTML5Minicurso de HTML básico - Atualizado para HTML5
Minicurso de HTML básico - Atualizado para HTML5
 

Semelhante a Labs Jogos Java

Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere
Portando app JavaME S40 para C# WP7:  Um estudo de caso real da app CalcSpherePortando app JavaME S40 para C# WP7:  Um estudo de caso real da app CalcSphere
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphereEloi Júnior
 
INdT Mobile Labs - Sparta
INdT Mobile Labs - SpartaINdT Mobile Labs - Sparta
INdT Mobile Labs - SpartaHeitor Carlos
 
Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3Odair Bonin Borges
 
Júlio Pescuite - Advanced Topics for Game Developers
Júlio Pescuite - Advanced Topics for Game DevelopersJúlio Pescuite - Advanced Topics for Game Developers
Júlio Pescuite - Advanced Topics for Game DevelopersiMasters
 
Advanced topics for game developers
Advanced topics for game developersAdvanced topics for game developers
Advanced topics for game developersjuliocoopergames
 
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...INdT
 
Oficina Android - Games com AndEngine - Dia 2
Oficina Android - Games com AndEngine - Dia 2Oficina Android - Games com AndEngine - Dia 2
Oficina Android - Games com AndEngine - Dia 2Odair Bonin Borges
 
Aplicacoes gráficas em Java
Aplicacoes gráficas em JavaAplicacoes gráficas em Java
Aplicacoes gráficas em JavaMarco Reis
 
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5Willian Molinari
 
Desenvolvendo jogos com PyGame - Rafael Jeffman
Desenvolvendo jogos com PyGame - Rafael JeffmanDesenvolvendo jogos com PyGame - Rafael Jeffman
Desenvolvendo jogos com PyGame - Rafael JeffmanTchelinux
 
Desenvolvendo Jogos com PyGame - Rafael Guterres Jeffman - Tchelinux Pelotas ...
Desenvolvendo Jogos com PyGame - Rafael Guterres Jeffman - Tchelinux Pelotas ...Desenvolvendo Jogos com PyGame - Rafael Guterres Jeffman - Tchelinux Pelotas ...
Desenvolvendo Jogos com PyGame - Rafael Guterres Jeffman - Tchelinux Pelotas ...Tchelinux
 
jQuery básico (parte 3)
jQuery básico (parte 3)jQuery básico (parte 3)
jQuery básico (parte 3)Luís Cobucci
 
Aula 01 - Desenvolvendo Jogos Para Android - Ambiente do Jogo
Aula 01 - Desenvolvendo Jogos Para Android - Ambiente do JogoAula 01 - Desenvolvendo Jogos Para Android - Ambiente do Jogo
Aula 01 - Desenvolvendo Jogos Para Android - Ambiente do JogoArthur Emanuel
 
Introducao a Linguagem Kotlin
Introducao a Linguagem KotlinIntroducao a Linguagem Kotlin
Introducao a Linguagem KotlinCalebeMiquissene
 
Busca Visual
Busca VisualBusca Visual
Busca Visualgsroma
 
isk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todosisk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todosRicardo Cabral
 

Semelhante a Labs Jogos Java (20)

Guia xna
Guia xnaGuia xna
Guia xna
 
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere
Portando app JavaME S40 para C# WP7:  Um estudo de caso real da app CalcSpherePortando app JavaME S40 para C# WP7:  Um estudo de caso real da app CalcSphere
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere
 
INdT Mobile Labs - Sparta
INdT Mobile Labs - SpartaINdT Mobile Labs - Sparta
INdT Mobile Labs - Sparta
 
Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3
 
Júlio Pescuite - Advanced Topics for Game Developers
Júlio Pescuite - Advanced Topics for Game DevelopersJúlio Pescuite - Advanced Topics for Game Developers
Júlio Pescuite - Advanced Topics for Game Developers
 
Advanced topics for game developers
Advanced topics for game developersAdvanced topics for game developers
Advanced topics for game developers
 
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
 
Oficina Android - Games com AndEngine - Dia 2
Oficina Android - Games com AndEngine - Dia 2Oficina Android - Games com AndEngine - Dia 2
Oficina Android - Games com AndEngine - Dia 2
 
Tutorial java swing
Tutorial java swingTutorial java swing
Tutorial java swing
 
Aplicacoes gráficas em Java
Aplicacoes gráficas em JavaAplicacoes gráficas em Java
Aplicacoes gráficas em Java
 
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
TDC2011 - Desenvolvimento de jogos com Javascript e HTML5
 
Desenvolvendo jogos com PyGame - Rafael Jeffman
Desenvolvendo jogos com PyGame - Rafael JeffmanDesenvolvendo jogos com PyGame - Rafael Jeffman
Desenvolvendo jogos com PyGame - Rafael Jeffman
 
Desenvolvendo Jogos com PyGame - Rafael Guterres Jeffman - Tchelinux Pelotas ...
Desenvolvendo Jogos com PyGame - Rafael Guterres Jeffman - Tchelinux Pelotas ...Desenvolvendo Jogos com PyGame - Rafael Guterres Jeffman - Tchelinux Pelotas ...
Desenvolvendo Jogos com PyGame - Rafael Guterres Jeffman - Tchelinux Pelotas ...
 
Python Para Maemo
Python Para MaemoPython Para Maemo
Python Para Maemo
 
jQuery básico (parte 3)
jQuery básico (parte 3)jQuery básico (parte 3)
jQuery básico (parte 3)
 
Aula 01 - Desenvolvendo Jogos Para Android - Ambiente do Jogo
Aula 01 - Desenvolvendo Jogos Para Android - Ambiente do JogoAula 01 - Desenvolvendo Jogos Para Android - Ambiente do Jogo
Aula 01 - Desenvolvendo Jogos Para Android - Ambiente do Jogo
 
Qualidade de código Android
Qualidade de código AndroidQualidade de código Android
Qualidade de código Android
 
Introducao a Linguagem Kotlin
Introducao a Linguagem KotlinIntroducao a Linguagem Kotlin
Introducao a Linguagem Kotlin
 
Busca Visual
Busca VisualBusca Visual
Busca Visual
 
isk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todosisk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todos
 

Mais de Mario Jorge Pereira (18)

Educacao e Inteligencia Artificial Generativa
Educacao e Inteligencia Artificial GenerativaEducacao e Inteligencia Artificial Generativa
Educacao e Inteligencia Artificial Generativa
 
Lógica de Programação e Algoritmos
Lógica de Programação e AlgoritmosLógica de Programação e Algoritmos
Lógica de Programação e Algoritmos
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência Java
 
Android por onde começar? Mini Curso Erbase 2015
Android por onde começar? Mini Curso Erbase 2015 Android por onde começar? Mini Curso Erbase 2015
Android por onde começar? Mini Curso Erbase 2015
 
Java Nuvem Appengine
Java Nuvem AppengineJava Nuvem Appengine
Java Nuvem Appengine
 
Mini curso Android
Mini curso AndroidMini curso Android
Mini curso Android
 
Java Server Faces
Java Server FacesJava Server Faces
Java Server Faces
 
Minicurso Android
Minicurso AndroidMinicurso Android
Minicurso Android
 
Android, por onde começar?
Android, por onde começar?Android, por onde começar?
Android, por onde começar?
 
Android e Cloud Computing
Android e Cloud ComputingAndroid e Cloud Computing
Android e Cloud Computing
 
RMI (Remote Method Invocation)
RMI (Remote Method Invocation) RMI (Remote Method Invocation)
RMI (Remote Method Invocation)
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 
GUI - Eventos
GUI - EventosGUI - Eventos
GUI - Eventos
 
GUI Aplicações Gráficas
GUI Aplicações Gráficas GUI Aplicações Gráficas
GUI Aplicações Gráficas
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java
 
Erros comuns em java
Erros comuns em javaErros comuns em java
Erros comuns em java
 
Introdução ao java Alo Mundo
Introdução ao java Alo MundoIntrodução ao java Alo Mundo
Introdução ao java Alo Mundo
 
BI
BIBI
BI
 

Labs Jogos Java

  • 1. LABS.DGTI: JOGOS EM JAVA DESENVOLVIMENTO DE JOGOS EM JAVA 2D.
  • 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); } }); }
  • 17. MINILABS: JOGOS EM JAVA DESENHANDO ▸ void paintComponent(Graphics g) {…} ▸ Método que desenha o componentes
  • 18. MINILABS: JOGOS EM JAVA Jogo.java import java.awt.*; import java.awt.geom.*; import javax.swing.JPanel; import static java.awt.RenderingHints.*; public class Jogo extends JPanel { public void paintComponent(Graphics g) {...} private void desenhar(Graphics g) {...} }
  • 19. MINILABS: JOGOS EM JAVA Jogo.java @Override public void paintComponent(Graphics g) { super.paintComponent(g); desenhar(g); }
  • 20. MINILABS: JOGOS EM JAVA DESENHANDO ▸ Graphics2D ▸ RenderingHints ▸ Dimension ▸ Ellipse2D ▸ AffineTransform
  • 21. MINILABS: JOGOS EM JAVA Jogo.java (basico) private void desenhar(Graphics g) { Graphics2D g2d = (Graphics2D) g; Dimension size = getSize(); double w = size.getWidth(); double h = size.getHeight(); Ellipse2D e = new Ellipse2D.Double(0, 0, 80, 130); for (double deg = 0; deg < 360; deg += 5) { AffineTransform at = AffineTransform.getTranslateInstance(w / 2, h / 2); at.rotate(Math.toRadians(deg)); g2d.draw(at.createTransformedShape(e)); } }
  • 22. MINILABS: JOGOS EM JAVA Jogo.java (com perfumaria) private void desenhar(Graphics g) { Graphics2D g2d = (Graphics2D) g; RenderingHints rh = new RenderingHints(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON); rh.put(KEY_RENDERING, VALUE_RENDER_QUALITY); g2d.setRenderingHints(rh); Dimension size = getSize(); double w = size.getWidth(); double h = size.getHeight(); Ellipse2D e = new Ellipse2D.Double(0, 0, 80, 130); g2d.setStroke(new BasicStroke(1)); g2d.setColor(Color.gray); for (double deg = 0; deg < 360; deg += 5) { AffineTransform at = AffineTransform.getTranslateInstance(w / 2, h / 2); at.rotate(Math.toRadians(deg)); g2d.draw(at.createTransformedShape(e)); } }
  • 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.
  • 31. MINILABS: JOGOS EM JAVA THREADS
  • 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(); }
  • 59. MINILABS: JOGOS EM JAVA Jogo.java @Override public void paintComponent(Graphics g) { super.paintComponent(g); desenhar(g); Toolkit.getDefaultToolkit().sync(); } private void desenhar(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(nave.getImage(), nave.getX(), nave.getY(), this); }
  • 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; ... }
  • 86. MINILABS: JOGOS EM JAVA Jogo.java private final int[][] pos = { {2380, 29}, {2500, 59}, {1380, 89}, {780, 109}, {580, 139}, {680, 239}, {790, 259}, {760, 50}, {790, 150}, {980, 209}, {560, 45}, {510, 70}, {930, 159}, {590, 80}, {530, 60}, {940, 59}, {990, 30}, {920, 200}, {900, 259}, {660, 50}, {540, 90}, {810, 220}, {860, 20}, {740, 180}, {820, 128}, {490, 170}, {700, 30} };
  • 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); } }