///////////////////////////////////////////////////////////////////////////////// // Main loop ///////////////////////////////////////////////////////////////////////////////// int main(void) { bool done=FALSE; // Bool Variable To Exit Loop short i, j; //char stemp[256]; int debounce = 0; //int width; //int height; int running, frames, x, y; double t, t0, fps; char titlestr[ 200 ]; int scr_mode; E3D_Object *pObject; Scene.Start(); Scene.SetRenderDistance(400.0f); // Set up the default light (light 0) E3D_Light *light0 = Scene.GetLight(0); light0->SetColour( 0.8f, 0.8f, 0.6f ); light0->SetAmbient( 0.4f, 0.4f, 0.4f ); light0->SetDirection( 0.707f, 0.707f, 0.0f ); // Set up the default camera (camera 0) E3D_Camera *camera = Scene.GetCamera(0); camera->SetPosition(0.0f, 0.0f, 0.0f); camera->SetDirection(0.0f, 0.0f, 1.0f); camera->SetUpVector(0.0f, 1.0f, 0.0f); camera->SetFOV(60.0f); Scene.AddModel("sights", "sights.obj"); Scene.AddModel("glider", "glider.obj"); Scene.AddModel("frag", "frag.obj"); Scene.AddModel("laser_yellow", "laser_yellow.obj"); Scene.AddModel("laser_green", "laser_green.obj"); // add sights pObject = Scene.AddObject(PLAYER_LIST, "sights"); pObject->SetPosition(0.0f, 0.0f, 10.0f); // add some bullets for(i=0; i<8; i++) { pObject = Scene.AddObject(BULLET_LIST, "laser_yellow"); pObject->SetPosition(50.0f, 0.0f, 0.0f); // offscreen } // add some fragments (objects 10 to 50) for(i=0; i<30; i++) { pObject = Scene.AddObject(FRAG_LIST, "frag"); pObject->SetPosition(50.0f, 0.0f, 0.0f); // offscreen } // manufacture some gliders for(i=0; i<160; i++) { pObject = Scene.AddObject(ENEMY_LIST, "glider"); pObject->SetPosition((float)(rand() % 100 - 50), (float)(rand() % 80 - 40), 50.0f + (float)(rand() % 300)); pObject->behaviour = 1; } // Set up SDL video buffer printf("Initializing SDL.\n"); // Information about the current video settings. const SDL_VideoInfo* info = NULL; // Color depth in bits of our window. int bpp = 0; // Flags we will pass into SDL_SetVideoMode. int flags = 0; // Initialize defaults, Video and Audio if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) { printf("Could not initialize SDL: %s.\n", SDL_GetError()); exit(-1); } printf("SDL initialized.\n"); // Let's get some video information. info = SDL_GetVideoInfo( ); if( !info ) { // This should probably never happen. fprintf( stderr, "Video query failed: %s\n", SDL_GetError( ) ); exit( 1 ); } SDL_Surface *screen; // set quit cleanup callback atexit(SDL_Quit); /* * Set our width/height to 640/480 (you would * of course let the user decide this in a normal * app). We get the bpp we will request from * the display. On X11, VidMode can't change * resolution, so this is probably being overly * safe. Under Win32, ChangeDisplaySettings * can change the bpp. */ bpp = info->vfmt->BitsPerPixel; /* * Now, we want to setup our requested * window attributes for our OpenGL window. * We want *at least* 5 bits of red, green * and blue. We also want at least a 16-bit * depth buffer. * * The last thing we do is request a double * buffered window. '1' turns on double * buffering, '0' turns it off. * * Note that we do not use SDL_DOUBLEBUF in * the flags to SDL_SetVideoMode. That does * not affect the GL attribute state, only * the standard 2D blitting setup. */ SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); /* * We want to request that SDL provide us * with an OpenGL window, in a fullscreen * video mode. * * EXERCISE: * Make starting windowed an option, and * handle the resize events properly with * glViewport. */ flags = SDL_OPENGL; // | SDL_FULLSCREEN; /* * Set the video mode */ if( SDL_SetVideoMode( VIEW_WIDTH, VIEW_HEIGHT, bpp, flags ) == 0 ) { /* * This could happen for a variety of reasons, * including DISPLAY not being set, the specified * resolution not being available, etc. */ fprintf( stderr, "Video mode set failed: %s\n", SDL_GetError( ) ); exit( 1 ); } SDL_WM_SetCaption("E3D Example 4 - Tailgunner", ""); // Set up our OpenGL env and build our display lists printf( "InitGL() returned %d\n", InitGL() ); float dx = 0.5f; float dy = 0.2f; float dz = 0.0f; // Main loop dyrot = 0.0; running = GL_TRUE; frames = 0; unsigned int ticks = SDL_GetTicks(); while( running ) { // limit fps to 50 frames per second while((SDL_GetTicks() - ticks) < 20) ; ticks = SDL_GetTicks(); // Get mouse position //SDL_PumpEvents(); Uint8 mousebutton = SDL_GetMouseState( &x, &y ); frames ++; // animate dz += 0.05f; pObject = Scene.GetObject(0, 0); // sights pObject->rotation.z = dz; pObject->position.x = (float)((VIEW_WIDTH/2) - x) / 40.0f; pObject->position.y = (float)((VIEW_HEIGHT/2) - y) / 40.0f; // BEGIN BEHAVIOURS // Behaviours 1: Enemy objects (gliders) OBJLIST* objList = Scene.GetObjectList(ENEMY_LIST); OBJLIST::iterator objIter; for(objIter = objList->begin(); objIter != objList->end(); objIter++) { if(1 == objIter->modelNumber) { // this is a glider if(1 == objIter->behaviour) { objIter->SetRotation(0.0f, DEG2RAD(180), 0.0f); objIter->position.z -= 1.0f; if(objIter->position.z < 0.0f) objIter->position.z = 300.0f + rand() % 50; } } } // Behaviours 2: Bullets objList = Scene.GetObjectList(BULLET_LIST); for(objIter = objList->begin() ; objIter != objList->end(); objIter++) { if(3 == objIter->modelNumber) { if(1 == objIter->behaviour) // active { objIter->position += objIter->velocity; // check if this bullet has hit any gliders OBJLIST* gliderList = Scene.GetObjectList(ENEMY_LIST); OBJLIST::iterator gliderIter; for(gliderIter = gliderList->begin() ; gliderIter != gliderList->end(); gliderIter++) { if(1 == gliderIter->behaviour) // glider active { if(fabs(gliderIter->position.z - objIter->position.z) < 5.0f) { if(fabs(gliderIter->position.x - objIter->position.x) < 5.0f) { if(fabs(gliderIter->position.y - objIter->position.y) < 5.0f) { // hit! Vector v(0.0f, 0.0f, -1.0f); addFrags(gliderIter->position, v); gliderIter->position.z = 0.0f; gliderIter->position.x = 50.0f; gliderIter->behaviour = 0; // switch off glider objIter->counter = 1; // expire bullet } } } } } // next glider if(objIter->counter) objIter->counter--; // decrement counter if(!objIter->counter) { objIter->behaviour = 0; // switch off if finished count objIter->position.z = 0.0f; } } } // end if bullet } // next // Behaviours 3: Fragments objList = Scene.GetObjectList(FRAG_LIST); for(objIter = objList->begin() ; objIter != objList->end(); objIter++) { if(2 == objIter->modelNumber) { if(1 == objIter->behaviour) { objIter->position += objIter->velocity; objIter->rotation += (objIter->velocity * 0.1f); if(objIter->counter) objIter->counter--; // decrement counter if(!objIter->counter) { objIter->behaviour = 0; // switch off if finished count objIter->position.x = 50.0f; objIter->position.z = 0.0f; } } } } // END BEHAVIOURS DrawGLScene(); // Swap the double-buffer SDL_GL_SwapBuffers( ); // Poll for the next event SDL_Event event; SDL_PollEvent( &event ); // Check if the ESC key was pressed or the window was closed Uint8 *keys = SDL_GetKeyState(NULL); if ( keys[SDLK_ESCAPE] == SDL_PRESSED ) { running = 0; } // get Mouse Button if(mousebutton & SDL_BUTTON(1)) { if(0 == debounce) { // find first free bullet and launch it OBJLIST* bulletList = Scene.GetObjectList(BULLET_LIST); OBJLIST::iterator bulletIter; //for(bulletIter = bulletList.begin(); bulletIter != bulletList.end(); bulletIter++) for(bulletIter = bulletList->begin(); bulletIter != bulletList->end(); bulletIter++) { if(0 == bulletIter->behaviour) { bulletIter->behaviour = 1; bulletIter->counter = 100; bulletIter->SetPosition(-1.0f, -1.0f, 0.0f); bulletIter->velocity.x = (float)((VIEW_WIDTH/2) - x) / 200.0f; bulletIter->velocity.y = (float)((VIEW_HEIGHT/2) - y) / 200.0f; bulletIter->velocity.z = 2.0f; bulletIter->rotation.y = (float)((VIEW_WIDTH/2) - x) / 400.0f; bulletIter->rotation.x = (float)((VIEW_HEIGHT/2) - y) / -400.0f; //bulletIter = bulletList->end(); break; } } debounce = 12; } } // end if mousebutton if(debounce) debounce--; } // wend printf("Quiting SDL.\n"); // Shutdown all subsystems SDL_Quit(); exit(0); }
///////////////////////////////////////////////////////////////////////////////// // Main loop ///////////////////////////////////////////////////////////////////////////////// int main(void) { BOOL done=FALSE; // Bool Variable To Exit Loop short i, j; //char stemp[256]; int debounce = 0; //int width; //int height; int running, frames, x, y; double t, t0, fps; char titlestr[ 200 ]; int scr_mode; E3D_Object *pObject; scr_mode = GLFW_WINDOW; Scene.Start(); Scene.SetRenderDistance(400.0f); // Set up the default light (light 0) E3D_Light *light0 = Scene.GetLight(0); light0->SetColour( 0.8f, 0.8f, 0.6f ); light0->SetAmbient( 0.4f, 0.4f, 0.4f ); light0->SetDirection( 0.707f, 0.707f, 0.0f ); // Set up the default camera (camera 0) E3D_Camera *camera = Scene.GetCamera(0); camera->SetPosition(0.0f, 0.0f, 0.0f); camera->SetDirection(0.0f, 0.0f, 1.0f); camera->SetUpVector(0.0f, 1.0f, 0.0f); camera->SetFOV(60.0f); Scene.AddModel("sights", "sights.obj"); Scene.AddModel("glider", "glider.obj"); Scene.AddModel("frag", "frag.obj"); Scene.AddModel("laser_yellow", "laser_yellow.obj"); Scene.AddModel("laser_green", "laser_green.obj"); // add sights pObject = Scene.AddObject(PLAYER_LIST, "sights"); pObject->SetPosition(0.0f, 0.0f, 10.0f); // add some bullets for(i=0; i<8; i++) { pObject = Scene.AddObject(BULLET_LIST, "laser_yellow"); pObject->SetPosition(50.0f, 0.0f, 0.0f); // offscreen } // add some fragments (objects 10 to 50) for(i=0; i<30; i++) { pObject = Scene.AddObject(FRAG_LIST, "frag"); pObject->SetPosition(50.0f, 0.0f, 0.0f); // offscreen } // manufacture some gliders for(i=0; i<160; i++) { pObject = Scene.AddObject(ENEMY_LIST, "glider"); pObject->SetPosition((float)(rand() % 100 - 50), (float)(rand() % 80 - 40), 50.0f + (float)(rand() % 300)); pObject->behaviour = 1; } // Initialise GLFW if(glfwInit() != GL_TRUE) return(1); // Open OpenGL window if( !glfwOpenWindow( VIEW_WIDTH, VIEW_HEIGHT, 0,0,0,0, 0,0, scr_mode ) ) { glfwTerminate(); return 0; } glfwSetWindowTitle( "E3DOO Win32OpenGL Example1" ); glfwSetWindowSizeCallback( ResizeWindow ); //printf("Refresh rate: %d \n", glfwGetWindowParam(GLFW_REFRESH_RATE)); //printf("ext1: %d \n", glfwExtensionSupported("GL_ARB_multitexture")); // Disable vertical sync (on cards that support it) glfwSwapInterval( 1 ); // Set up our OpenGL env and build our display lists printf( "InitGL() returned %d\n", InitGL() ); // Swap buffers glfwSwapBuffers(); float dx = 0.5f; float dy = 0.2f; float dz = 0.0f; // Main loop dyrot = 0.0; running = GL_TRUE; frames = 0; t0 = glfwGetTime(); double startTime = t0; glfwDisable(GLFW_MOUSE_CURSOR); while( running ) { // fps limiter while((glfwGetTime() - startTime) < 0.02) ; startTime = glfwGetTime(); // Get time and mouse position t = glfwGetTime(); glfwGetMousePos( &x, &y ); // Calculate and display FPS (frames per second) if( (t-t0) > 1.0 || frames == 0 ) { fps = (double)frames / (t-t0); sprintf( titlestr, "E3DOO Win32OpenGL Example1 (%.1f FPS) %d objects", fps, Scene.GetNumObjects()); glfwSetWindowTitle( titlestr ); t0 = t; frames = 0; } frames ++; // animate dz += 0.05f; pObject = Scene.GetObject(0, 0); // sights pObject->rotation.z = dz; pObject->position.x = (float)((VIEW_WIDTH/2) - x) / 40.0f; pObject->position.y = (float)((VIEW_HEIGHT/2) - y) / 40.0f; // BEGIN BEHAVIOURS // Behaviours 1: Enemy objects (gliders) OBJLIST* objList = Scene.GetObjectList(ENEMY_LIST); OBJLIST::iterator objIter; for(objIter = objList->begin(); objIter != objList->end(); objIter++) { if(1 == objIter->modelNumber) { // this is a glider if(1 == objIter->behaviour) { objIter->SetRotation(0.0f, DEG2RAD(180), 0.0f); objIter->position.z -= 1.0f; if(objIter->position.z < 0.0f) objIter->position.z = 300.0f + rand() % 50; } } } // Behaviours 2: Bullets objList = Scene.GetObjectList(BULLET_LIST); for(objIter = objList->begin() ; objIter != objList->end(); objIter++) { if(3 == objIter->modelNumber) { if(1 == objIter->behaviour) // active { objIter->position += objIter->velocity; // check if this bullet has hit any gliders OBJLIST* gliderList = Scene.GetObjectList(ENEMY_LIST); OBJLIST::iterator gliderIter; for(gliderIter = gliderList->begin() ; gliderIter != gliderList->end(); gliderIter++) { if(1 == gliderIter->behaviour) // glider active { if(fabs(gliderIter->position.z - objIter->position.z) < 5.0f) { if(fabs(gliderIter->position.x - objIter->position.x) < 5.0f) { if(fabs(gliderIter->position.y - objIter->position.y) < 5.0f) { // hit! Vector v(0.0f, 0.0f, -1.0f); addFrags(gliderIter->position, v); gliderIter->position.z = 0.0f; gliderIter->position.x = 50.0f; gliderIter->behaviour = 0; // switch off glider objIter->counter = 1; // expire bullet } } } } } // next glider if(objIter->counter) objIter->counter--; // decrement counter if(!objIter->counter) { objIter->behaviour = 0; // switch off if finished count objIter->position.z = 0.0f; } } } // end if bullet } // next // Behaviours 3: Fragments objList = Scene.GetObjectList(FRAG_LIST); for(objIter = objList->begin() ; objIter != objList->end(); objIter++) { if(2 == objIter->modelNumber) { if(1 == objIter->behaviour) { objIter->position += objIter->velocity; objIter->rotation += (objIter->velocity * 0.1f); if(objIter->counter) objIter->counter--; // decrement counter if(!objIter->counter) { objIter->behaviour = 0; // switch off if finished count objIter->position.x = 50.0f; objIter->position.z = 0.0f; } } } } // END BEHAVIOURS DrawGLScene(); // Swap buffers glfwSwapBuffers(); // Check if the ESC key was pressed or the window was closed running = !glfwGetKey( GLFW_KEY_ESC ) && glfwGetWindowParam( GLFW_OPENED ); // get Mouse Button if(glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS) { if(0 == debounce) { // find first free bullet and launch it OBJLIST* bulletList = Scene.GetObjectList(BULLET_LIST); OBJLIST::iterator bulletIter; //for(bulletIter = bulletList.begin(); bulletIter != bulletList.end(); bulletIter++) for(bulletIter = bulletList->begin(); bulletIter != bulletList->end(); bulletIter++) { if(0 == bulletIter->behaviour) { bulletIter->behaviour = 1; bulletIter->counter = 100; bulletIter->SetPosition(-1.0f, -1.0f, 0.0f); bulletIter->velocity.x = (float)((VIEW_WIDTH/2) - x) / 200.0f; bulletIter->velocity.y = (float)((VIEW_HEIGHT/2) - y) / 200.0f; bulletIter->velocity.z = 2.0f; bulletIter->rotation.y = (float)((VIEW_WIDTH/2) - x) / 400.0f; bulletIter->rotation.x = (float)((VIEW_HEIGHT/2) - y) / -400.0f; //bulletIter = bulletList->end(); break; } } debounce = 12; } } if(glfwGetMouseButton(GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS) { } if(debounce) debounce--; } // wend // Close OpenGL window and terminate GLFW glfwEnable(GLFW_MOUSE_CURSOR); glfwTerminate(); return 0; // Exit The Program }