Пример #1
0
int main()
{
  Invader invaders[ROWS][COLS];
  Defender player;
  Bullet playerBullet;
  Ship spaceShip;
  Bullet invaderBullet[bulletNumber];
  Shelter shelter[shelterNumber];

  initializeInvaders(invaders);

  //Initialise playerBullet and initial invader bullet firing setting
  playerBullet.fire=0;
  playerBullet.invaderCount=0;
  playerBullet.score=0;
  playerBullet.lives=3;
  playerBullet.bulletHitPlayer=0;
  for(int i=0; i<bulletNumber; ++i)
  {
    invaderBullet[i].fire=1;
    invaderBullet[i].active=1;
  }


  // initialise SDL and check that it worked otherwise exit
  // see here for details http://wiki.libsdl.org/CategoryAPI
  if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
  {
    printf("%s\n",SDL_GetError());
    return EXIT_FAILURE;
  }
  // we are now going to create an SDL window

  SDL_Window *win = 0;
  win = SDL_CreateWindow("Invaders", 100, 100, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
  if (win == 0)
  {
    printf("%s\n",SDL_GetError());
    return EXIT_FAILURE;
  }

  // the renderer is the core element we need to draw, each call to SDL for drawing will need the
  // renderer pointer
  SDL_Renderer *ren = 0;
  ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  // check to see if this worked
  if (ren == 0)
  {
    printf("%s\n",SDL_GetError() );
    return EXIT_FAILURE;
  }
  // this will set the background colour to white.
  // however we will overdraw all of this so only for reference
  SDL_SetRenderDrawColor(ren, 255, 255, 255, 255);

//  // SDL image is an abstraction for all images
  SDL_Surface *image;
//  // we are going to use the extension SDL_image library to load a png, documentation can be found here
//  // http://www.libsdl.org/projects/SDL_image/
  image=IMG_Load("invaders.png");
  if(!image)
  {
    printf("IMG_Load: %s\n", IMG_GetError());
    return EXIT_FAILURE;
  }
//  // SDL texture converts the image to a texture suitable for SDL rendering  / blitting
//  // once we have the texture it will be store in hardware and we don't need the image data anymore

  SDL_Texture *tex = 0;
  tex = SDL_CreateTextureFromSurface(ren, image);
  // free the image
  SDL_FreeSurface(image);

  // Initialise player
  player.move = NONE;
  player.pos.x = WIDTH/2;
  player.pos.y = HEIGHT - 30;
  player.pos.w = DEFENDERSIZE;
  player.pos.h = DEFENDERSIZE/2;

  player.srcDefender.w=188;
  player.srcDefender.h=105;
  player.srcDefender.x=0;
  player.srcDefender.y=0;

  // Initialise player bullet
  playerBullet.pos.x = (WIDTH/2)+(DEFENDERSIZE/2);
  playerBullet.pos.y = HEIGHT - 50;
  playerBullet.pos.w = 2;
  playerBullet.pos.h = 15;

  playerBullet.srcBullet.w=bulletWidth;
  playerBullet.srcBullet.h=250;
  playerBullet.srcBullet.x=0;
  playerBullet.srcBullet.y=0;

  // Initialise invader bullet
  for(int i=0; i<bulletNumber; ++i)
  {
    //a random column is chosen, it then goes through the invaders one by one starting with the bottom one
    //if the invader is active then it will shoot and break the loop
    //otherwise it will go to the next invader up until it finds the top
    //so only the bottom invader for each column is firing
    int x = 0;
    int y = rand()%(COLS-2);
    y +=2;
    for(int j=ROWS-1; j>=0; j--)
    {
      if(invaders[j][y].active==1)
      {
        invaders[j][y].shooting=1;
        x=j;
        break;
      }
    }

    //if the invader rnadomly chosen is active then the bullet is placed at it's x and y coordinates and fired
    if(invaders[x][y].shooting==1)
    {
      invaderBullet[i].pos.y=invaders[x][y].pos.y;
      invaderBullet[i].pos.x=((SPRITEWIDTH/2)-(5))+invaders[x][y].pos.x;
    }
    else if(invaders[x][y].shooting==0)
    {
      invaderBullet[i].fire=0;
    }

    invaderBullet[i].pos.w = 10;
    invaderBullet[i].pos.h = 20;

    invaderBullet[i].srcBullet.w=24;
    invaderBullet[i].srcBullet.h=56;
    invaderBullet[i].srcBullet.x=0;
    invaderBullet[i].srcBullet.y=0;
  }

  //randomise spaceship start direction
  //will end up either appearing from the right or the left
  //if its from the left the shipDelay has to be minus so the image is off screen and the opposite for the right
  srand(time(NULL));
  spaceShip.randomDir = rand()%2;
  int x;
  if (spaceShip.randomDir==0)
  {
    x=-shipDelay;
  }
  else if (spaceShip.randomDir==1)
  {
    x=shipDelay;
  }

  //initialise shelter
  for(int j=0; j<shelterNumber; j++)
  {
    shelter[j].pos.y=500;
    shelter[j].pos.x=(j*200)+50;
    shelter[j].pos.w=75;
    shelter[j].pos.h=25;

    shelter[j].srcShelter.y=0;
    shelter[j].srcShelter.w=shelterWidth;
    shelter[j].srcShelter.h=shelterHeight;
  }

  //initialise space ship
  spaceShip.pos.x=(spaceShip.randomDir*(WIDTH-spaceShipWidth)+x);
  spaceShip.pos.y=20;
  spaceShip.pos.w=spaceShipWidth;
  spaceShip.pos.h=25;

  spaceShip.srcShip.x=0;
  spaceShip.srcShip.y=204;
  spaceShip.srcShip.w=196;
  spaceShip.srcShip.h=88;

  int quit=0;
  // now we are going to loop forever, process the keys then draw

  //loading in the Defender spritesheet
  SDL_Surface *imageDefender;
  imageDefender=IMG_Load("Defender.png");
  if(!imageDefender)
  {
    printf("IMG_Load: %s\n", IMG_GetError());
    return EXIT_FAILURE;
  }
  SDL_Texture *texDefender = 0;
  texDefender = SDL_CreateTextureFromSurface(ren, imageDefender);
  SDL_FreeSurface(imageDefender);

  //loading in the enemy fire spritesheet
  SDL_Surface *imageenemyFire;
  imageenemyFire=IMG_Load("EnemyShot1.png");
  if(!imageenemyFire)
  {
    printf("IMG_Load: %s\n", IMG_GetError());
    return EXIT_FAILURE;
  }
  SDL_Texture *texEnemyFire = 0;
  texEnemyFire = SDL_CreateTextureFromSurface(ren, imageenemyFire);
  SDL_FreeSurface(imageenemyFire);

  //loading in the Shelter spritesheet
  SDL_Surface *imageShelter;
  imageShelter=IMG_Load("bunker.png");
  if(!imageShelter)
  {
    printf("IMG_Load: %s\n", IMG_GetError());
    return EXIT_FAILURE;
  }
  SDL_Texture *texShelter = 0;
  texShelter = SDL_CreateTextureFromSurface(ren, imageShelter);
  SDL_FreeSurface(imageShelter);

  //loading in the laser spritesheet
  SDL_Surface *imageBullet;
  imageBullet=IMG_Load("laser.png");
  if(!imageBullet)
  {
    printf("IMG_Load: %s\n", IMG_GetError());
    return EXIT_FAILURE;
  }
  SDL_Texture *texBullet = 0;
  texBullet = SDL_CreateTextureFromSurface(ren, imageBullet);
  SDL_FreeSurface(imageBullet);

  while (quit !=1)
  {
    SDL_Event event;
    // grab the SDL even (this will be keys etc)
    while (SDL_PollEvent(&event))
    {
      player.move=NONE;
      playerBullet.start=NONE;
      // look for the x of the window being clicked and exit
      if (event.type == SDL_QUIT)
        quit = 1;
      // check for a key down
      if (event.type == SDL_KEYDOWN)
      {
        switch (event.key.keysym.sym)
        {
          // if we have an escape quit
          case SDLK_ESCAPE :
          {
            quit=1;
            break;
          }
          //if we have a right key then the defender moves right along with the bullet before its fired
          case SDLK_RIGHT :
          case SDLK_d :
          {
            player.move=RIGHT;
            playerBullet.start=RIGHT;
            break;
          }
          //if we have a left key then the defender moves left along with the bullet before its fired
          case SDLK_LEFT :
          case SDLK_a :
          {
            player.move=LEFT;
            playerBullet.start=LEFT;
            break;
          }
          //if we have a space key then the player bullet is fired
          case SDLK_SPACE :
          {
            playerBullet.fire=1;
            break;
          }
        }
      }
    }


    // now we clear the screen (will use the clear colour set previously)
    SDL_SetRenderDrawColor(ren, 0, 0, 0, 255);
    SDL_RenderClear(ren);

    updateInvaders(invaders);
    drawInvaders(ren,tex,invaders);
    // Up until now everything was drawn behind the scenes.
    // This will show the new, red contents of the window.

    moveDefender(ren, texDefender, &player);
    playerFire(ren, texBullet, &playerBullet, &player, shelter);
    invaderFire(ren, texEnemyFire, shelter, invaderBullet, &playerBullet, &player);
    invaderHit(&playerBullet, invaders);
    drawSpaceShip(ren, tex, &spaceShip);
    spaceShipHit(&playerBullet, &spaceShip);
    invaderReachBottom(&player,invaders, &playerBullet);
    drawShelter(ren, texShelter, shelter);

    SDL_RenderPresent(ren);

    //if the player is hit or the bullet has gone offscreen, or has hit the shelter then
    //the random position for the next invader is chosen
    for(int i=0; i<bulletNumber; ++i)
    {
      if((invaderBullet[i].bulletHitPlayer==1)||
         (invaderBullet[i].bulletOffScreen==1)||
         (invaderBullet[i].bulletHitShelter==1))
      {
        //a random column is chosen, it then goes through the invaders one by one starting with the bottom one
        //if the invader is active then it will shoot and break the loop
        //otherwise it will go to the next invader up until it finds the top
        //so only the bottom invader for each column is firing
        int x = 0;
        int y = rand()%COLS;
        for(int j=ROWS-1; j>=0; j--)
        {

          invaders[j][y].shooting=0;
          if(invaders[j][y].active==1)
          {
            invaders[j][y].shooting=1;
            x=j;
            break;
          }
        }

        //only if the invader is active and is the bottom of it's column will the shooting value be set to 1
        //then the bullet is placed at the coordinates of the random invader chosen
        if(invaders[x][y].shooting==1)
        {
          invaderBullet[i].pos.y=invaders[x][y].pos.y;
          invaderBullet[i].pos.x=((SPRITEWIDTH/2)-(5))+invaders[x][y].pos.x;
          invaderBullet[i].active=1;
          invaderBullet[i].fire=1;
        }
        else if(invaders[x][y].shooting==0)
        {
          invaderBullet[i].fire=0;
        }

        invaderBullet[i].bulletOffScreen=0;
        invaderBullet[i].bulletHitPlayer=0;

      }
    }

    //when the invaders shot = the amount of invaders on screen then they redraw and
    // reset themselves at the top of the screen along with the counter
    //shelters do not reset
    if(playerBullet.invaderCount==ROWS*COLS)
    {
      initializeInvaders(invaders);
      updateInvaders(invaders);
      drawInvaders(ren,tex,invaders);
      playerBullet.invaderCount=0;
      playerBullet.lives+=1;
    }

    //if the escpae button is hit or player loses all of their lives then the game ends
    if((playerBullet.lives<=0)||(player.gameOver==1))
    {
      printf("you lose!\n");
      quit=1;
    }
  }

  printf("Your score = [%d]\n",playerBullet.score);
  printf("Your lives = [%d]\n",playerBullet.lives);

  SDL_Quit();
  return 0;
}
Пример #2
0
bool SceneGame::update(float deltaTime) {
	
	if(!Scene::update(deltaTime)) return false;
	finished = false; 
	
	//if(!playing) lastStateChangeTime+=deltaTime;
	timeSinceLastStateChange = ofGetElapsedTimef() - lastStateChangeTime; 

	if(currentGame == GAME_INVADERS) {
		
		if(gameState == STATE_PREINTRO) {
			if(ofGetElapsedTimef()-lastStateChangeTime>20) {
				changeState(STATE_INTRO);
			}
			
		}
		else if((gameState == STATE_INTRO) || (gameState == STATE_WAITING)) {
			if(ofGetElapsedTimef()-lastStateChangeTime>5) {
				changeState(STATE_PLAYING);
			}
		} else if(gameState == STATE_GAMEOVER) {
			if(ofGetElapsedTimef()-lastStateChangeTime>5) {
				changeGame(GAME_ASTEROIDS);
			}

		} else if(gameState == STATE_PLAYING) {
			if(activeInvaders==0) {
				level++;
				if(positionSeconds>lengthSeconds/2) {
					changeState(STATE_GAMEOVER) ;
				} else {
					changeState(STATE_WAITING);
				}
				
			} else {
				updateInvaders();
				checkInvaderCollisions();
			}
		}
		
		if(gameState == STATE_PLAYING || gameState == STATE_INTRO || gameState == STATE_WAITING) {
			updateInvaders();
			checkInvaderCollisions();
		}
		
	} else if (currentGame == GAME_ASTEROIDS) {
		
		updateAsteroids(deltaTime);

		if((gameState == STATE_INTRO) || (gameState == STATE_WAITING)) {
			if(ofGetElapsedTimef()-lastStateChangeTime>5) {
				changeState(STATE_PLAYING);
			}
		} else if(gameState == STATE_PLAYING) {
			if(activeAsteroids==0) {
				level++;
				if(positionSeconds>lengthSeconds-20) {
					changeState(STATE_GAMEOVER) ;
					
				} else {
					changeState(STATE_WAITING);
				}
			} else {
				checkAsteroidCollisions();
			}
		} else if(gameState == STATE_GAMEOVER) {
			
			if((!playing) && (timeSinceLastStateChange>5)) {
				finished = true;
			}
		}
	}
}