Trying to get explosion to disappear after laser intersects with rectangle object

2 weeks ago 11
ARTICLE AD BOX

I am trying to make a little game in Java, where a Spaceship shoots a laser at a rectangle and the rectangle is removed and an explosion .png appears. The problem I am having is trying to make the explosion animation removed too, after a few seconds. (Can't manage to do it...the explosion animation doesn't remove).

Here is some code any help really appreciated...

import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; public class MovingObject extends JPanel implements KeyListener { private ArrayList<Rectangle> rects = new ArrayList<>(); private final int MAX_X = 400; private final int SPEED = 7; private BufferedImage image, image2, image3; private boolean visible = false; public MovingObject() { rects.add(new Rectangle(20, 50, 128, 128)); rects.add(new Rectangle(80, 75, 32, 32)); rects.add(new Rectangle(130, 25, 128, 128)); rects.add(new Rectangle(200, 50, 50, 50)); rects.add(new Rectangle(300, 50, 50, 50)); try { image = ImageIO.read(new File("C:/Users/hm_08/OneDrive/Desktop/ship3.png")); image2 = ImageIO.read(new File("C:/Users/hm_08/OneDrive/Desktop/shot.png")); image3 = ImageIO.read(new File("C:/Users/hm_08/OneDrive/Desktop/expl.png")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } bgColor(); this.setFocusable(true); addKeyListener(this); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (visible) { g.drawImage(image3, rects.get(2).x, 25, 128, 128, this); } g.fillRect(rects.get(3).x, 50, 50, 50); if (!visible) { g.drawImage(image2, rects.get(1).x, 75, 32, 32, this); } g.drawImage(image, rects.get(0).x, 20, 128, 128, this); g.fillRect(300, 50, 50, 50); } private void bgColor() { setBackground(Color.BLACK); } public static void main(String[] args) { JFrame frame = new JFrame("Moving Object"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 500); frame.add(new MovingObject()); frame.setVisible(true); } @Override public void keyPressed(KeyEvent event) { if (event.getKeyCode() == KeyEvent.VK_SPACE) { Thread animationThread = new Thread(() -> { while (rects.get(1).x < MAX_X) { if (!rects.isEmpty()) { rects.get(1).x += SPEED; repaint(); if (rects.get(1).intersects(rects.get(3))) { visible = !visible; rects.remove(3); repaint(); break; } removeKeyListener(this); } try { Thread.sleep(50); // Delay for smooth movement } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); animationThread.start(); } } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } }

Updated with adding a Timer to shoot the laser, but it still does the same as before this time with an Index 3 out of bounds for length 3 (the updated code is below:

import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; public class MovingObject extends JPanel implements KeyListener { private ArrayList<Rectangle> rects = new ArrayList<>(); private final int SPEED = 7; private BufferedImage image, image2, image3; private boolean visible = false; public MovingObject() { rects.add(new Rectangle(20, 50, 128, 128)); rects.add(new Rectangle(80, 75, 32, 32)); rects.add(new Rectangle(130, 25, 128, 128)); rects.add(new Rectangle(200, 50, 50, 50)); rects.add(new Rectangle(300, 50, 50, 50)); try { image = ImageIO.read(new File("C:/Users/hm_08/OneDrive/Desktop/ship3.png")); image2 = ImageIO.read(new File("C:/Users/hm_08/OneDrive/Desktop/shot.png")); image3 = ImageIO.read(new File("C:/Users/hm_08/OneDrive/Desktop/expl.png")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } bgColor(); this.setFocusable(true); addKeyListener(this); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (visible) { g.drawImage(image3, rects.get(2).x, 25, 128, 128, this); } g.fillRect(rects.get(3).x, 50, 50, 50); if (!visible) { g.drawImage(image2, rects.get(1).x, 75, 32, 32, this); } g.drawImage(image, rects.get(0).x, 20, 128, 128, this); g.fillRect(300, 50, 50, 50); } private void bgColor() { setBackground(Color.BLACK); } public static void main(String[] args) { JFrame frame = new JFrame("Moving Object"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 500); frame.add(new MovingObject()); frame.setVisible(true); } @Override public void keyPressed(KeyEvent event) { if (event.getKeyCode() == KeyEvent.VK_SPACE) { Timer timer = new Timer(25, e -> { if (!rects.isEmpty()) { rects.get(1).x += SPEED; repaint(); System.out.println(rects.size()); if (rects.get(1).intersects(rects.get(3))) { visible = !visible; rects.remove(3); repaint(); } removeKeyListener(this); } }); timer.start(); } } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } }
Read Entire Article