Quantcast
Channel: Library Questions - Processing 2.x and 3.x Forum
Viewing all articles
Browse latest Browse all 2896

IndexOutOfBounds exception?

$
0
0

Hi all,

I have been working on this game as part of a small piece of coursework for my course, however I have run into a problem. When the game is run, I get an Index out of Bounds Exception, but the exception is not always the same. It could be 11, 15, 4, 7, anything. Any ideas??? This is my code... Main Code

import ddf.minim.*;

//Declare audio
Minim minim;
AudioSample projectilesound;
AudioSample explosion;
AudioPlayer bgmusic;
AudioPlayer menumusic;

//Delcar classes
Player player;
Background background;
Projectile projectile;
Paused paused;
startMenu menu;
Asteroids asteroids;
gameOver gameover;

//Arrays
ArrayList shots ; //where the shots are stored
ArrayList asteroid;

//Boolean controllers
boolean mouseClick = false; //prevent menu clicking
boolean canPause = false; //prevent menu pausing
boolean asteroidStart = false;//prevent asteroids from running on menu


float[] x = new float[1000]; //x values for stars
float[] y = new float[1000]; //y values for stars
float[] speed = new float [1000]; //speed for stars

int time;
int lives = 1;

PImage imnorm3;
PImage imtitle;

int getRandomY()
{
  return int(random(264, 934));
}


int[] asteroidy = { getRandomY(), getRandomY(), getRandomY(), getRandomY(), getRandomY(),
  getRandomY(), getRandomY(), getRandomY(), getRandomY(), getRandomY() };
int[] asteroidx = { 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600 };

void setup() {
  size(1600, 1200, P2D);
  smooth();
  background(0);
  stroke(255);
  frameRate(60);

  //Initialize Audio
  minim = new Minim(this);
  bgmusic = minim.loadFile("bgmusic.mp3", 2048);
  menumusic = minim.loadFile("menumusic.mp3", 2048);
  projectilesound = minim.loadSample("projectilesound.wav", 2048);
  explosion = minim.loadSample("Explosion.wav", 2048);

  //Arrays
  shots = new ArrayList();
  asteroid = new ArrayList();


  //Initialize Classes
  imnorm3 = loadImage("asteroids.png");
  imtitle = loadImage("AsteroidDefender.png");
  player = new Player(0, 600);
  background = new Background();
  menu = new startMenu();
  paused = new Paused();
  gameover = new gameOver();

  //While loop to create stars
  int i = 0;
  while (i < 1000) {
    x[i] = random(0, width);
    y[i] = random(205, 995);
    speed[i] = random(1, 5);
    i = i + 1;
  }
}
void draw() {
  rect(0, 200, width, 800);
  background.display();
  menu.menuRun();
  fill(0, 75);
  noStroke();
  fill(255);
  stroke(200);
  line(0, 200, width, 200);
  line(0, 1000, width, 1000);
  strokeWeight(3);
  player.run();
  textSize(28);
  image(imtitle, 600, 10);
  text("Score: " + player.score, 32, 1050);
  text("Lives: " + lives, 32, 1100);
  if (asteroidStart == true) {
    spawn();
    move();
    display();
    collision();
    movePJ();
    displayPJ();
    time++;
    lose();
  }
  if (gameover.isOver == true) {
    gameover.run();
  }
}

//Starts the game
void keyPressed() {
  if (key == ENTER) {
    noCursor();
    mouseClick = true;
    canPause = true;
    menu.runMenu = false;
    player.runPlayer = true;
    asteroidStart = true;
    menumusic.pause();
    bgmusic.setGain(-10);
    bgmusic.loop();

    //Pauses the game
  }
  if (key == 'p') {
    if (canPause == true) {
      paused.ispaused = true;
      player.runPlayer = false;
      paused.run();
    }
  }
  //Mutes the music
  if (key == 'm') {
    bgmusic.mute();
  }
  //Unmutes the music
  if (key == 'u') {
    bgmusic.unmute();
  }
}
//Populates the array "shots" with new objects modelled after the "Projectile" class
void mousePressed() {
  if (mouseClick == true) {
    Projectile pj = new Projectile(player.x, (player.y1+16));
    shots.add(pj);
    pj = null;
    projectilesound.trigger();
  }
}
//Calls the shot() method from the class for every projectile
void movePJ() {
  for (int i = 0; i < shots.size(); i ++) {
    Projectile pj = (Projectile)shots.get(i);
    pj.shot();
    pj = null;
  }
}
//Calls the display() method from the class for every projectile
void displayPJ() {
  for (int i = 0; i < shots.size(); i++) {
    Projectile pj = (Projectile)shots.get(i);
    pj.display();
    pj = null;
  }
}
//Asteroid Class
public class Asteroids {
  //GLOBAL VARIABLES
  float a = 0;
  float x;
  float y;
  PImage imnorm3;


  //CONSTRUCTOR
  Asteroids( float ax, float ay) {
    x = ax;
    y = ay;
    imnorm3 = loadImage("asteroids.png");
  }
  void display() {
    image(imnorm3, x, y);
  }
  void move() {
    x -=5;
  }
}
void spawn() {
  if (time == 30) { // Delays asteroid spawn

    time = 0;
    Asteroids at = new Asteroids(2500, int(random(200, 950)));
    asteroid.add(at);
    at = null;
  }
}
void move() {
  for (int i = 0; i < asteroid.size(); i++) {
    Asteroids at = (Asteroids)asteroid.get(i);
    at.move();
  }
}
void display() {
  for (int i = 0; i < asteroid.size(); i ++) {
    Asteroids at = (Asteroids)asteroid.get(i);
    at.display();
    at = null;
  }
}
//Detects collision between asteroid and projectile
void collision() {
  for (int i = 0; i < asteroid.size(); i++) {
    for (int j = 0; j < shots.size(); j++) {
      Projectile pj = (Projectile)shots.get(j);
      Asteroids at = (Asteroids)asteroid.get(i);
      if (pj.x < at.x - 16 && pj.y > at.y -16 && pj.y <= at.y + 16) {
        asteroid.remove(i);
        shots.remove(j);
        explosion.trigger();
        player.score += 1 ;
      }
    }
  }
}
void lose() {
  for (int i = 0; i < asteroid.size(); i++) {
    Asteroids at = (Asteroids)asteroid.get(i);
    if (at.x < 0) {
      lives = 0;
      gameover.isOver = true;
    }
  }
}

Gameover Class

public class gameOver {
  //GLOBAL VARIABLES
  boolean isOver = false;

  //CONSTRUCTOR


  //FUNCTIONS
  void run() {
    if (isOver == true) {
      if (lives == 0) {

        mouseClick = false;
        canPause = false;
        player.runPlayer = false;
        asteroidStart = false;
        bgmusic.pause();
        menumusic.play();
        stroke(0);
        textSize(48);
        text("GAME OVER", 600, 600);
        text("Your Score: " + player.score,600,650);
        text("Please exit game", 600, 700);
      }
    }
  }
}

**Startmenu - I know there is an issue with this displaying but I'm not worried about that at the moment.**

public class startMenu {
  //GLOBAL VARIABLES
  boolean runMenu = true;


  //CONSTRUCTORS



  //FUNCTIONS
  void menuRun() {
    if (runMenu == true) {
      stroke(0);
      textSize(48);
      text("WELCOME TO ASTEROID DEFENDER", 400, 600);
      text("Press Enter to start", 600, 700);
      text("Click to shoot. Use W and S to move up and down.", 250, 800);
      menumusic.play();
    }
  }
}

Paused

class Paused {
  //GLOBAL VARIABLES
  boolean ispaused = false;

  //CONSTRUCTOR (N/A)



  //FUNCTIONS
  void run() {
    if (ispaused == true) {
      bgmusic.pause();
      textdisplay();
    }
  }
  void textdisplay() {
    text(":::PAUSED:::", 800, 600);
  }
}

Player

public class Player {
  //GLOBAL VARIABLES
  boolean runPlayer = false;
  int x = 0;
  int y = 0;
  float y1 = 600;
  float yspeed = 10;
  PImage imnorm2;
  PImage imnorm4;
  int score;


  //CONSTRUSCTOR
  Player(int _x, int _y) {
    x = _x;
    y = _y;

    imnorm2 = loadImage("playership.png");
    imnorm4 = loadImage("playershipvert.png");
  }



  //FUNCTIONS
  void run() {
    if (runPlayer == true) {
      aim();
      display();
    }
  }
  void aim() {
    if (key == 's') {
      if (keyPressed) {
        y1 = y1 + yspeed;
      }
    }
    if (key == 'w') {
      if (keyPressed) {
        y1 = y1 - yspeed;
      }
    }
    if (y1 <=200) {
      y1 = 205;
    }
    if (y1 >= 931) {
      y1 = 931;
    }
  }
  void display() {
    image(imnorm2, x, y1);
  }
}

Projectile

public class Projectile {
  //GLOBAL VARIABLES
  boolean isRunning = false;
  float x;
  float y;
  float xspeed;
  PImage imnorm1;

  //CONSTRUCTOR
  Projectile(float _x, float _y) {
    x = _x;
    y = _y;
    imnorm1 = loadImage("playerprojectile.png");
  }
  //FUNCTIONS
  void run() {
    shot();
    display();
  }
  void display() {
    image(imnorm1, x, y);
  }
  void shot() {
    x += 10;
  }
}

background

public class Background {
  //GLOBAL VARIABLES

  //CONSTRUCTOR



  //FUNCTIONS
  void display() {
    background(0);
    strokeWeight(random(1, 5));
    int i = 0;
    while (i<1000) {
      float co = map(speed[i], 1, 5, 80, 255);
      stroke(co);
      strokeWeight(speed[i]);
      point(x[i], y[i]);

      x[i] = x[i] - speed[i];
      if (x[i] < 0) {
        x[i] = width;
      }
      i = i +1;
    }
  }
}

Viewing all articles
Browse latest Browse all 2896

Trending Articles