#include "main.h"
Game::Game(CSettings* sett, CLog* logging) {
settings = sett;
log = logging;
for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i) KeyIsDown[i] = false;
}
Game::~Game() {
}
int Game::start() {
if(settings->DriverType==EDT_COUNT) return log->error(1, "User not selected driver");
log->info("GAME", "Starting the game...");
irr::SIrrlichtCreationParameters params;
params.DriverType = settings->DriverType;
#ifdef CONFIG_FULLSCREEN
params.Fullscreen = true;
params.Vsync = true;
params.WindowSize = CDeviceInfo::GetScreenResolution();
log->debug("GAME", "Fullscreen mode");
#else
params.WindowSize = dimension2d<u32>(800, 600);
log->debug("GAME", "Windowed mode");
#endif
params.EventReceiver = this;
device = createDeviceEx(params);
if(!device) return log->error(2, "Failed to create device");
log->debug("GAME", "Device created!");
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
gui::IGUIEnvironment* env = device->getGUIEnvironment();
device->getCursorControl()->setVisible(false);
camera = smgr->addCameraSceneNodeFPS(0, 50.0f, .1f, -1, settings->keyMap, 9, false, 0.5f);
loader = new CMapLoader(device, log, "test");
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
loader->meta, camera, core::vector3df(5,5,5),
core::vector3df(0,-10,0));
camera->addAnimator(anim);
anim->drop(); // I'm done with the animator now
// And set the camera position so that it doesn't start off stuck in the geometry
camera->setPosition(core::vector3df(0.f, 20.f, 0.f));
camera->setTarget(core::vector3df(0.f, 0.f, 0.f));
log->info("GAME", "Loaded. Starting main loop...");
int lastFPS = -1;
while(device->run() && driver)
if (device->isWindowActive())
{
device->getCursorControl()->setVisible(false);
driver->beginScene(true, true, video::SColor(0,200,200,200));
smgr->drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
stringw str = L"";
str += PROJECT_NAME;
str += " [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
} else device->getCursorControl()->setVisible(true);
delete loader;
device->drop();
log->info("GAME", "Ending the game.");
return 0;
}
bool Game::OnEvent(const SEvent& event)
{
if(event.EventType == EET_KEY_INPUT_EVENT) KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;
if(event.EventType == EET_LOG_TEXT_EVENT) {
if(event.LogEvent.Level == ELL_INFORMATION) log->info("ENGINE", event.LogEvent.Text);
if(event.LogEvent.Level == ELL_WARNING) log->warning(0, "ENGINE", event.LogEvent.Text);
if(event.LogEvent.Level == ELL_ERROR) log->error(0, "ENGINE", event.LogEvent.Text);
if(event.LogEvent.Level == ELL_NONE) log->debug("ENGINE", event.LogEvent.Text);
return true;
}
if ( event.EventType == EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown == false)
{
if ( event.KeyInput.Key == KEY_ESCAPE )
{
device->closeDevice();
}
#ifdef CONFIG_DEBUG_MODE
else if(event.KeyInput.Key == KEY_KEY_M)
{
camera->remove();
delete loader;
camera = device->getSceneManager()->addCameraSceneNodeFPS(0, 50.0f, .1f, -1, settings->keyMap, 9, false, 0.5f);
loader = new CMapLoader(device, log, "test2");
scene::ISceneNodeAnimator* anim = device->getSceneManager()->createCollisionResponseAnimator(
loader->meta, camera, core::vector3df(5,5,5),
core::vector3df(0,-10,0));
camera->addAnimator(anim);
anim->drop(); // I'm done with the animator now
// And set the camera position so that it doesn't start off stuck in the geometry
camera->setPosition(core::vector3df(0.f, 20.f, 0.f));
camera->setTarget(core::vector3df(0.f, 0.f, 0.f));
}
else if(event.KeyInput.Key == KEY_KEY_P)
{
CObjLoader* obj = new CObjLoader(device, log, "robots/PracticeBot");
}
#endif
else if(event.KeyInput.Key == CONFIG_KEY_SCREENSHOT) {
c8 buf[256];
// screenshot are taken without gamma!
IImage* image = device->getVideoDriver()->createScreenShot();
if (image)
{
time_t rawtime;
time(&rawtime);
struct tm * timeinfo;
timeinfo = localtime(&rawtime);
size_t slen = snprintf(buf, 256, "saves/screenshot/%s_%s_", loader->name, CDeviceInfo::GetShortDriverName(device->getVideoDriver()->getDriverType()));
slen += strftime(buf+slen, 256-slen, "%Y-%m-%d_%H-%M-%S", timeinfo);
strncpy(buf+slen, CONFIG_SCREENSHOT_EXT, 256-slen);
path filename(buf);
device->getVideoDriver()->writeImageToFile(image, filename, 100 );
image->drop();
char str[256];
snprintf(str, 256, "Screenshot taken: %s", buf+17);
log->info("SCRSHOOT", str);
}
}
}
return false;
}
bool Game::IsKeyDown(EKEY_CODE keyCode)
{
return KeyIsDown[keyCode];
}