void player_draw(Player* plr) { draw_enemies(plr->slaves); glPushMatrix(); glTranslatef(creal(plr->pos), cimag(plr->pos), 0); if(plr->focus != 0) { glPushMatrix(); glRotatef(global.frames*10, 0, 0, 1); glScalef(1, 1, 1); glColor4f(1,1,1,0.2); draw_texture(0, 0, "fairy_circle"); glColor4f(1,1,1,1); glPopMatrix(); } glDisable(GL_CULL_FACE); if(plr->dir) { glPushMatrix(); glScalef(-1,1,1); } int clr_changed = 0; if(global.frames - abs(plr->recovery) < 0 && (global.frames/8)&1) { glColor4f(0.4,0.4,1,0.9); clr_changed = 1; } draw_animation_p(0, 0, !plr->moving, player_get_ani(plr->cha)); if(clr_changed) glColor3f(1,1,1); if(plr->dir) glPopMatrix(); glEnable(GL_CULL_FACE); if(plr->focus != 0) { glPushMatrix(); glColor4f(1,1,1,fabs((float)plr->focus/30.0f)); glRotatef(global.frames, 0, 0, -1); draw_texture(0, 0, "focus"); glColor4f(1,1,1,1); glPopMatrix(); } glPopMatrix(); }
//------------------------------ // Drawing functions //------------------------------ void draw_everything() { // Fill the screen with black SDL_FillRect(screen,NULL, 0x000000); // Draw background draw_background(); // Draw the title screen if(gamestate_title == true) draw_titlescreen(); else { // Draw the game objects if(gamestate_over == false) draw_player(); draw_enemies(); draw_explosions(); draw_lasers(); draw_info(); draw_statustext(); } }
void episode_game::draw() { glColor3f(1.f,1.f,1.f); _background.draw(); //glEnable(GL_BLEND); //glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA); //glShadeModel(GL_FLAT); draw_enemies(); draw_main_character(); draw_bullets(); // draw explosions for(auto it = _explosions.begin(); it!=_explosions.end();++it) { (*it)->draw(); } if(_character_explosion!=NULL) { _character_explosion->draw(); } // bomb if(_bomb!=NULL) { _bomb->draw(); } //glDisable(GL_BLEND); // energy _energy->draw(); }
//funkce pro kresleni void draw_game() { float t; draw_stars(); draw_enemies(); draw_bullets(); draw_particles(); draw_bonuses(); //mod pro koncovy screen hry if (playerdead) { //smesovani barev glEnable(GL_BLEND); //vyber blendovaci funkce glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //zesednuti pozadi glColor4f(0, 0, 0, 0.6); glBegin(GL_QUADS); glVertex2f(-250, -350); glVertex2f(250, -350); glVertex2f(250, 350); glVertex2f(-250, 350); glEnd(); glDisable(GL_BLEND); //kresleni statistik hry na konci hry glPushMatrix(); glTranslatef(-240, 0, 0); glScalef(18, 18, 0); glColor3f(0, 1, 0); glPushMatrix(); glTranslatef(2, 5, 0); glScalef(4, 4, 0); draw_string("GAME OVER"); glColor3f(1, 1, 1); glTranslatef(0.03, 0.03, 0); draw_string("GAME OVER"); glPopMatrix(); draw_string("LEVEL"); glTranslatef(3.5, 0, 0); draw_int(level); glTranslatef(-3.5, -1, 0); draw_string("SCORE"); glTranslatef(3.5, 0, 0); draw_int(score); glTranslatef(-3.5, -5, 0); glPushMatrix(); glTranslatef(0.3, -4, 0); glScalef(2, 2, 0); glColor3f(0, 1, 0); draw_string("PRESS FIRE TO RESTART"); glPopMatrix(); glPopMatrix(); } else { //statistika hry v levem spodnim rohu glPushMatrix(); glTranslatef(-240, -305, 0); glScalef(18, 18, 1); glColor3f(0, 1, 0); draw_string("POWER"); glTranslatef(3.5, 0, 0); draw_int(plevel); glTranslatef(-3.5, -1, 0); draw_string("LEVEL"); glTranslatef(3.5, 0, 0); draw_int(level); glTranslatef(-3.5, -1, 0); draw_string("SCORE"); glTranslatef(3.5, 0, 0); draw_int(score); glPopMatrix(); glTranslatef(posx, posy, 0); //raketka glBegin(GL_TRIANGLES); glColor3f(0, 0, 1); glVertex2f(-20, -10); glColor3f(0.5, 0.5, 1); glVertex2f(0, 0); glVertex2f(0, 50); glVertex2f(0, 50); glVertex2f(0, 0); glColor3f(0, 0, 1); glVertex2f(20, -10); glColor3f(1, 0, 0); glVertex2f(0, 0); glColor3f(1, 1, 0); glVertex2f(-2.5, -6); glVertex2f(2.5, -6); glEnd(); //pokud hrac sebere stitovy bonus if (shieldtimer>0) { //poslednich 5 vterin stit blika if (shieldtimer<5) t=sinf(shieldtimer*20); else t=1; glColor3f(0.3*t*t, 0.3*t*t, 0.6*t*t); //nakresleni trojuhelnikoveho stitu glBegin(GL_LINE_LOOP); glVertex2f(0, 55); glVertex2f(-25, -15); glVertex2f(25, -15); glEnd(); } } }
int main() { ALLEGRO_DISPLAY *display = NULL; ALLEGRO_EVENT_QUEUE *event_queue=NULL; ALLEGRO_TIMER *timer=NULL; ALLEGRO_FONT *font=NULL; bool keys[4]={false, false, false, false}; bool redraw; enum tile map[50][30]; struct player player; struct enemy enemies[100]; int next; int selected_enemy=100; int level=1; int best=1; player.power=5; player.health=30; player.max_health=30; player.speed=2; player.x=0; player.y=0; player.turns_missed=0; player.kills=0; player.upgrades=4; if(!init(&display, &event_queue, &timer)) { return 1; } init_map(map); init_enemies(enemies, map, 5); font=al_load_font("Xolonium-Regular.otf", 30, 0); while(42) { ALLEGRO_EVENT ev; al_wait_for_event(event_queue, &ev); if(ev.type == ALLEGRO_EVENT_TIMER) { redraw=true; next=select_mover(player, enemies); if(next==100) { if(move_player(&player, keys, map, enemies)) { player.turns_missed=0; inc_turns(&player, enemies); } } else { int ret_x, ret_y; search(enemies[next].x, enemies[next].y, map, player.x, player.y, &ret_x, &ret_y); if(!is_player(ret_x, ret_y, player) && is_enemy(ret_x, ret_y, enemies)==100) { enemies[next].x=ret_x; enemies[next].y=ret_y; } if(is_player(ret_x, ret_y, player)) { fight(&player, enemies, next); } enemies[next].turns_missed=0; inc_turns(&player, enemies); if(!(rand()%(150/level))) { breed(enemies, map); } } if(enemies[selected_enemy].health<=0) { selected_enemy=100; } if(all_enemies_dead(enemies)) { level++; init_map(map); init_enemies(enemies, map, level*5); player.x=0; player.y=0; if(level>best) { best=level; } } if(player.health<=0) { level=1; init_map(map); init_enemies(enemies, map, level*5); player.power=5; player.health=30; player.max_health=30; player.speed=2; player.x=0; player.y=0; player.turns_missed=0; player.kills=0; player.upgrades=0; } } else if(ev.type==ALLEGRO_EVENT_DISPLAY_CLOSE) { break; } else if(ev.type == ALLEGRO_EVENT_KEY_DOWN) { switch(ev.keyboard.keycode) { case ALLEGRO_KEY_UP: keys[KEY_UP]=true; break; case ALLEGRO_KEY_DOWN: keys[KEY_DOWN]=true; break; case ALLEGRO_KEY_RIGHT: keys[KEY_RIGHT]=true; break; case ALLEGRO_KEY_LEFT: keys[KEY_LEFT]=true; break; } } else if(ev.type == ALLEGRO_EVENT_KEY_UP) { switch(ev.keyboard.keycode) { case ALLEGRO_KEY_UP: keys[KEY_UP]=false; break; case ALLEGRO_KEY_DOWN: keys[KEY_DOWN]=false; break; case ALLEGRO_KEY_RIGHT: keys[KEY_RIGHT]=false; break; case ALLEGRO_KEY_LEFT: keys[KEY_LEFT]=false; break; } } else if(ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) { int old_selected=selected_enemy; selected_enemy=is_enemy(ev.mouse.x/18, ev.mouse.y/18, enemies); if(selected_enemy==100) selected_enemy=old_selected; if(ev.mouse.x>900 && player.kills >= (player.upgrades * player.upgrades)/10) { bool change=false; if(ev.mouse.y>10 && ev.mouse.y<40) { player.max_health+=5; player.health=player.max_health; change=true; } else if(ev.mouse.y>50 && ev.mouse.y<80) { player.power+=2; change=true; } else if(ev.mouse.y>90 && ev.mouse.y<120) { player.speed+=1; change=true; } if(change) { player.upgrades+=1; } } } if(redraw && al_is_event_queue_empty(event_queue)) { redraw=false; al_clear_to_color(al_map_rgb(255, 255, 255)); draw_map(map); draw_enemies(enemies); al_draw_bitmap(player_img, player.x*18, player.y*18, 0); al_draw_textf(font, al_map_rgb(0, 255, 0), 950, 10, ALLEGRO_ALIGN_CENTRE, "%d", player.health); al_draw_textf(font, al_map_rgb(0, 255, 0), 950, 50, ALLEGRO_ALIGN_CENTRE, "%d", player.power); al_draw_textf(font, al_map_rgb(0, 255, 0), 950, 90, ALLEGRO_ALIGN_CENTRE, "%d", player.speed); al_draw_textf(font, al_map_rgb(0, 0, 255), 950, 150, ALLEGRO_ALIGN_CENTRE, "%d", player.kills); al_draw_textf(font, al_map_rgb(0, 0, 255), 950, 190, ALLEGRO_ALIGN_CENTRE, "%d", (player.upgrades*player.upgrades)/10); if(selected_enemy!=100) { al_draw_textf(font, al_map_rgb(255, 0, 0), 950, 250, ALLEGRO_ALIGN_CENTRE, "%d", enemies[selected_enemy].health); al_draw_textf(font, al_map_rgb(255, 0, 0), 950, 290, ALLEGRO_ALIGN_CENTRE, "%d", enemies[selected_enemy].power); al_draw_textf(font, al_map_rgb(255, 0, 0), 950, 330, ALLEGRO_ALIGN_CENTRE, "%d", enemies[selected_enemy].speed); } al_draw_textf(font, al_map_rgb(0, 0, 0), 950, 390, ALLEGRO_ALIGN_CENTRE, "%d", level); al_draw_textf(font, al_map_rgb(0, 0, 0), 950, 430, ALLEGRO_ALIGN_CENTRE, "%d", best); al_flip_display(); } } return 0; }