Peguei um código simples no zetcode com um joguinho em java com uma nave, disparos e aliens. Estou tentando adaptá-lo para virar um jogo de “waves”, onde uma vez que todos os aliens são destruídos uma nova onda de inimigos surge. Estou no meu Estágio agora e sem nenhum editor de código, então começei a modificá-lo no bloco de notas mesmo. Poderiam me ajudar com o funcionamento atual após minhas modificações? Tenho dúvidas quanto ao while que coloquei quando a nave perde uma vida, não sei se é o jeito mais prático de respawnar os inimigos.
A classe que estou passando é a principal, as outras do projeto servem apenas para puxar os sprites ou determinar os movimentos de cada objeto, além da que determina o tamanho da janela.
Onde existem comentários foi onde modifiquei algo.
package com.zetcode;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Board extends JPanel implements ActionListener {
private Timer timer;
private SpaceShip spaceship;
private List<Alien> 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;
//ALTEREI ALGUNS VALORES AQUI
private final int[][] pos = {
{690, 29}, {800, 59}, {890, 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}
};
public Board() {
initBoard();
}
private void initBoard() {
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);
ingame = true;
//CRIEI ALGUMAS VARIÁVEIS AQUI
private int VIDAS = 3;
private int pontos = 0;
private int wave = 1;
setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
spaceship = new SpaceShip(ICRAFT_X, ICRAFT_Y);
initAliens();
timer = new Timer(DELAY, this);
timer.start();
}
public void initAliens() {
aliens = new ArrayList<>();
for (int[] p : pos) {
aliens.add(new Alien(p[0], p[1]));
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (ingame) {
//MANTÉM INGAME = TRUE ENQUANTO AINDA TIVER VIDAS
while (VIDAS > 0) {
drawObjects(g);
}
} else {
drawGameOver(g);
}
Toolkit.getDefaultToolkit().sync();
}
private void drawObjects(Graphics g) {
if (spaceship.isVisible()) {
g.drawImage(spaceship.getImage(), spaceship.getX(), spaceship.getY(),
this);
}
List<Missile> ms = spaceship.getMissiles();
for (Missile missile : ms) {
if (missile.isVisible()) {
g.drawImage(missile.getImage(), missile.getX(),
missile.getY(), this);
}
}
for (Alien alien : aliens) {
if (alien.isVisible()) {
g.drawImage(alien.getImage(), alien.getX(), alien.getY(), this);
}
}
g.setColor(Color.WHITE);
g.drawString("Aliens left: " + aliens.size(), 5, 15);
//ADICIONADO CONTAGEM DE VIDAS E DE PONTOS
g.drawString("Vidas restantes: " + VIDAS, 10, 20);
g.drawString("Score: " + pontos, 15, 25);
}
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);
}
@Override
public void actionPerformed(ActionEvent e) {
inGame();
updateShip();
updateMissiles();
updateAliens();
checkCollisions();
repaint();
}
private void inGame() {
if (!ingame) {
timer.stop();
}
}
private void updateShip() {
if (spaceship.isVisible()) {
spaceship.move();
}
}
private void updateMissiles() {
List<Missile> ms = spaceship.getMissiles();
for (int i = 0; i < ms.size(); i++) {
Missile m = ms.get(i);
if (m.isVisible()) {
m.move();
} else {
ms.remove(i);
}
}
}
private void updateAliens() {
//MODIFICADO PARA SPAWNAR MAIS ALIENS
if (aliens.isEmpty() && VIDAS == 0) {
ingame = false;
return;
}
else if (aliens.isEmpty && VIDAS > 0){
wave++;
drawObjects(g);
}
for (int i = 0; i < aliens.size(); i++) {
Alien a = aliens.get(i);
if (a.isVisible()) {
a.move();
} else {
aliens.remove(i);
}
}
}
public void checkCollisions() {
Rectangle r3 = spaceship.getBounds();
for (Alien alien : aliens) {
Rectangle r2 = alien.getBounds();
//MODIFICADO PARA REDUZIR A QUANTIDADE DE VIDAS EM CASO DE COLISAO
if (r3.intersects(r2) && VIDAS > 0) {
spaceship.setVisible(false);
alien.setVisible(false);
VIDAS--;
}
else{
spaceship.setVisible(false);
alien.setVisible(false);
ingame = false;
}
}
List<Missile> ms = spaceship.getMissiles();
for (Missile m : ms) {
Rectangle r1 = m.getBounds();
for (Alien alien : aliens) {
Rectangle r2 = alien.getBounds();
//MODIFICADO PARA AUMENTAR A QUANTIDADE DE PONTOS
if (r1.intersects(r2)) {
m.setVisible(false);
alien.setVisible(false);
pontos += 75*wave;
}
}
}
private class TAdapter extends KeyAdapter {
@Override
public void keyReleased(KeyEvent e) {
spaceship.keyReleased(e);
}
@Override
public void keyPressed(KeyEvent e) {
spaceship.keyPressed(e);
}
}
}