![]() |
Unuk 1.0
|
00001 #ifdef WIN32 00002 #include <windows.h> 00003 #endif 00004 00005 #include <X11/Xlib.h> 00006 #include <GL/gl.h> 00007 #include <GL/glu.h> 00008 #include <GL/glut.h> 00009 #include <cstdlib> 00010 00011 #include "SDL/SDL.h" 00012 #include "Game.h" 00013 #include "Player.h" 00014 #include "../libUnuk/Input.h" 00015 #include "../libUnuk/Sprite.h" 00016 #include "../libUnuk/Debug.h" 00017 00018 Game::Game(void) { 00019 m_assets = false; 00020 //m_player = new Player(); 00021 //m_player->SetSprite(); 00022 m_rotationAngle = 0.0f; 00023 } 00024 00025 Game::~Game(void) { 00026 DeleteAssets(); 00027 } 00028 00029 bool Game::Init(void) { 00030 glEnable(GL_DEPTH_TEST); 00031 glDepthFunc(GL_LEQUAL); 00032 00033 LoadAssets(); 00034 m_assets = true; 00035 00036 return true; 00037 } 00038 00039 void Game::Prepare(float dt) { 00040 glEnable(GL_BLEND); 00041 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 00042 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 00043 glShadeModel(GL_FLAT); 00044 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 00045 00046 Sprite::Enable2D(); 00047 00048 m_player->Prepare(); 00049 00050 const float SPEED = 15.0f; 00051 m_rotationAngle += SPEED * dt; 00052 if(m_rotationAngle > 360.0f) { 00053 m_rotationAngle -= 360.0f; 00054 } 00055 } 00056 00057 void Game::Render(void) { 00058 static GLint T0 = 0; 00059 static GLint frames = 0; 00060 00061 glClear(GL_COLOR_BUFFER_BIT); 00062 glRasterPos2i(0, 0); 00063 00064 // Draw the test image. 00065 if(m_assets) { 00066 m_player->Render(); 00067 } 00068 00069 glFlush(); 00070 00071 glDisable(GL_TEXTURE_2D); 00072 00073 // Get frames per second. 00074 frames++; 00075 { 00076 GLint t = SDL_GetTicks(); 00077 if (t - T0 >= 5000) { 00078 GLfloat seconds = (t - T0) / 1000.0f; 00079 GLfloat fps = frames / seconds; 00080 Debug::logger->message("\n%d frames in %g seconds = %g FPS", frames, seconds, fps); 00081 T0 = t; 00082 frames = 0; 00083 } 00084 } 00085 } 00086 00087 void Game::Shutdown(void) { 00088 Debug::logger->message("\n\n-----Cleaning Up-----"); 00089 m_player->CleanUp(); 00090 delete m_player; 00091 Debug::logger->message("\nPlayer Deleted."); 00092 Debug::closeLog(); 00093 } 00094 00095 void Game::UpdateProjection(void) { 00096 GLint iViewport[4]; 00097 00098 // Get a copy of the viewport. 00099 glGetIntegerv(GL_VIEWPORT, iViewport); 00100 glPushMatrix(); 00101 glLoadIdentity(); 00102 00103 // Save a copy of the projection matrix so that we can restore 00104 // it when it's time to do 3D rendering again. 00105 glMatrixMode(GL_PROJECTION); 00106 glPushMatrix(); 00107 glLoadIdentity(); 00108 00109 // Set up the orthographic projection. 00110 glOrtho( iViewport[0], iViewport[0] + iViewport[2], 00111 iViewport[1] + iViewport[3], iViewport[1], -1, 1); 00112 glMatrixMode(GL_MODELVIEW); 00113 glPushMatrix(); 00114 glLoadIdentity(); 00115 00116 // Make sure depth testing and lighting are disabled for 2D rendering 00117 //until we are finished rendering in 2D. 00118 glPushAttrib(GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT); 00119 glDisable(GL_DEPTH_TEST); 00120 glDisable(GL_LIGHTING); 00121 00122 // glMatrixMode(GL_PROJECTION); 00123 // glLoadIdentity(); 00124 // 00125 // // Set up the orthographic projection. 00126 // glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, 1000.0); 00127 // 00128 // glMatrixMode(GL_MODELVIEW); 00129 // glLoadIdentity(); 00130 } 00131 00132 void Game::OnResize(int width, int height) { 00133 // Let's see you divide by zero now! 00134 if(height == 0) { height = 1; } 00135 00136 // Set the viewport to the window size. 00137 glViewport(0, 0, width, height); 00138 00139 // Set the projection. 00140 UpdateProjection(); 00141 } 00142 00143 void Game::LoadAssets(void) { 00144 m_player = new Player(); 00145 m_player->SetSprite(); 00146 } 00147 00148 void Game::DeleteAssets(void) { 00149 delete m_player; 00150 }