135 lines
3.1 KiB
C++
135 lines
3.1 KiB
C++
#ifdef _WIN32
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#define WIN32_EXTRA_LEAN
|
|
#endif
|
|
|
|
#define GLX_GLXEXT_LEGACY // Use our local glxext.h rather than the system one.
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
#include <SDL/SDL.h>
|
|
#include <SDL/SDL_mixer.h>
|
|
#include <SDL/SDL_ttf.h>
|
|
#include <GL/gl.h>
|
|
#include <time.h>
|
|
#include "Game.h"
|
|
#include "../IO/Input.h"
|
|
#include "../Global/Globals.h"
|
|
#include "../Global/Constants.h"
|
|
#include "../System/Debug.h"
|
|
|
|
using saracraft::util::Debug;
|
|
|
|
void Destroy(void) {
|
|
TTF_Quit();
|
|
Mix_CloseAudio();
|
|
DestroyInput();
|
|
SDL_FreeSurface(screen);
|
|
SDL_Quit();
|
|
}
|
|
|
|
static void ResizeWindow(Game& game, int w, int h) {
|
|
SDL_SetVideoMode(w, h, 32, SDL_OPENGL | SDL_RESIZABLE);
|
|
game.OnResize(w, h);
|
|
|
|
SDL_GL_SwapBuffers();
|
|
}
|
|
|
|
#ifdef _WIN32
|
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int cmdShow) {
|
|
#else
|
|
int main(int argc, char** argv) {
|
|
#endif
|
|
// Start by opening a debug log.
|
|
Debug::openLog(true);
|
|
Debug::logger->message("\n ----- Engine Loading -----");
|
|
|
|
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
|
|
Debug::logger->message("Error: Could not load SDL");
|
|
Destroy();
|
|
return 1;
|
|
} else {
|
|
Debug::logger->message("SDL loaded..");
|
|
}
|
|
|
|
// Setup OpenGL.
|
|
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_DOUBLEBUFFER, 1);
|
|
|
|
flags = SDL_OPENGL | SDL_HWSURFACE | SDL_RESIZABLE;
|
|
|
|
screen = SDL_SetVideoMode(windowWidth, windowHeight, 32, flags);
|
|
Debug::logger->message("Video mode set..");
|
|
|
|
if(Mix_OpenAudio(44100, AUDIO_S16, 2, 4096)) {
|
|
Debug::logger->message("Audio opened..");
|
|
}
|
|
|
|
if(TTF_Init()) {
|
|
Debug::logger->message("SDL_ttf initialized.\n");
|
|
}
|
|
|
|
info = SDL_GetVideoInfo();
|
|
if(!info) {
|
|
// This should never accur.
|
|
Debug::logger->message("Video query failed!");
|
|
Destroy();
|
|
return 1;
|
|
}
|
|
|
|
SDL_WM_SetCaption("LibD", NULL);
|
|
|
|
srand((unsigned int)time(NULL));
|
|
|
|
Debug::logger->message("\n ----- Engine Initialization Complete -----");
|
|
Debug::logger->message("\n ----- Logic -----");
|
|
|
|
Game game;
|
|
game.Init();
|
|
CreateInput();
|
|
|
|
Uint32 timeStart = SDL_GetTicks();
|
|
float dt = 1.0f / 60.0f;
|
|
|
|
// We need to give OnResize()'s width and height params an initial value
|
|
// Otherwise it is just garbage, and the orthorgraphic view
|
|
// screws up for me. -- Allanis.
|
|
game.OnResize(windowWidth, windowHeight);
|
|
|
|
while(game.IsRunning()) {
|
|
|
|
while(SDL_PollEvent(&event)) {
|
|
if((event.type == SDL_QUIT) || KeyStillDown(SDLK_ESCAPE)) {
|
|
game.SetRunning(false);
|
|
break;
|
|
}
|
|
if(event.type == SDL_VIDEORESIZE) {
|
|
// Resize the window.
|
|
ResizeWindow(game, event.resize.w, event.resize.h);
|
|
break;
|
|
}
|
|
}
|
|
|
|
UpdateInput();
|
|
game.Prepare(dt);
|
|
game.ProcessEvents(dt);
|
|
game.Render();
|
|
SDL_GL_SwapBuffers();
|
|
|
|
Uint32 timeEnd = SDL_GetTicks();
|
|
dt = (float)(timeEnd - timeStart) / 1000.0f;
|
|
timeStart = timeEnd;
|
|
}
|
|
|
|
game.Shutdown();
|
|
|
|
Destroy();
|
|
|
|
Debug::closeLog();
|
|
return 0;
|
|
}
|