void Draw_Player(sf::RenderWindow& window) { assert(Player != 0); unsigned x, y; Player->Get_Location(&x, &y); sf::RectangleShape helicopter(sf::Vector2f(70, 40)); helicopter.setFillColor(sf::Color(0, 0, 255)); helicopter.setPosition(x, y); window.draw(helicopter); }
/* * Create a moving helicopter * at (x,y,z) * nose towards (dx,dy,dz) * up towards (ux,uy,uz) */ void movingHelicopter(){ // Save current transforms glPushMatrix(); // Translate the helicopter around the y-axis glTranslated(Cos(zh), 1, -Sin(zh)); // Point the nose of the helicopter in the direction of travel glRotated(-90 + zh, 0, 1, 0); // Pitch the helicopter forward glRotated(45, 0, 0, 1); // Roll the helicopter towards the origin glRotated(25, 1, 0, 0); // Create the helicopter with rotating blades helicopter(5*zh); // Undo transformations glPopMatrix(); }
int main() { const int spd = 16; for (int x=0;x<41;++x) { angles_y[x] = (spd*cos(PI/180*(x-20+90))); angles_x[x] = (spd*sin(PI/180*(x-20+90))); } allegro_init(); install_keyboard(); install_timer(); LOCK_VARIABLE(speed_counter); LOCK_FUNCTION(increment_speed_counter); install_int_ex(increment_speed_counter, BPS_TO_TIMER(60)); const int width = 1024; const int height = 768; set_color_depth(32); set_gfx_mode(GFX_AUTODETECT_WINDOWED, width, height, 0, 0); set_alpha_blender(); BITMAP* buffer = create_bitmap(width, height); //BITMAP* image3 = load_bitmap("./sprites/chopper3.tga", 0); BITMAP* image2 = load_bitmap("./sprites/chopper.tga", 0); BITMAP* image = load_bitmap("./sprites/chopper2.tga", 0); BITMAP* background = load_bitmap("./sprites/background.bmp", 0); BITMAP* image_sphere = load_bitmap("./sprites/sphere1.tga", 0); BITMAP* image_sphere2 = load_bitmap("./sprites/sphere2.tga", 0); BITMAP* image_shot = load_bitmap("./sprites/shot.tga", 0); BITMAP* image_explosion[17]; image_explosion[0] = load_bitmap("./sprites/exp_frame_0.tga", 0); image_explosion[1] = load_bitmap("./sprites/exp_frame_1.tga", 0); image_explosion[2] = load_bitmap("./sprites/exp_frame_2.tga", 0); image_explosion[3] = load_bitmap("./sprites/exp_frame_3.tga", 0); image_explosion[4] = load_bitmap("./sprites/exp_frame_4.tga", 0); image_explosion[5] = load_bitmap("./sprites/exp_frame_5.tga", 0); image_explosion[6] = load_bitmap("./sprites/exp_frame_6.tga", 0); image_explosion[7] = load_bitmap("./sprites/exp_frame_7.tga", 0); image_explosion[8] = load_bitmap("./sprites/exp_frame_8.tga", 0); image_explosion[9] = load_bitmap("./sprites/exp_frame_9.tga", 0); image_explosion[10] = load_bitmap("./sprites/exp_frame_10.tga", 0); image_explosion[11] = load_bitmap("./sprites/exp_frame_11.tga", 0); image_explosion[12] = load_bitmap("./sprites/exp_frame_12.tga", 0); image_explosion[13] = load_bitmap("./sprites/exp_frame_13.tga", 0); image_explosion[14] = load_bitmap("./sprites/exp_frame_14.tga", 0); image_explosion[15] = load_bitmap("./sprites/exp_frame_15.tga", 0); image_explosion[16] = load_bitmap("./sprites/exp_frame_16.tga", 0); std::vector<helicopter> heli; heli.push_back(helicopter(image_explosion, 17,image->w, image->h, 40, 40, 0, 0, 0, gravity / 2, 0.8, 0.5)); heli.push_back(helicopter(image_explosion, 17,image2->w, image2->h, 720, 40, 0, 0, 0, gravity / 2, 0.8, 0.5)); //heli.push_back(helicopter(image_explosion, 17,image3->w, image3->h, 350, 200, 0, 100, 0, gravity / 2, 0.8, 0.5)); heli[0].flip = !heli[0].flip; srand(time(NULL)); std::vector<ball> spheres; for (int x=0;x<10;++x) spheres.push_back( ball( image_sphere->w, image_sphere->h, (double)((int)rand()%(SCREEN_W-image_sphere->w)), (double)((int)rand()%(SCREEN_H-image_sphere->h)), (double)((int)rand()%60), (double)((int)rand()%60), 0.0, gravity * 2, 0.95, 0.95)); std::vector<explosion> explosions; while (!key[KEY_ESC]) { while (speed_counter > 0) { heli[1].get_input(key[KEY_UP], key[KEY_DOWN], key[KEY_LEFT], key[KEY_RIGHT], true); heli[0].get_input(key[KEY_W], key[KEY_S], key[KEY_A], key[KEY_D], true); //heli[2].get_input(key[KEY_Y], key[KEY_H], key[KEY_G], key[KEY_J], true); for (unsigned int x=0;x<heli.size();++x) { if (!(heli[x].health>0))explosions.push_back(explosion(image_explosion, 17, (int)heli[x].pos_x, (int)heli[x].pos_y, rand()%(heli[x].size_x*2), rand()%(heli[x].size_y*2))); heli[x].update_phys(); } for (unsigned int x=0;x<spheres.size();++x) { spheres[x].update_phys(); } for (unsigned int x=0;x<explosions.size();++x) if (explosions[x].alive) explosions[x].update_frame(); else explosions.erase(explosions.begin()+x); for (unsigned int x=0;x<heli.size();++x) for (unsigned int y=0;y<spheres.size();++y) if (check_collision(spheres[y], heli[x])) { heli[x].explode((heli[x].pos_x - spheres[y].pos_x)+heli[x].speed_x, (heli[x].pos_y - spheres[y].pos_y)+heli[x].speed_y, 1); spheres[y].explode((spheres[y].pos_x - heli[x].pos_x)+spheres[y].speed_x, (spheres[y].pos_y - heli[x].pos_y)+spheres[y].speed_y); if (heli[x].health>0) explosions.push_back(explosion(image_explosion, 17, (int)heli[x].pos_x, (int)heli[x].pos_y, heli[x].size_x, heli[x].size_y)); explosions.push_back(explosion(image_explosion, 17, (int)spheres[y].pos_x, (int)spheres[y].pos_y)); } for (unsigned int x=0;x<spheres.size();++x) for (unsigned int y=x+1;y<spheres.size();++y) if (check_collision(spheres[x], spheres[y])) { spheres[x].explode((spheres[x].pos_x - spheres[y].pos_x)+spheres[x].speed_x, (spheres[x].pos_y - spheres[y].pos_y)+spheres[x].speed_y); spheres[y].explode((spheres[y].pos_x - spheres[x].pos_x)+spheres[y].speed_x, (spheres[y].pos_y - spheres[x].pos_y)+spheres[y].speed_y); explosions.push_back(explosion(image_explosion, 17, (int)spheres[x].pos_x, (int)spheres[x].pos_y)); explosions.push_back(explosion(image_explosion, 17, (int)spheres[y].pos_x, (int)spheres[y].pos_y)); } if (check_collision(heli[0], heli[1])) { heli[0].explode((heli[0].pos_x - heli[1].pos_x)+heli[0].speed_x, (heli[0].pos_y - heli[1].pos_y)+heli[0].speed_y, 5); heli[1].explode((heli[1].pos_x - heli[0].pos_x)+heli[1].speed_x, (heli[1].pos_y - heli[0].pos_y)+heli[1].speed_y, 5); if (heli[0].health>0) explosions.push_back(explosion(image_explosion, 17, (int)heli[0].pos_x, (int)heli[0].pos_y, heli[0].size_x, heli[0].size_y)); if (heli[1].health>0) explosions.push_back(explosion(image_explosion, 17, (int)heli[1].pos_x, (int)heli[1].pos_y, heli[1].size_x, heli[1].size_y)); } for (unsigned int x=0;x<heli.size();++x) { for (unsigned int y=0;y<heli[x].shots.size();++y) { for (unsigned int z=0;z<heli.size();++z) if (z!=x) if (check_collision(heli[x].shots[y], heli[z])) { heli[z].explode((heli[z].pos_x - heli[x].shots[y].pos_x)+heli[z].speed_x, (heli[z].pos_y - heli[x].shots[y].pos_y)+heli[z].speed_y,10); if (heli[z].health>0) explosions.push_back(explosion(image_explosion, 17, (int)heli[z].pos_x, (int)heli[z].pos_y)); } for (unsigned int z=0;z<spheres.size();++z) if (check_collision(heli[x].shots[y], spheres[z])) { spheres[z].explode((spheres[z].pos_x - heli[x].shots[y].pos_x)+spheres[z].speed_x, (spheres[z].pos_y - heli[x].shots[y].pos_y)+spheres[z].speed_y); explosions.push_back(explosion(image_explosion, 17, (int)spheres[z].pos_x, (int)spheres[z].pos_y)); if (z==0) { spheres.erase(spheres.begin()); spheres.push_back(ball(image_sphere->w,image_sphere->h,(double)((int)rand()%(SCREEN_W-image_sphere->w)),(double)((int)rand()%(SCREEN_H-image_sphere->h)),(double)((int)rand()%60),(double)((int)rand()%60),0.0,gravity * 2,0.95,0.95)); heli[x].health += 50; } } } for (unsigned int y=x+1;y<heli.size();++y) if (check_collision(heli[x], heli[y])) { heli[x].explode((heli[x].pos_x - heli[y].pos_x)+heli[x].speed_x, (heli[x].pos_y - heli[y].pos_y)+heli[x].speed_y,10); if (heli[x].health>0) explosions.push_back(explosion(image_explosion, 17, (int)heli[x].pos_x, (int)heli[x].pos_y)); heli[y].explode((heli[y].pos_x - heli[x].pos_x)+heli[y].speed_x, (heli[y].pos_y - heli[x].pos_y)+heli[y].speed_y,10); if (heli[y].health>0) explosions.push_back(explosion(image_explosion, 17, (int)heli[y].pos_x, (int)heli[y].pos_y)); } } speed_counter--; } blit(background, buffer, 0, 0, 0, 0, width, height); for (unsigned int x=0;x<spheres.size();++x) { if (x==0) spheres[x].draw(buffer, image_sphere2); else spheres[x].draw(buffer, image_sphere); } heli[0].draw(buffer, image, image_shot); heli[1].draw(buffer, image2, image_shot); //heli[2].draw(buffer, image3, image_shot); draw_health(buffer, 10, 10, heli[0].health); draw_health(buffer, SCREEN_W-110, 10, heli[1].health); //draw_health(buffer, SCREEN_W/2, 10, heli[2].health); for (unsigned int x=0;x<explosions.size();++x) explosions[x].draw(buffer); blit(buffer, screen, 0, 0, 0, 0, width, height); clear_bitmap(buffer); } destroy_bitmap(buffer); return 0; }
/* * OpenGL (GLUT) calls this routine to display the scene */ void display() { const double len=2.0; // Length of axes // Erase the window and the depth buffer glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Enable Z-buffering in OpenGL glEnable(GL_DEPTH_TEST); // Enable face culling in OpenGL glEnable(GL_CULL_FACE); // Undo previous transformations glLoadIdentity(); // Perspective - set eye position double Ex = -2*dim*Sin(th)*Cos(ph); double Ey = +2*dim *Sin(ph); double Ez = +2*dim*Cos(th)*Cos(ph); gluLookAt(Ex,Ey,Ez , 0,0,0 , 0,Cos(ph),0); if(light){ // Translate intensity to color vectors float Ambient[] = {0.01*ambient ,0.01*ambient ,0.01*ambient ,1.0}; float Diffuse[] = {0.01*diffuse ,0.01*diffuse ,0.01*diffuse ,1.0}; float Specular[] = {0.01*specular,0.01*specular,0.01*specular,1.0}; // Light position float Position[] = {distance*Cos(zh),ylight,distance*Sin(zh),1.0}; // Draw light position as ball (still no lighting here) glColor3f(1,1,1); glPushMatrix(); glTranslatef(Position[0],Position[1],Position[2]); glScalef(0.1, 0.1, 0.1); sphere(1.0, 1.0, 1.0, 1); glPopMatrix(); // OpenGL should normalize normal vectors glEnable(GL_NORMALIZE); // Enable lighting glEnable(GL_LIGHTING); // glColor sets ambient and diffuse color materials glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); // Enable light 0 glEnable(GL_LIGHT0); // Set ambient, diffuse, specular components and position of light 0 glLightfv(GL_LIGHT0,GL_AMBIENT ,Ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE ,Diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,Specular); glLightfv(GL_LIGHT0,GL_POSITION,Position); }else{ glDisable(GL_LIGHTING); } if(fly){ movingHelicopter(); }else{ helicopter(0); } // Draw axes - no lighting from here on glDisable(GL_LIGHTING); glColor3f(1,1,1); if(axes){ // Draw axes glBegin(GL_LINES); glVertex3d(0.0,0.0,0.0); glVertex3d(len,0.0,0.0); glVertex3d(0.0,0.0,0.0); glVertex3d(0.0,len,0.0); glVertex3d(0.0,0.0,0.0); glVertex3d(0.0,0.0,len); glEnd(); // Label axes glRasterPos3d(len,0.0,0.0); Print("X"); glRasterPos3d(0.0,len,0.0); Print("Y"); glRasterPos3d(0.0,0.0,len); Print("Z"); } // Display parameters glWindowPos2i(5,5); Print("Angle=%d,%d Dim=%.1f FOV=%d Projection=%s Light=%s", th,ph,dim,fov,"Perspective",light?"On":"Off"); if (light) { glWindowPos2i(5,45); Print("Distance=%d Elevation=%.1f", distance, ylight); glWindowPos2i(5,25); Print("Ambient=%d Diffuse=%d Specular=%d Emission=%d Shininess=%.0f",ambient,diffuse,specular,emission,shinyvec[0]); } // Check for any errors that have occurred ErrCheck("display"); // Render the scene and make it visible glFlush(); glutSwapBuffers(); }