labs jogos java

98
LABS.DGTI: JOGOS EM JAVA DESENVOLVIMENTO DE JOGOS EM JAVA 2D.

Upload: mario-jorge-pereira

Post on 29-Jan-2018

663 views

Category:

Software


5 download

TRANSCRIPT

Page 1: Labs Jogos Java

LABS.DGTI: JOGOS EM JAVA DESENVOLVIMENTO DE JOGOS EM JAVA 2D.

Page 2: Labs Jogos Java

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)

Page 3: Labs Jogos Java

MINILABS: JOGOS EM JAVA

AGENDA

▸ Conceitos Básicos

▸ Animação

▸ Sprites

▸ Colisões

Page 4: Labs Jogos Java

MINILABS: JOGOS EM JAVA

AGENDA

▸ Conceitos Básicos

▸ Animação

▸ Sprites

▸ Colisões

Page 5: Labs Jogos Java

"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

Page 6: Labs Jogos Java

MINILABS: JOGOS EM JAVA

GAME LOOP

CARREGAR LOAD

ENTRADAS INPUTS

ATUALIZAR UPDATE

APRESENTAR RENDER

DESCARREGAR UNLOAD

Page 7: Labs Jogos Java

BASIC0

Versão 1

Page 8: Labs Jogos Java

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.

Page 9: Labs Jogos Java

MINILABS: JOGOS EM JAVA

COMPONENTES E CONTAINERS

▸ JFrame

▸ JPanel

▸ JButtons

▸ JLabel

▸ JTable

Page 10: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

import javax.swing.JPanel;

public class Jogo extends JPanel {

public Jogo() {

}

}

Page 11: Labs Jogos Java

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) {...}

}

Page 12: Labs Jogos Java

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

Page 13: Labs Jogos Java

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);}

Page 14: Labs Jogos Java

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

Page 15: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Application.java

public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {Aplicacao ex = new Aplicacao();ex.setVisible(true);

}});

}

Page 16: Labs Jogos Java

BASICO

Versão 2

Page 17: Labs Jogos Java

MINILABS: JOGOS EM JAVA

DESENHANDO

▸ void paintComponent(Graphics g) {…}

▸ Método que desenha o componentes

Page 18: Labs Jogos Java

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) {...}

}

Page 19: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);desenhar(g);}

Page 20: Labs Jogos Java

MINILABS: JOGOS EM JAVA

DESENHANDO

▸ Graphics2D

▸ RenderingHints

▸ Dimension

▸ Ellipse2D

▸ AffineTransform

Page 21: Labs Jogos Java

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));

}}

Page 22: Labs Jogos Java

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));

}}

Page 23: Labs Jogos Java

BASICO

Versão 3

Page 24: Labs Jogos Java

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) {...}}

Page 25: Labs Jogos Java

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)); }

Page 26: Labs Jogos Java

MINILABS: JOGOS EM JAVA

CARREGANDO IMAGEM

▸ Image imagem

▸ ImageIcon imageIcon

▸ g.drawImage(imagem, 0, 0, null);

Page 27: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

private void carregaImagem() { ImageIcon ii = new ImageIcon(getClass().getResource("salvador.png")); imagem = ii.getImage(); }@Overridepublic void paintComponent(Graphics g) {

super.paintComponent(g);desenhar(g);

}private void desenhar(Graphics g) { g.drawImage(imagem, 0, 0, null);}

Page 28: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Aplicacao.java

private void initUI() {add(new Jogo());pack();setTitle("Aplicação");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null);}

Page 29: Labs Jogos Java

MINILABS: JOGOS EM JAVA

AGENDA

▸ Conceitos Básicos

▸ Animação

▸ Sprites

▸ Colisões

Page 30: Labs Jogos Java

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.

Page 31: Labs Jogos Java

MINILABS: JOGOS EM JAVA

THREADS

Page 32: Labs Jogos Java

ANIMAÇÃO

Versão 4

Page 33: Labs Jogos Java

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.

Page 34: Labs Jogos Java

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;

...}

Page 35: Labs Jogos Java

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) {...}

}

Page 36: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

public Jogo() {initJogo();}

private void carregaImagem() {ImageIcon ii = new ImageIcon("estrela.png");imagem = ii.getImage();}

Page 37: Labs Jogos Java

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.

Page 38: Labs Jogos Java

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();

}

Page 39: Labs Jogos Java

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.

Page 40: Labs Jogos Java

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.

Page 41: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);desenhar(g);

}

private void desenhar(Graphics g) {g.drawImage(imagem, x, y, this);Toolkit.getDefaultToolkit().sync();

}

Page 42: Labs Jogos Java

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

Page 43: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

@Overridepublic void actionPerformed(ActionEvent e) {x += 1;y += 1;if (y > B_HEIGHT) {y = INITIAL_Y;x = INITIAL_X;

}repaint();

}

Page 44: Labs Jogos Java

ANIMAÇÃO

Versão 5

Page 45: Labs Jogos Java

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; ...}

Page 46: Labs Jogos Java

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

Page 47: Labs Jogos Java

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); }

Page 48: Labs Jogos Java

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(); } }

Page 49: Labs Jogos Java

ANIMAÇÃO

Versão 6

Page 50: Labs Jogos Java

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;

...}

Page 51: Labs Jogos Java

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.

Page 52: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

@Overridepublic 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;

}}

Page 53: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

@Overridepublic 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();

}}

Page 54: Labs Jogos Java

MINILABS: JOGOS EM JAVA

AGENDA

▸ Conceitos Básicos

▸ Animação

▸ Sprites

▸ Colisões

Page 55: Labs Jogos Java

SPRITES

Versão 7

Page 56: Labs Jogos Java

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) {...}

}

Page 57: Labs Jogos Java

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();

}...}

Page 58: Labs Jogos Java

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();

}

Page 59: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

@Overridepublic 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);

}

Page 60: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

@Overridepublic void actionPerformed(ActionEvent e) {nave.move();repaint();

}

private class TAdapter extends KeyAdapter {@Overridepublic void keyReleased(KeyEvent e) {nave.keyReleased(e);

}@Overridepublic void keyPressed(KeyEvent e) {nave.keyPressed(e);

}}

Page 61: Labs Jogos Java

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();

}...}

Page 62: Labs Jogos Java

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; }

Page 63: Labs Jogos Java

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;

}}

Page 64: Labs Jogos Java

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;

}}

Page 65: Labs Jogos Java

SPRITES

Versão 8

Page 66: Labs Jogos Java

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();

}...}

Page 67: Labs Jogos Java

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();

}

Page 68: Labs Jogos Java

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);

}}

Page 69: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

@Overridepublic void actionPerformed(ActionEvent e) {updateMissiles();updateCraft();repaint();

}

Page 70: Labs Jogos Java

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);

}}

}

Page 71: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

private void updateCraft() {nave.move();

}

private class TAdapter extends KeyAdapter {@Overridepublic void keyReleased(KeyEvent e) {nave.keyReleased(e);

}@Overridepublic void keyPressed(KeyEvent e) {nave.keyPressed(e);

}}

Page 72: Labs Jogos Java

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;

}...}

Page 73: Labs Jogos Java

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);

}

Page 74: Labs Jogos Java

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;

}

Page 75: Labs Jogos Java

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; } }}

Page 76: Labs Jogos Java

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(); }...}

Page 77: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Nave.java

private void initNave() { missiles = new ArrayList<Missil>(); carrregarImagem("nave.png"); getImageDimensions(); }

public void move() { x += dx; y += dy; }

Page 78: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Nave.java

public ArrayList<Missil> getMissiles() { return missiles; }

public void atira() { missiles.add(new Missil(x + width, y + height / 2)); }

Page 79: Labs Jogos Java

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; } }

Page 80: Labs Jogos Java

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; } }

Page 81: Labs Jogos Java

MINILABS: JOGOS EM JAVA

AGENDA

▸ Conceitos Básicos

▸ Animação

▸ Sprites

▸ Colisões

Page 82: Labs Jogos Java

COLISÃO

Versão 9

Page 83: Labs Jogos Java

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; }}

Page 84: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Sprite.java

public Rectangle getBounds() {return new Rectangle(x, y, width, height);

}

Page 85: Labs Jogos Java

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;...}

Page 86: Labs Jogos Java

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} };

Page 87: Labs Jogos Java

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(); }

Page 88: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

public void initAliens() { aliens = new ArrayList<>(); for (int[] p : pos) { aliens.add(new Inimigo(p[0], p[1])); } }

Page 89: Labs Jogos Java

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(); }

Page 90: Labs Jogos Java

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); }

Page 91: Labs Jogos Java

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); }

Page 92: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

@Override public void actionPerformed(ActionEvent e) { inGame(); updateNave(); updateMissils(); updateInimigo(); checkCollisions(); repaint(); }

Page 93: Labs Jogos Java

MINILABS: JOGOS EM JAVA

Jogo.java

private void inGame() { if (!ingame) { timer.stop(); } }

private void updateNave() { if (nave.isVisible()) { nave.move(); } }

Page 94: Labs Jogos Java

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); } } }

Page 95: Labs Jogos Java

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); } } }

Page 96: Labs Jogos Java

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); } } } }

Page 97: Labs Jogos Java

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); } }

Page 98: Labs Jogos Java

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