When a bullit bullit hits a alien it creates this error :
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at com.spaceinvader.Main.colision(Main.java:291)
at com.spaceinvader.Main.update(Main.java:190)
at com.spaceinvader.Main.run(Main.java:126)
at java.lang.Thread.run(Unknown Source)
This only happens when not the first bullet on the screen hits but when the others hit a alien.
I used an exeption to let it work but it isnt a sollid fix for errors should not occor regarly.
Its about this code :
private void colision() { if (aliens.size() >= 1 && bulletsPlayer.size() >= 1) { for (int i = 0; i < aliens.size(); i++) { for (int i2 = 0; i2 < bulletsPlayer.size(); i2++) { try { if (aliens.get(i).getBounds().intersects(bulletsPlayer.get(i2).getBounds())) { bulletsPlayer.remove(i2); aliens.remove(i); player.incScore(100 * niveau); shotsHit++; aliensKilled++; } } catch (Exception e) { e.printStackTrace(); } } } } if (bulletsAlien.size() >= 1) { for (int i = 0; i < bulletsAlien.size(); i++) { if (player.getBounds().intersects(bulletsAlien.get(i).getBounds())) { gameOverMenu = true; } } } }
Furter source Code
Main.java
package com.spaceinvader; import com.spaceinvader.render.*; import com.spaceinvader.entity.*; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Canvas; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferStrategy; import java.util.ArrayList; import java.util.Random; public class Main extends Canvas implements Runnable, KeyListener { private static final long serialVersionUID = 1L; static Main main; static Render render; public static JFrame frame; public static JPanel panel; public static Random random; Thread thread; public final static int WIDTH = 400; public final static int HEIGHT = 600; boolean running = false; static String Titel = "Space Invader"; private boolean[] keys = new boolean[65536]; public boolean left, right, use, back; public static boolean pauzeMenu = true; public static boolean gameOverMenu = false; public static boolean waveMenu = false; public static EntityPlayer player; public static ArrayList<EntityBullet> bulletsPlayer; public static ArrayList<EntityBullet> bulletsAlien; public static ArrayList<EntityAlien> aliens; public int bulletTimerPlayer = 0, bulletTimedPlayer = 25; public int bulletTimerAlien = 0, bulletTimedAlien = 20; public int TimerPauze = 0, TimedPauze = 30; public static int niveau = 0; public static int shotsFired = 0; public static int shotsHit = 0; public static int aliensKilled = 0; public static void main(String[] args) { frame = new JFrame(); main = new Main(); panel = new JPanel(); render = new Render(); random = new Random(); frame.add(panel); frame.setResizable(false); frame.setTitle(Titel); panel.add(main); frame.pack(); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); main.start(); } public Main() { Dimension size = new Dimension(WIDTH, HEIGHT); setPreferredSize(size); setMinimumSize(size); setMaximumSize(size); addKeyListener(this); player = new EntityPlayer(); player.setAlive(true); player.setWidth(40); player.setHeight(20); player.setX(WIDTH / 2 - player.getWidth() / 2); player.setY(HEIGHT - 50); player.setVelX(5); bulletsPlayer = new ArrayList<EntityBullet>(); bulletsAlien = new ArrayList<EntityBullet>(); aliens = new ArrayList<EntityAlien>(); } public synchronized void start() { if (running) return; thread = new Thread(this); thread.start(); running = true; } public synchronized void stop() { if (!running) return; running = false; try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } public void run() { int frames; long lastTime = System.nanoTime(); long lastTimer = System.currentTimeMillis(); double ns = 1000000000.0 / 60.0; double delta = 0; frames = 0; int updates = 0; requestFocus(); while (running) { long now = System.nanoTime(); delta += (now - lastTime) / ns; lastTime = now; if (delta >= 1) { update(); updates++; delta--; bulletTimerPlayer++; bulletTimerAlien++; TimerPauze++; } render(); frames++; while (System.currentTimeMillis() - lastTimer > 1000) { lastTimer += 1000; frame.setTitle("Space Invader " + updates + " ups, " + frames + " fps"); frames = 0; updates = 0; } } } private void render() { BufferStrategy bs = getBufferStrategy(); if (bs == null) { createBufferStrategy(3); return; } Graphics g = bs.getDrawGraphics(); render.render(g); g.dispose(); bs.show(); } public void updateKey() { left = keys[KeyEvent.VK_LEFT]; right = keys[KeyEvent.VK_RIGHT]; use = keys[KeyEvent.VK_SPACE] || keys[KeyEvent.VK_ENTER]; back = keys[KeyEvent.VK_ESCAPE]; } public void keyPressed(KeyEvent e) { keys[e.getKeyCode()] = true; } public void keyReleased(KeyEvent e) { keys[e.getKeyCode()] = false; } public void keyTyped(KeyEvent e) { } public void releaseAll() { left = right = use = back = false; } private void update() { if (gameOverMenu) { ResetAll(); } updateKey(); setPauze(); if (!pauzeMenu && !gameOverMenu) { MovementPlayer(); ShootingPlayer(); SpawnAliens(); MovementAliens(); ShootingAliens(); colision(); } } private void ResetAll() { if (TimerPauze >= TimedPauze && back) { aliens.clear(); bulletsAlien.clear(); bulletsPlayer.clear(); player.setX(WIDTH / 2 - player.getWidth() / 2); player.setY(HEIGHT - 50); player.setScore(0); niveau = 0; niveau = 0; shotsFired = 0; shotsHit = 0; aliensKilled = 0; pauzeMenu = true; gameOverMenu = false; TimerPauze = 0; } } private void ResetField(){ aliens.clear(); bulletsAlien.clear(); bulletsPlayer.clear(); } private void setPauze() { if (TimerPauze >= TimedPauze && pauzeMenu && back && !gameOverMenu) { pauzeMenu = false; TimerPauze = 0; } else if (TimerPauze >= TimedPauze && !pauzeMenu && back && !gameOverMenu) { pauzeMenu = true; TimerPauze = 0; } } private void ShootingAliens() { if (bulletTimerAlien >= bulletTimedAlien) { for (int i = 0; i < aliens.size(); i++) { if (random.nextInt(1000 - 20 * niveau) == 0) { bulletsAlien.add(new EntityBullet()); bulletsAlien.get(bulletsAlien.size() - 1).setHeight(10); bulletsAlien.get(bulletsAlien.size() - 1).setWidth(10); bulletsAlien.get(bulletsAlien.size() - 1).setX(aliens.get(i).getX() + aliens.get(i).getHeight() / 2 + bulletsAlien.get(bulletsAlien.size() - 1).getWidth() / 2); bulletsAlien.get(bulletsAlien.size() - 1).setY(aliens.get(i).getY() + bulletsAlien.get(bulletsAlien.size() - 1).getHeight()); bulletsAlien.get(bulletsAlien.size() - 1).setVelY(1.8 + 0.2 * niveau); bulletTimerAlien = 0; } } } if (bulletsAlien.size() >= 1) { for (int i = 0; i < bulletsAlien.size(); i++) { bulletsAlien.get(i).incY(bulletsAlien.get(i).getVelY()); if (bulletsAlien.get(i).getY() > HEIGHT) { bulletsAlien.remove(i); } } } } private void MovementAliens() { if (aliens.size() >= 1) { for (int i = 0; i < aliens.size(); i++) { if (aliens.get(i).getDown() == false && aliens.get(i).getUp() == false && aliens.get(i).getRight() == false && aliens.get(i).getLeft() == false) { aliens.get(i).setRight(true); } if (aliens.get(i).getUp()) { aliens.get(i).incY(-aliens.get(i).getVelY()); } if (aliens.get(i).getDown()) { aliens.get(i).incY(aliens.get(i).getVelY()); } if (aliens.get(i).getRight()) { aliens.get(i).incX(aliens.get(i).getVelX()); } if (aliens.get(i).getLeft()) { aliens.get(i).incX(-aliens.get(i).getVelX()); } if (aliens.get(i).getX() <= 0) { aliens.get(i).setRight(true); aliens.get(i).setLeft(false); aliens.get(i).incY(aliens.get(i).getHeight() * 1.5); } if (aliens.get(i).getX() >= WIDTH - aliens.get(i).getWidth()) { aliens.get(i).setRight(false); aliens.get(i).setLeft(true); aliens.get(i).incY(aliens.get(i).getHeight() * 1.5); } } } } private void colision() { if (aliens.size() >= 1 && bulletsPlayer.size() >= 1) { for (int i = 0; i < aliens.size(); i++) { for (int i2 = 0; i2 < bulletsPlayer.size(); i2++) { try { if (aliens.get(i).getBounds().intersects(bulletsPlayer.get(i2).getBounds())) { bulletsPlayer.remove(i2); aliens.remove(i); player.incScore(100 * niveau); shotsHit++; aliensKilled++; } } catch (Exception e) { e.printStackTrace(); } } } } if (bulletsAlien.size() >= 1) { for (int i = 0; i < bulletsAlien.size(); i++) { if (player.getBounds().intersects(bulletsAlien.get(i).getBounds())) { gameOverMenu = true; } } } } private void SpawnAliens() { int ALIENSWIDTH = 7; int ALIENSHEIGHT = 4; if (aliens.size() == 0 && !waveMenu) { waveMenu = true; niveau++; } if (waveMenu && use) { ResetField(); waveMenu = false; bulletTimerPlayer = 0; for (int i = 0; i < ALIENSWIDTH; i++) { for (int i2 = 0; i2 < ALIENSHEIGHT; i2++) { aliens.add(new EntityAlien()); aliens.get(aliens.size() - 1).setHeight(15); aliens.get(aliens.size() - 1).setWidth(15); aliens.get(aliens.size() - 1).setX(i * 50 + 50); aliens.get(aliens.size() - 1).setY(i2 * 45); aliens.get(aliens.size() - 1).setVelX(0.5 + 0.2 * niveau); aliens.get(aliens.size() - 1).setVelY(0.5 + 0.2 * niveau); aliens.get(aliens.size() - 1).setDown(false); aliens.get(aliens.size() - 1).setUp(false); aliens.get(aliens.size() - 1).setLeft(false); aliens.get(aliens.size() - 1).setRight(false); } } } } private void ShootingPlayer() { if (bulletTimerPlayer >= bulletTimedPlayer) { if (use && !waveMenu) { if (!(player.getScore() == 0)) { player.incScore(-10); } bulletTimerPlayer = 0; bulletsPlayer.add(new EntityBullet()); bulletsPlayer.get(bulletsPlayer.size() - 1).setHeight(10); bulletsPlayer.get(bulletsPlayer.size() - 1).setWidth(10); bulletsPlayer.get(bulletsPlayer.size() - 1).setX(player.getX() + player.getHeight() / 2 + bulletsPlayer.get(bulletsPlayer.size() - 1).getWidth() / 2); bulletsPlayer.get(bulletsPlayer.size() - 1).setY(player.getY() - bulletsPlayer.get(bulletsPlayer.size() - 1).getHeight()); bulletsPlayer.get(bulletsPlayer.size() - 1).setVelY(6.0); shotsFired++; } } if (bulletsPlayer.size() > 0) { for (int i = 0; i < bulletsPlayer.size(); i++) { bulletsPlayer.get(i).incY(-bulletsPlayer.get(i).getVelY()); } for (int i = 0; i < bulletsPlayer.size(); i++) { if (bulletsPlayer.get(i).getY() < 0) { bulletsPlayer.remove(i); } } } } private void MovementPlayer() { if (left && player.getX() > 0) { player.incX(-player.getVelX()); } if (right && player.getX() + player.getWidth() < WIDTH) { player.incX(player.getVelX()); } } }
SpaceInvaderApplet.java
package com.spaceinvader; import java.applet.Applet; import java.awt.BorderLayout; import java.util.Random; import javax.swing.JPanel; import com.spaceinvader.render.Render; public class SpaceInvaderApplet extends Applet { private static final long serialVersionUID = 1L; private Main main = new Main(); private JPanel panel; public void init() { panel = new JPanel(); Main.render = new Render(); Main.random = new Random(); setLayout(new BorderLayout()); add(panel); panel.add(main); setSize(Main.WIDTH, Main.HEIGHT); } public void start() { main.start(); } public void stop() { main.stop(); } }
BaseEntity.java
package com.spaceinvader.entity; public class BaseEntity { private double x, y; private double height, width; private double velX, velY; private boolean alive; //accessor public boolean getAlive(){return alive;} public double getX(){ return x;} public double getY(){ return y;} public double getHeight(){return height;} public double getWidth(){return width;} public double getVelX(){return velX;} public double getVelY(){return velY;} //mutators public void setAlive(boolean alive){this.alive = alive;} public void setX(double x){this.x = x;} public void setY(double y){this.y = y;} public void incX(double i){this.x += i;} public void incY(double d){this.y += d;} public void setHeight(double height){this.height = height;} public void setWidth(double width){this.width = width;} public void incHeight(double i){this.height += i;} public void incWidth(double i){this.width += i;} public void setVelX(double velX){this.velX = velX;} public void setVelY(double velY){this.velY = velY;} BaseEntity(){ setAlive(false); setX(0); setY(0); setWidth(0); setHeight(0); } }
EntityAlien.java
package com.spaceinvader.entity; import java.awt.Rectangle; public class EntityAlien extends BaseEntity { boolean right,left, up, down; public Rectangle getBounds() { Rectangle r; r = new Rectangle((int) getX(), (int) getY(), (int) getWidth(), (int) getHeight()); return r; } public EntityAlien() { setAlive(true); } //accessor public boolean getRight(){return right;} public boolean getLeft(){return left;} public boolean getUp(){return up;} public boolean getDown(){return down;} //mutator public void setRight(boolean right){this.right = right;} public void setLeft(boolean left){this.left = left;} public void setUp(boolean up){this.up = up;} public void setDown(boolean down){this.down = down;} }
EntityBullet.java
EntityPlayer
package com.spaceinvader.entity; import java.awt.Rectangle; public class EntityPlayer extends BaseEntity { public int score; public Rectangle getBounds() { Rectangle r; r = new Rectangle((int) getX(), (int) getY(), (int) getWidth(), (int) getHeight()); return r; } public EntityPlayer() { setAlive(true); } //accessor public int getScore(){return score;} //mutator public void setScore(int score){this.score = score;} public void incScore(int i){this.score += i;} }
Render.java
package com.spaceinvader.render; import com.spaceinvader.Main; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; public class Render { Main main; Font font = new Font("Arial", Font.BOLD, 10); Font fontPauzeBig = new Font("Arial", Font.BOLD, 30); Font fontPauze = new Font("Arial", Font.BOLD, 15); public Render() { main = new Main(); } public void render(Graphics g) { g.setColor(Color.black); g.fillRect(0, 0, Main.WIDTH, Main.HEIGHT); if (!Main.pauzeMenu || Main.gameOverMenu) { if (!Main.waveMenu) { g.setColor(Color.red); g.fillRect((int) Main.player.getX(), (int) Main.player.getY(), (int) Main.player.getWidth(), (int) Main.player.getHeight()); if (Main.bulletsPlayer.size() > 0) { for (int i = 0; i < Main.bulletsPlayer.size(); i++) { g.setColor(Color.blue); g.fillRect((int) Main.bulletsPlayer.get(i).getX(), (int) Main.bulletsPlayer.get(i).getY(), (int) Main.bulletsPlayer.get(i).getWidth(), (int) Main.bulletsPlayer.get(i).getHeight()); } } if (Main.bulletsAlien.size() > 0) { for (int i = 0; i < Main.bulletsAlien.size(); i++) { g.setColor(Color.yellow); g.fillRect((int) Main.bulletsAlien.get(i).getX(), (int) Main.bulletsAlien.get(i).getY(), (int) Main.bulletsAlien.get(i).getWidth(), (int) Main.bulletsAlien.get(i).getHeight()); } } if (Main.aliens.size() > 0) { for (int i = 0; i < Main.aliens.size(); i++) { g.setColor(Color.green); g.fillRect((int) Main.aliens.get(i).getX(), (int) Main.aliens.get(i).getY(), (int) Main.aliens.get(i).getWidth(), (int) Main.aliens.get(i).getHeight()); } } g.setColor(Color.green); g.setFont(font); g.drawString("Level: " + Main.niveau, 0, 10); g.drawString("Score: " + Main.player.getScore(), 0, 20); g.drawString("Shots fired: " + Main.shotsFired, 0, 30); g.drawString("Shots hit: " + Main.shotsHit, 0, 40); g.drawString("Aliens killed: " + Main.aliensKilled, 0, 50); if (Main.gameOverMenu) { g.setFont(fontPauzeBig); g.drawString("GAME OVER", Main.WIDTH / 2 - 100, Main.HEIGHT / 2 - 30); g.setFont(fontPauze); g.drawString("Score : " + Main.player.getScore(), Main.WIDTH / 2 - 95, Main.HEIGHT / 2); g.drawString("Press escape to go back", Main.WIDTH / 2 - 95, Main.HEIGHT / 2 + 30); } } else { g.setColor(Color.green); g.setFont(fontPauzeBig); g.drawString("Wave " + Main.niveau, Main.WIDTH / 2 - 50, Main.HEIGHT / 2); g.setFont(fontPauze); g.drawString("Press spacebar to start ", Main.WIDTH / 2 - 80, Main.HEIGHT / 2 + 30); } } if (Main.pauzeMenu && !Main.gameOverMenu) { g.setColor(Color.green); g.setFont(fontPauzeBig); g.drawString("press escape", Main.WIDTH / 2 - 100, Main.HEIGHT / 2 - 150); g.drawString("to start/continue", Main.WIDTH / 2 - 120, Main.HEIGHT / 2 + 40 - 150); g.setFont(fontPauze); g.drawString("Controls", Main.WIDTH / 2 - 120, Main.HEIGHT / 2 + 30); g.drawString("-Right/Left arrow keys to move", Main.WIDTH / 2 - 120, Main.HEIGHT / 2 + 45); g.drawString("-Spacebar to shoot", Main.WIDTH / 2 - 120, Main.HEIGHT / 2 + 60); g.drawString("-Escape to pause", Main.WIDTH / 2 - 120, Main.HEIGHT / 2 + 75); } } }