#include "Video.h" #include "anaglym.h" #include "Engine.h" #include "SDL.h" #include /* exit() */ #include #include using namespace std; static void usage(); static void mainloop(); static Uint32 updateCallback(Uint32 interval, void * param); static bool lastDrawCompleted; static SDL_Event userEvent; Uint32 g_ticks; static void usage() { cerr << "Usage: anaglym [options] program.lua[c]" << endl; exit(42); } int main(int argc, char * argv[]) { const char * program = NULL; for (int i = 1; i < argc; i++) { if (argv[i][0] != '-') { if (program == NULL) { program = argv[i]; } else { cerr << "Warning: argument " << argv[i] << " ignored!" << endl; usage(); } } else { cerr << "Warning: Unrecognized option '" << argv[i]+1 << "'" << endl; usage(); } } if (program == NULL) { usage(); } lastDrawCompleted = true; /* setup SDL update event */ userEvent.type = SDL_USEREVENT; userEvent.user.code = 0; Video video; #if 0 /* start in windowed mode for debugging */ video.start(0, 0, false, false); #else video.start(); #endif g_engine = new Engine(argv[0]); if (g_engine->load(program)) { mainloop(); } delete g_engine; video.stop(); return 0; } /* called by SDL when the update timer expires */ static Uint32 updateCallback(Uint32 interval, void * param) { if (lastDrawCompleted) SDL_PushEvent(&userEvent); return interval; } static void mainloop() { SDL_Event event; /* register a screen redrawing SDL event */ SDL_AddTimer(25, &updateCallback, NULL); while (SDL_WaitEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_ESCAPE) { goto RET; } break; case SDL_QUIT: goto RET; break; case SDL_USEREVENT: if (event.user.code == 0) { /* TODO: update */ } break; } } RET: ; }