示例#1
0
文件: enemy.cpp 项目: RiseAndCry/MOBA
void Enemy::enemy_movement(sf::Vector2f playerPositionTemp) {
	startPosition = enemySprite.getPosition();
	playerPosition = playerPositionTemp;

	//	If player`s position (relative to enemy)      
	//						__|__ 
	//						  | .
	if (playerPosition.x >= startPosition.x && playerPosition.y >= startPosition.y) {
		// Calculate the length of x and y (distance from enemy to player`s location)
		fullLength.y = playerPosition.y - startPosition.y;
		fullLength.x = playerPosition.x - startPosition.x;
		lengthOfLine = sqrt(pow(playerPosition.y - startPosition.y, 2) + pow(playerPosition.x - startPosition.x, 2));
		x = "+";
		y = "+";
		move_enemy(fullLength, x, y, lengthOfLine);
	}
	//						     .
	//						__|__
	//						  |
	else if (playerPosition.x >= startPosition.x && playerPosition.y <= startPosition.y) {
		fullLength.y = startPosition.y - playerPosition.y;
		fullLength.x = playerPosition.x - startPosition.x;
		lengthOfLine = sqrt(pow(startPosition.y - playerPosition.y, 2) + pow(playerPosition.x - startPosition.x, 2));
		x = "+";
		y = "-";
		move_enemy(fullLength, x, y, lengthOfLine);
	}
	//						     
	//						__|__
	//						. |
	else if (playerPosition.x <= startPosition.x && playerPosition.y >= startPosition.y) {
		fullLength.y = playerPosition.y - startPosition.y;
		fullLength.x = startPosition.x - playerPosition.x;
		lengthOfLine = sqrt(pow(playerPosition.y - startPosition.y, 2) + pow(startPosition.x - playerPosition.x, 2));
		x = "-";
		y = "+";
		move_enemy(fullLength, x, y, lengthOfLine);
	}
	//					   .    
	//						__|__
	//						  |
	else if (playerPosition.x <= startPosition.x && playerPosition.y <= startPosition.y) {
		fullLength.y = startPosition.y - playerPosition.y;
		fullLength.x = startPosition.x - playerPosition.x;
		lengthOfLine = sqrt(pow(startPosition.y - playerPosition.y, 2) + pow(startPosition.x - playerPosition.x, 2));
		x = "-";
		y = "-";
		move_enemy(fullLength, x, y, lengthOfLine);
	}
}
示例#2
0
文件: invaders.c 项目: miloh/f1rmware
void ram(void) {
	while(1) {
		if (!screen_intro()){
      setTextColor(0xff,0x00);
      return;
    }
		game.rokets = 3;
		game.level = 1;
		game.score = 0;
		init_game();
		screen_level();
		while (game.rokets>=0) {
			////checkISP();
			lcdFill(0x00);
			check_end();
			move_ufo();
			move_shot();
			move_shots();
			move_player();
			move_enemy();
			draw_score();
			draw_ufo();
			draw_bunker();
			draw_player();
			draw_enemy();
			draw_shots();
			//        draw_status();
			lcdDisplay();
			delayms(12);
		}
		if (!screen_gameover())
      setTextColor(0xff,0x00);
      return;
	}
}
示例#3
0
void draw_enemies()
{
  Uint16 i;
  ENEMY *p;
  SIDE s;

  for( i = 0; i < num_enemies; i++ ) {

    p = get_enemy( i );

    /* Attempt to move the enemy. */
    if( move_enemy( p ) == 0 )
      continue;

    /* Do things for an active enemy. */
    if( IS_ACTIVE(p->flags) ) {
      draw_sprite( p->current );  /* Draw it. */

      /* Check for a collision with the ship. */
      s = sprite_collide( p->current, get_ship_sprite() );
      if( s.none == 0  ) {
        hit_enemy( p, 5 );
        ship_hit( s );
      }
    }
  }

}
示例#4
0
//convenience function to move all enemies at once
bool Game::move_enemies(){
	for(int i = 0; i < enemies.size(); i++){
		if(!move_enemy(&(enemies[i]))){
			return false;
		};
	}
	return true;
}
示例#5
0
文件: main.c 项目: emiju/Projet
int main(int argc, char* argv[])

{
  srand(time(NULL));
  previoustime = 0;
  previoustime_deaths = currenttime;
  previoustime_creation_enemies = -10000;
  previoustime_bonus = -15000;
  time_bouclier = -5000;
  previoustime = currenttime;
  Uint8 *key = SDL_GetKeyState(NULL);

  /* initialize video system */
  SDL_Init(SDL_INIT_VIDEO);

  /* set the title bar */
  SDL_WM_SetCaption("SDL Move", "SDL Move");

  /* create window */
  screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);

  /*begin*/
  printf("Appuyez sur Entrée pour commencer la partie\n");
  temp  = SDL_LoadBMP("debut.bmp");
  wall = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);
  while (!begin) {
    if (SDL_PollEvent(&event)) {
	HandleEvent(event);
      }
      SDL_BlitSurface(wall, NULL, screen, &imWall);
      SDL_UpdateRect(screen,0,0,0,0);
  }

  /* load sprite */
  temp = SDL_LoadBMP("salameche.bmp");
  spritetemp = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);
  colorkey = SDL_MapRGB(screen->format, 0, 255, 255);
  perso = sprite_cons(0, 362, 110, 0, spritetemp, colorkey, 5, NULL, 's', 5, 22);

  temp = SDL_LoadBMP("heart.bmp");
  heart = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);
  colorkey = SDL_MapRGB(screen->format, 0, 255, 255);
  SDL_SetColorKey(heart, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);
  bonus_vie = sprite_cons(rand()%(LEVEL_WIDTH-16), rand()%(LEVEL_HEIGHT/2-16)+LEVEL_HEIGHT/2, 0, 0, heart, colorkey, 0, NULL,'b', 0, 16);

  temp = SDL_LoadBMP("abri.bmp");
  abri = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);
  colorkey = SDL_MapRGB(screen->format, 0, 255, 255);
  SDL_SetColorKey(heart, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);
  bonus_abri = sprite_cons(rand()%(LEVEL_WIDTH-40), rand()%(LEVEL_HEIGHT/2-40)+LEVEL_HEIGHT/2, 0, 0, abri, colorkey, 0, NULL,'b', 0, 40);

  /*temp = SDL_LoadBMP("lanceflamme.bmp");
  lance_flamme = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);
  colorkey = SDL_MapRGB(screen->format, 0, 255, 255);
  SDL_SetColorKey(heart, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);
  bonus_lf = sprite_cons(rand()%(LEVEL_WIDTH-47), rand()%(LEVEL_HEIGHT/2-8)+LEVEL_HEIGHT/2, 0, 0, lance_flamme, colorkey, 7, NULL,'b', 0, 30);*/
  
  temp  = SDL_LoadBMP("bloc.bmp");
  stone1 = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);

  temp  = SDL_LoadBMP("bloc2.bmp");
  stone2 = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);

  temp  = SDL_LoadBMP("bloc3.bmp");
  stone3 = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);

  /* load wall */
  temp  = SDL_LoadBMP("fond.bmp");
  wall = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);

  /* set wall position */
  imWall.x = 0;
  imWall.y = 0;

  gameover = 0;

  /* message pump */
  currenttime2 = SDL_GetTicks();
  int nb_enemies, randnumber;
  while (!gameover)
    {
      currenttime = SDL_GetTicks();

      if (SDL_PollEvent(&event)) {
	HandleEvent(event);
      }
      if (currenttime - currenttime2 > 50){
	currenttime2 = currenttime;
	MultiEvent(key);
	
	//apparition ennemis
	if (currenttime - previoustime_creation_enemies > delta_creation_enemies && niveau !=3) {
	  for (nb_enemies = 0; nb_enemies < 5; nb_enemies = nb_enemies +1) {
	    randnumber = rand()%3;
	    if (randnumber == 0) {
	        temp = SDL_LoadBMP("taupi.bmp");
		spritetemp = SDL_DisplayFormat(temp);
		SDL_FreeSurface(temp);
		colorkey = SDL_MapRGB(screen->format, 0, 255, 255);
		list_enemy = cons(sprite_cons(rand()%(LEVEL_WIDTH-22),rand()%(LEVEL_HEIGHT-22), 0, 0, spritetemp, colorkey, 0, NULL, 't', 2, 22),list_enemy);
	    } else if (randnumber == 1) {
	        temp = SDL_LoadBMP("cara.bmp");
		spritetemp = SDL_DisplayFormat(temp);
		SDL_FreeSurface(temp);
		colorkey = SDL_MapRGB(screen->format, 0, 255, 255);
		list_enemy = cons(sprite_cons(rand()%(LEVEL_WIDTH-25),rand()%(LEVEL_HEIGHT-25), 0, 0, spritetemp, colorkey, -3, NULL, 'c',2, 25),list_enemy);
	    } else {
	      temp = SDL_LoadBMP("meta.bmp");
	      spritetemp = SDL_DisplayFormat(temp);
	      SDL_FreeSurface(temp);
	      colorkey = SDL_MapRGB(screen->format, 0, 255, 255);
	      list_enemy = cons(sprite_cons(rand()%(LEVEL_WIDTH-20),rand()%(LEVEL_HEIGHT-20), 0, 0, spritetemp, colorkey, -5, NULL, 'm',2, 20),list_enemy);
	    }
	    test_apparition(first_of(list_enemy));
	  }
	  previoustime_creation_enemies = currenttime;
	}
        
	// test arret gauche
	if (pasgauche && !pasdroit) {
	  arret_gauche(perso);
	  pasgauche = false;
	}
	
	// test arret droit
	if (pasdroit && !pasgauche) {
	  arret_droit(perso);
	  pasdroit = false;
	}
	
	// saut

	if (jump) {
	  jump_perso(perso);
	} else { //gravitation
	  i = (perso -> imSprite.x + perso -> posSprite.h/2)/32;
	  j = (perso -> imSprite.y + perso -> posSprite.h +vy)/32;
	  surbloc = tab_blocs[j][i] != 0;
	  sursol = perso ->imSprite.y == 383 - perso -> posSprite.h ;
	  if (!surbloc && perso->imSprite.y < 361) {
	    vy = 7;
	    perso->imSprite.y += vy;
	  }
	  j = (perso -> imSprite.y + perso -> posSprite.h + vy)/32;
	  surbloc = tab_blocs[j][i] != 0;
	  sursol = perso->imSprite.y >= 361;
	  if (surbloc && !sursol) {
	    perso->imSprite.y = j*32 - perso->posSprite.h;
	  }
	  if (sursol) {
	    perso->imSprite.y = 361;
	  }	    
	}

	//bonus
	if (currenttime - previoustime_bonus > 15000 && currenttime-time_bouclier>=5000) {
	  placement_bonus();
	}
	if (collision(perso, bonus_vie)) {
	  deaths = deaths - 1;
	  bonus_vie->imSprite.x = LEVEL_WIDTH + 1;
	  previoustime_bonus = currenttime;
	}
	
	if (currenttime-time_bouclier >= 5000 && immunite){
	  bonus_abri->imSprite.x = LEVEL_WIDTH + 1;
	  immunite = false;
	}
	if (collision(perso, bonus_abri)) {
	  bonus_abri->imSprite.x = perso->imSprite.x - (45 - perso->posSprite.h)/3;
	  bonus_abri->imSprite.y = perso->imSprite.y - (45 - perso->posSprite.h)/3;
	  if (!immunite){
	    time_bouclier = currenttime;
	  }
	  immunite = true;
	} else {
	  immunite = false;
	}
	
	move_enemy(list_enemy, list_fire_enemy);
	positionfire(list_fire);
	list_enemy = list_enemy_destruction (list_fire, list_enemy, &list_fire_enemy, camera);
	list_fire = list_fire_destruction (list_fire, camera);
	list_fire_enemy = list_fire_destruction (list_fire_enemy, camera);
	level_2();
	level_3();
      }

      if (currenttime - previoustime_deaths > 1000){
	death_temp = deaths;
	deaths = collision_enemy(list_enemy, perso, deaths, camera);
	if (death_temp != deaths){
	  previoustime_deaths = currenttime;
	}
      }

      Setcamera();

      SDL_BlitSurface(wall, NULL, screen, &imWall);
      print_tab (tab_blocs, camera);
      printlist (list_enemy);
      
      imCamera = Calculposition(bonus_vie ->imSprite.x, bonus_vie ->imSprite.y, camera);
      SDL_BlitSurface(bonus_vie -> spr, &bonus_vie -> posSprite, screen, &imCamera);

      imCamera = Calculposition(bonus_abri ->imSprite.x, bonus_abri ->imSprite.y, camera);
      SDL_BlitSurface(bonus_abri -> spr, &bonus_abri -> posSprite, screen, &imCamera);

      
      /* draw the sprite */
      imCamera = Calculposition(perso ->imSprite.x, perso ->imSprite.y, camera);
      if (imCamera.x < 0) {
	imCamera.x = 0;
	perso -> imSprite.x = 0;
      }
      if (imCamera.x > SCREEN_WIDTH-22) {
	imCamera.x = SCREEN_WIDTH-22;
	perso -> imSprite.x = LEVEL_WIDTH-22;
      }
      SDL_BlitSurface(perso -> spr, &perso ->posSprite, screen, &imCamera);
      
      printlist(list_fire);
      printlist(list_fire_enemy);

      heart_pos.x = 0;
      for (i = 0; i < 5 - deaths; i = i+1) {
	SDL_BlitSurface(heart, NULL, screen, &heart_pos);
	heart_pos.x = heart_pos.x + 17; 
      }
      if (niveau==3){
	if (!is_empty(list_enemy)){
	  heart_pos.x = 624;
	  for (i = 0; i < first_of(list_enemy)->life; i = i+1) {
	    SDL_BlitSurface(heart, NULL, screen, &heart_pos);
	    heart_pos.x = heart_pos.x - 17; 
	  }
	}else{
	  printf("BRAVO, VOUS AVEZ GAGNÉ !\n");
	  gameover = 1;
	}
      }
      
      if (deaths >= 5){
	printf("DÉSOLÉ, VOUS AVEZ PERDU !\n");
	gameover = 1;
      }
      /* update the screen */
      SDL_UpdateRect(screen,0,0,0,0);
      SDL_Delay(5);
    }
  
  /* clean up */
  SDL_FreeSurface(stone1);
  SDL_FreeSurface(stone2);
  SDL_FreeSurface(stone3);
  SDL_FreeSurface(heart);
  SDL_FreeSurface(screen); 
  SDL_FreeSurface(wall);
  free (bonus_vie);
  SDL_FreeSurface(bonus_abri->spr);
  free (bonus_abri);
  SDL_FreeSurface(perso -> spr);
  free (perso);
  free_list(&list_fire);
  free_list(&list_enemy);
  SDL_Quit();

  return 0;
}
示例#6
0
int main() {
	//current dungeon level
	int level=1;

	srand((unsigned)time(NULL));
	init_curses();
	init_map();
	init_ents(level);
	init_items();

	//the player's coordinates
	int *y=&ent_l[0].y;
	int *x=&ent_l[0].x;

	//last key pressed
	chtype key=0;
	do {
		//move player
		if ('8'==key)//up
			move_to(y,x,-1,0);
		if ('2'==key)//down
			move_to(y,x,1,0);
		if ('4'==key)//left
			move_to(y,x,0,-1);
		if ('6'==key)//right
			move_to(y,x,0,1);
		if ('7'==key)//upper left
			move_to(y,x,-1,-1);
		if ('9'==key)//upper right
			move_to(y,x,-1,1);
		if ('1'==key)//lower left
			move_to(y,x,1,-1);
		if ('3'==key)//lower right
			move_to(y,x,1,1);
		if (('<'==key || ','==key) && NEXT_LEVEL==map[*y][*x].type) {
			if (++level>LAST_LEVEL)
				you_won();
			init_map();
			init_ents(level);
			init_items();
		}
		//move living enemies in the player's direction
		for (int e=1;e<ENTS_;e++) {
			if (ent_l[e].hp>0)
				move_enemy(&ent_l[e],&ent_l[0]);
		}

		//use unused item if the player is standing on one
		item* ci=item_m[*y][*x];
		if (NULL!=ci && !ci->used) {
			//heal hp
			if (MED_PACK==ci->type && ent_l[0].hp<PLAYER_HP) {
				ent_l[0].hp=min(ent_l[0].hp+MED_CHARGE,PLAYER_HP);
				ci->used=true;
			}
			//replenish air
			if (AIR_CAN==ci->type && ent_l[0].air<PLAYER_AIR) {
				ent_l[0].air=min(ent_l[0].air+AIR_CHARGE,PLAYER_AIR);
				ci->used=true;
			}
		}

		//mark last turn's field of view as SEEN
		for (int yy=0;yy<Y_;yy++)
			for (int xx=0;xx<X_;xx++)
				if (IN_SIGHT==view_m[yy][xx])
					view_m[yy][xx]=SEEN;
		//mark current field of view as IN_SIGHT
		fov(*y,*x, FOV_RADIUS);

		//draw map
		for (int yy=0; yy<Y_; yy++) {
			for (int xx=0; xx<X_ ;xx++) {
				chtype tile=map[yy][xx].type;
				if (IN_SIGHT==view_m[yy][xx]) {
					mvaddch(yy,xx,tile);
				} else if (SEEN==view_m[yy][xx]) {
					if (WALL==tile)
						mvaddch(yy,xx,tile);
					else
						mvaddch(yy,xx,' ');
				} else {
					mvaddch(yy,xx,' ');
				}
			}
		}
		//draw items
		for (int i=0; i<ITEMS_; i++) {
			if (!item_l[i].used && view_m[item_l[i].y][item_l[i].x]==IN_SIGHT)
				mvaddch(item_l[i].y,item_l[i].x,item_l[i].type);
		}
		//draw entities
		for (int e=0; e<ENTS_; e++) {
			if (ent_l[e].hp>0 && view_m[ent_l[e].y][ent_l[e].x]==IN_SIGHT)
				mvaddch(ent_l[e].y,ent_l[e].x,ent_l[e].type);
		}

		print_info(level);
		ent_l[0].air--;
		key=getch();
	} //exit when the player is dead or when ESC or q are pressed
	while (ent_l[0].hp>0 && ent_l[0].air>0 && ESC!=key && 'q'!=key);
	you_lost();
}