Mudar imagem de Colisao e inimigos aleatorios

Olá pessoal, estou com um projeto de um jogo bem simples de principio…

Um jogo de nave simples que atira misseis para destruir o inimigo, toda a
estrutura de colisao ja foi montada e esta funcionando.

o que gostaria de saber é como faço para mudar a imagem do inimigo, para
quando o missel entrar em contato com ele ele nao desaparecer e sim chamar uma
imagem .gif como se ele tivesse sido destruido, e depois sim, sumir do stage.

Se alguem tambem puder me ajudar, eu defini a posição dos inimigos fixas,
gostaria de fazer com que os inimigos viessem aleatoriamente do topo do jogo.

Segue o codigo da colisao e a classe inimigo

Codigo da classe FASE onde esta a estrutura de colisao em “Chegar colisoes”

package jogo;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
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.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Fase extends JPanel implements ActionListener {

	private Image fundo;
	private Nave nave;
	private Timer timer;

	private boolean emJogo;

	private List<Inimigo> inimigos;
	private List<Meteoro> meteoros;

	
	private int[][] coordenadas = { 
			
			{ 2380, 29 }, { 2600, 59 }, { 1380, 89 },
			{ 780, 109 }, { 580, 139 }, { 880, 239 }, { 790, 259 },
			{ 760, 50 }, { 790, 150 }, { 1980, 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 },
			{ 920, 300 }, { 856, 328 }, { 456, 320 }

	};

	public Fase() {

		setFocusable(true);
		setDoubleBuffered(true);
		addKeyListener(new TecladoAdapter());
		ImageIcon referencia = new ImageIcon("res\\fundo2.jpg");
		fundo = referencia.getImage();
		nave = new Nave();

		emJogo = true;

		inicializaInimigos();
		inicializaMeteoros();

		timer = new Timer(5, this);
		timer.start();

	}

	public void inicializaMeteoros() {
		meteoros = new ArrayList<Meteoro>();

		for (int i = 0; i < coordenadas.length; i++) {
			meteoros.add(new Meteoro(coordenadas[i][0], coordenadas[i][1]));
		}
	}
	
	
	public void inicializaInimigos() {
		inimigos = new ArrayList<Inimigo>();

		for (int i = 0; i < coordenadas.length; i++) {
			inimigos.add(new Inimigo(coordenadas[i][0], coordenadas[i][1]));
		}
	}

	public void paint(Graphics g) {

		Graphics2D graficos = (Graphics2D) g;
		graficos.drawImage(fundo, 0, 0, this);

		if (emJogo) {

			graficos.drawImage(nave.getImagem(), nave.getX(), nave.getY(), this);

			List<Missel> misseis = nave.getMisseis();

			for (int i = 0; i < misseis.size(); i++) {

				Missel m = (Missel) misseis.get(i);
				graficos.drawImage(m.getImagem(), m.getX(), m.getY(), this);

			}

			for (int i = 0; i < inimigos.size(); i++) {

				Inimigo in = inimigos.get(i);
				graficos.drawImage(in.getImagem(), in.getX(), in.getY(), this);

			}
			
			for (int i = 0; i < meteoros.size(); i++) {

				Meteoro met = meteoros.get(i);
				graficos.drawImage(met.getImagem(), met.getX(), met.getY(), this);

			}

			graficos.setColor(Color.WHITE);
			graficos.drawString("INIMIGOS:" + inimigos.size(), 5, 15);

		} else {

			ImageIcon fimJogo = new ImageIcon("res\\gameover.png");

			graficos.drawImage(fimJogo.getImage(), 0, 0, null);

		}
		g.dispose();

	}

	@Override
	public void actionPerformed(ActionEvent arg0) {

		if (inimigos.size() == 0) {
			emJogo = false;
		}

		List<Missel> misseis = nave.getMisseis();

		for (int i = 0; i < misseis.size(); i++) {

			Missel m = (Missel) misseis.get(i);

			if (m.isVisivel()) {
				m.mexer();
			} else {
				misseis.remove(i);
			}

		}

		for (int i = 0; i < inimigos.size(); i++) {

			Inimigo in = inimigos.get(i);

			if (in.isVisivel()) {
				in.mexer();
			} else {
				inimigos.remove(i);
			}
		}
		nave.mexer();
		chegarColisoes();
		repaint();
	}

	public void chegarColisoes() {

		Rectangle formaNave = nave.getBounds();
		Rectangle formaInimigo;
		Rectangle formaMissel;

		for (int i = 0; i < inimigos.size(); i++) {

			Inimigo tempInimigo = inimigos.get(i);
			formaInimigo = tempInimigo.getBounds();

			if (formaNave.intersects(formaInimigo)) {

				nave.setVisivel(false);
				tempInimigo.setVisivel(false);

				emJogo = false;
			}
		}

		List<Missel> misseis = nave.getMisseis();

		for (int i = 0; i < misseis.size(); i++) {

			Missel tempMissel = misseis.get(i);
			formaMissel = tempMissel.getBounds();

			for (int j = 0; j < inimigos.size(); j++) {

				Inimigo tempInimigo = inimigos.get(j);
				formaInimigo = tempInimigo.getBounds();

				if (formaMissel.intersects(formaInimigo)) {
					
					tempInimigo.setVisivel(false);
					tempMissel.setVisivel(false);
				}
			}
		}
	}

	private class TecladoAdapter extends KeyAdapter {

		@Override
		public void keyPressed(KeyEvent e) {
			
			if(e.getKeyCode() == KeyEvent.VK_ENTER){
				emJogo = true;
				nave = new Nave();
				inicializaInimigos();
			}
			
			nave.KeyPressed(e);
		}

		@Override
		public void keyReleased(KeyEvent e) {
			nave.KeyReleased(e);
		}

	}

}

Aqui o codigo da classe inimigo

package jogo;

import java.awt.Image;
import java.awt.Rectangle;

import javax.swing.ImageIcon;

public class Inimigo {

	private Image imagem;
	private Image imagem2;
	private int x, y;
	private int largura, altura;
	private boolean isVisivel;

	private static final int ALTURA_TELA = 620;
	private static final int LARGURA_TELA = 600;
	private static final int VELOCIDADE = 1;

	private static int contador = 0;

	public Inimigo(int x, int y) {

		this.x = x;
		this.y = y;

		ImageIcon referencia;
		ImageIcon referencia2;
		if (contador++ % 3 == 0) {
			referencia = new ImageIcon("res\\dvd.png");

		} else {

			referencia = new ImageIcon("res\\tv.png");
		}
		
		referencia2 = new ImageIcon("res\\Fogo.gif");
		imagem = referencia.getImage();
		imagem2 = referencia2.getImage();
		
		this.largura = imagem.getWidth(null);
		this.altura = imagem.getHeight(null);
		
		this.largura = imagem2.getWidth(null);
		this.altura = imagem2.getHeight(null);

		isVisivel = true;
		
		
	}

	public void mexer() {

		if (this.y < 0) {
			this.y += ALTURA_TELA;
		} else {
			this.y -= VELOCIDADE;
		}

		if (this.x > 1000) {
			this.x -= LARGURA_TELA;
		}

	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public boolean isVisivel() {
		return isVisivel;
	}

	public void setVisivel(boolean isVisivel) {
		this.isVisivel = isVisivel;
	}

	public Image getImagem() {
		return imagem;
	}
	public Image getImagem2() {
		return imagem2;
	}

	public void setImagem2(Image imagem2) {
		this.imagem2 = imagem2;
	}

	public Rectangle getBounds() {
		return new Rectangle(x, y, largura, altura);

	}

}

Porfavor pessoal to precisando muito dessa ajuda =x

Fico no aguardo, abraço.

Ninguem? :roll:

Olá,

Você precisaria ter um status intermediário para o inimigo, quando ele é atingido fica nesse status que será a animação de destruição.

Quando ele entrar nesse status, passa a ser desenhado com a imagem do inimigo atingido (por exemplo, pegando fogo), e não interfere mais nos cálculos de colisão (a não ser que você queira, é claro).

Marque o momento da colisão (System.currentTimeMillis()) em um atributo desse inimigo, e a cada loop verifique se passou o tempo que você considera adequado para que ele permaneça pegando fogo… quando tiver passado o tempo aí sim retire do jogo.