Skip to content
Advertisement

Space Invader project

Hi I have been working on a space invader game in processing, I am relatively new to java/coding. What my problem is that I do not really understand how to make the collision actually work, and also my aliens (which are the space ships), they move left to right but do not move down. These are the 2 major problems that I am having a hard time solving. This is my code underneath, any professional advice would be appreciated.

PImage SpaceShip;
PImage Laser;
int TankX = 450;
int TankY = 450;
int SpaceshipX = 20;
int SpaceshipY = 20;
int MoveSpaceShipDown = 5;
int TankSizeX = 200;
int TankSizeY = 90;
int ShipSizeX = 90;
int ShipSizeY = 80;
int Xtankspeed = 2;
int LaserX = 9999;
int LaserY = TankY;
int LasersizeX = 10;
int LasersizeY = 40;
int spaceShipDirection =  5;
int spaceshipxspeed = 2;
int spaceshipSpeed = 5;
//int Xtankspeed2 = -6;
boolean moveRight = false;
boolean moveLeft = false;
boolean ShowLaser = false;
int[] ShipX = new int [15];
int [] ShipY = new int [4];
int gameState = 1;
int StopWatch = 0;


void setup() {
  size(1000, 500);
  imageMode(CENTER);
  SpaceShip = loadImage("Spaceship.png");
  SpaceShip.resize( ShipSizeX, ShipSizeY );
  Laser = loadImage ("LaserBeam.png");
  Laser.resize(LasersizeX, LasersizeY);
  Tank = loadImage("Tank.png");
  Tank.resize(TankSizeX, TankSizeY);
  setSpaceShipPositions();
}

void setSpaceShipPositions() {


for(int j = 0; j < ShipY.length; j++){
  for (int i = 0; i < ShipX.length; i++) {
    ShipX[i] = 50 + 50*i;
  }
  ShipY[j] = 50 + 50*j;
}
}


void draw() {
  if (gameState == 1) {
    IntroScreen();
  } else if (gameState == 2) {
    startGame();
  }
}
void IntroScreen() {
  background(#000000);
  textMode(CENTER);
  textSize(50);
  text("Space Defenders", 325, 250);
}
void startGame() {
  background (#2f3069);
  MakeLaser();
  Maketank();
  Maketankmove();
  checkiftankhitedge();
 
  for (int j = 0; j < ShipY.length; j++) {
  for (int i = 0; i < ShipX.length; i++) {
    MakeSpaceShip(i,j);
    moveSpaceShip();
    checkiflaserhitspaceship(i,j);
  }
  }

  Shootlaser();
  Makelaserreturentoorignalposition();
  
  //makespaceshipgodown();
}



void keyPressed() {
  println(keyCode);
  if (keyCode == 39) { //right key
    moveRight = true;
  }
  if (keyCode == 37) { //leftkey
    moveLeft = true;
  }
  if (keyCode == 32 && ShowLaser == false) { //Spacebar
    ShowLaser = true;
    LaserX = TankX;
    LaserY = TankY;
  }
  if (keyCode == 10) {
    gameState = 2;
  }
}


void keyReleased() {

  if (keyCode == 39) { //right key
    moveRight = false;
  }
  if (keyCode == 37) { //leftkey
    moveLeft = false;
  }
  if (keyCode == 32) { //Spacebar
  }
}

void Maketank() {// this is to make the tank
  //PImage.resize(0,5);

  imageMode(CENTER);
  image(Tank, TankX, TankY);
}
void MakeLaser() {
  if (ShowLaser) {
    image(Laser, LaserX, LaserY);
  }
}
void MakeSpaceShip(int i, int j) {
  image(SpaceShip, ShipX[i], ShipY[j]);
  //for (int i = 0; i < spaceShipX.length; i++){
  // image( spaceShipX[i] - 15, ,SpaceshipX, SpaceshipY ); Confused
}

int lastlaptime = 0;
int timesincelastlap = 0;


//void moveSpaceShip(int i, int j) {

/*StopWatch = millis();
 timesincelastlap = StopWatch - lastlaptime;
 
 if (timesincelastlap > 500) {
 
 spaceShipX[i] += spaceshipxspeed;
 lastlaptime = millis();
 
 
 // if (spaceShipX[i] > 990) {
 // SpaceshipY = SpaceshipY + 30;
 //spaceShipDirection = -1*spaceShipDirection;
 
 // }
 //if (spaceShipX[i] < 10) {
 // SpaceshipY = SpaceshipY + 30;
 //spaceShipDirection = -1*spaceShipDirection;
 //}
 //}
 }*/

void moveSpaceShip() {
  /*for (int i = 0; i < 15; i++){
   if (spaceShipX[40] > 990){
   spaceShipDirection = -1*spaceShipDirection;
   SpaceshipY = SpaceshipY + 30;
   }
   if (spaceShipX[1] < 10){
   spaceShipDirection = -1*spaceShipDirection;
   SpaceshipY = SpaceshipY + 30;
   }
   }
   for (int i = 0; i < 15; i++){
   spaceShipX[i] = spaceShipX[i] + spaceShipDirection;
   }*/
  if (millis() - StopWatch > 1000) {
    StopWatch = millis();
    checkIfHitEdge();
    moveShips();
  }
}

void moveShips() {
  for (int i = 0; i < 15; i++) {
    ShipX[i] = ShipX[i] + spaceShipDirection*spaceshipSpeed;
  }
}
void checkIfHitEdge() {
  for (int i = 0; i < 15; i++) {
    if (ShipX[14] > 990) {
       SpaceshipY = SpaceshipY + 5;
      spaceShipDirection = -1*spaceShipDirection;
     
    }
  
    if (ShipX[0] < 10) {
      spaceShipDirection = -1*spaceShipDirection;
      SpaceshipY = SpaceshipY + 5;
    }
  }
  
}

//void makespaceshipgodown(){
// if(SpaceshipX + 45 > width){
//SpaceshipY++;
// }
//}
void Maketankmove() {
  if (moveLeft == true) {
    TankX--; //this makes the tank go left
    TankX = TankX - Xtankspeed;//this is for the speed of the tank
  }
  if (moveRight == true) {
    TankX++;//this makes the tank go right
    TankX = TankX + Xtankspeed;//the speed of the tank
  }
}
void checkiftankhitedge() {
  if (TankX > width-50) {
    TankX = 950;
    moveRight = false;
  }
  if (TankX-100 < -50) {
    TankX = 50;
    moveLeft = false;
  }
}
void Makelaserreturentoorignalposition() {
  //if(TankX++){
  if (LaserY == 0) {
    LaserY = TankY;
    LaserX = 9999;
    ShowLaser = false;
  }
}
void checkiflaserhitspaceship(int i, int j) {
 /* int Lasertop = LasersizeY - 20;
  int Laserbottom = LasersizeY + 20;
  int LaserLeft= LasersizeX - 5;
 int LaserRight = LasersizeX +5;
  int SpaceShipBottom = ShipY[j] - 40;
  int SpaceShipTop = ShipY[j] + 40;
   int SpaceShipleft = spaceShipX[i] - 45;
   int SpaceShipright = spaceShipX[i] + 45;
  boolean LaserhitSpaceship = Lasertop > SpaceShipBottom &&
  Laserbottom < SpaceShipTop &&
   LaserLeft < SpaceShipright &&
  LaserRight > SpaceShipleft;
  if(LaserhitSpaceship == true){
  spaceShipX[0] = 90000;
  }*/
}
void Shootlaser() {
  if (ShowLaser == true) {
    LaserY-=5;
  }
}```

Advertisement

Answer

Here is what I think the issues are. First of all, processing is not the best language to make a game like Space Invaders. You can’t have multiple key inputs at once. For example, if I press the left arrow, hold it, then press the right arrow, and let go of the left arrow, processing will ignore the left arrow. Processing has one key input: key. It can only have one value. You can’t track multiple inputs at once. You can maybe replace it with your mouse – if the mouse is far to the left, move left. If it is far to the right, move right. In the middle? Stay still.

Aside from that, you want to check for collision. First of all, make the enemy into an object. I am assuming you know how to make objects. If not, look at this tutorial. Now, we need to check for collision. I’d suggest making a collision method inside of the enemy class, and here is what i’d imagine it to be:

boolean collidingWithPlayer() {
    return (playerX > enemyX && playerX < enemyX + enemyW
    && playerY > enemyY && playerY < enemyY + enemyH);
}

Use this as you will. Good luck with your game.

Advertisement