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); } }
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; } }
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 ); } } } }
//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; }
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; }
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(); }