*******************************************************************************/
#include <cstdlib> // exit
-#include <iostream>
-#include <stdexcept>
#include <string>
#include <SDL/SDL.h>
#include "fastevents.h"
+#include <SDL/SDL_sound.h>
+#include <AL/alut.h>
#include "Dispatcher.hh"
#include "Engine.hh"
+#include "Log.hh"
#include "Random.hh"
#include "Settings.hh"
#include "Timer.hh"
namespace Mf {
-class Engine::EngineImpl
+class Engine::Impl
{
public:
- EngineImpl(const std::string& name, int argc, char* argv[],
- const std::string& configFile, Engine* outer) :
- settings(argc, argv),
+ Impl(int argc, char* argv[], const std::string& configFile,
+ const std::string& name, const std::string& iconFile,
+ Engine* outer) :
interface(outer)
{
+#if defined(_WIN32) || defined (_WIN64) || defined(__WIN32__)
+ if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
+#else
if (SDL_Init(SDL_INIT_EVERYTHING | SDL_INIT_EVENTTHREAD) != 0)
+#endif
{
- throw std::runtime_error(SDL_GetError());
+ logError("sdl is complaining: %s", SDL_GetError());
+ throw Exception(Exception::SDL_ERROR);
}
if (FE_Init() != 0)
{
- throw std::runtime_error(FE_GetError());
+ logError("fast events error: %s", FE_GetError());
+ throw Exception(Exception::SDL_ERROR);
}
+ if (Sound_Init() == 0)
+ {
+ logError("sound initialization failed: %s", Sound_GetError());
+ throw Exception(Exception::SDL_ERROR);
+ }
+ alutInit(&argc, argv);
- setSeed();
-
+ Settings& settings = Settings::getInstance();
+ settings.parseArgs(argc, argv);
settings.loadFromFile(configFile);
- video = VideoPtr(new Video(name));
- video->makeActive();
+ long randomSeed;
+ if (settings.get("engine.rngseed", randomSeed)) setSeed(randomSeed);
+ else setSeed();
double ts = 0.01;
settings.get("engine.timestep", ts);
printFps = false;
settings.get("video.printfps", printFps);
+
+ video = Video::alloc(name, iconFile);
+ video->makeActive();
}
- ~EngineImpl()
+ ~Impl()
{
- // The video object must be destroyed before we can shutdown SDL.
+ // the video object must be destroyed before we can shutdown SDL
video.reset();
+ alutExit();
+ Sound_Quit();
FE_Quit();
SDL_Quit();
}
* The main loop. This just calls dispatchEvents(), update(), and draw()
* over and over again. The timing of the update and draw are decoupled.
* The actual frame rate is also calculated here. This function will return
- * with a value of 0 if the member variable running becomes true.
+ * the exit code used to stop the loop.
*/
int run()
nextStep += timestep;
}
+ if (ticksNow >= nextStep)
+ {
+ nextStep = ticksNow + timestep;
+ }
if (ticksNow >= nextDraw)
{
if (printFps)
{
- std::cout << "FPS: " << fps << std::endl;
+ logInfo("framerate: %d fps", fps);
}
}
}
while (running);
- return 0;
+ return exitCode;
}
}
- Settings settings;
- Dispatcher dispatcher;
- VideoPtr video;
+ Engine* interface;
+
+ VideoP video;
bool running;
+ int exitCode;
Scalar timestep;
Scalar drawRate;
long fps;
bool printFps;
-
- Engine* interface;
};
-Engine::Engine(const std::string& name, int argc, char* argv[],
- const std::string& configFile) :
- impl_(new Engine::EngineImpl(name, argc, argv, configFile, this)) {}
+Engine::Engine(int argc, char* argv[], const std::string& configFile,
+ const std::string& name, const std::string& iconFile) :
+ impl_(new Engine::Impl(argc, argv, configFile, name, iconFile, this)) {}
Engine::~Engine() {}
return impl_->run();
}
-void Engine::stop()
+void Engine::stop(int exitCode)
{
impl_->running = false;
+ impl_->exitCode = exitCode;
}