[go: up one dir, main page]

Menu

[r12]: / Game.cpp  Maximize  Restore  History

Download this file

169 lines (131 with data), 5.0 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "main.h"
#include <time.h>
Game::Game(CSettings* sett) {
settings = sett;
for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i) KeyIsDown[i] = false;
}
Game::~Game() {
}
// FIXME: make another class for logging
int Game::error(int errnum, const char errmsg[])
{
cerr << "ERROR: " << errmsg << " (error ID: " << errnum << ")" << endl;
return errnum;
}
int Game::warning(int errnum, const char errmsg[])
{
cerr << "WARNING: " << errmsg << " (error ID: " << errnum << ")" << endl;
return errnum;
}
void Game::info(const char errmsg[])
{
cout << "INFO: " << errmsg << endl;
}
void Game::debug(const char errmsg[])
{
cout << "DEBUG: " << errmsg << endl;
}
int Game::start() {
if(settings->DriverType==EDT_COUNT) return error(1, "User not selected driver");
debug("Creating device...");
irr::SIrrlichtCreationParameters params;
params.DriverType = settings->DriverType;
params.WindowSize = dimension2d<u32>(800, 600);
params.EventReceiver = this;
device = createDeviceEx(params);
if(!device) return error(2, "Failed to create device");
debug("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, "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));
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)
{
// FIXME: move game name to constant to allow forking easily
core::stringw str = L"Colonization [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
} else device->getCursorControl()->setVisible(true);
delete loader;
device->drop();
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_KEY_INPUT_EVENT && event.KeyInput.PressedDown == false)
{
if ( event.KeyInput.Key == KEY_ESCAPE )
{
device->closeDevice();
}else
if (event.KeyInput.Key == KEY_F10)
{
camera->remove();
delete loader;
camera = device->getSceneManager()->addCameraSceneNodeFPS(0, 50.0f, .1f, -1, settings->keyMap, 9, false, 0.5f);
loader = new CMapLoader(device, "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
// FIXME: do not hardcode keys! At least use defined compile-time constants (run-time config would be better)
if (event.KeyInput.Key == KEY_F11) {
c8 buf[256];
// screenshot are taken without gamma!
IImage* image = device->getVideoDriver()->createScreenShot();
if (image)
{
// FIXME: Hard-coding device type names might cause incompatibility with future versions of Irrlicht.
//static const c8 *dName[] = { "null", "software", "burning", "d3d8", "d3d9", "opengl" };
time_t rawtime;
time(&rawtime);
struct tm * timeinfo;
timeinfo = localtime(&rawtime);
size_t slen = snprintf(buf, 256, "saves/screenshot/%s_%s_", loader->name, CDeviceNames::GetShortDriverName(device->getVideoDriver()->getDriverType()));
slen += strftime(buf+slen, 256-slen, "%Y-%m-%d_%H-%M-%S", timeinfo);
strncpy(buf+slen, ".jpg", 256-slen); // FIXME: do not hardcode file extension.
path filename(buf);
device->getVideoDriver()->writeImageToFile(image, filename, 100 );
image->drop();
char str[256];
snprintf(str, 256, "Screenshot taken: %s", buf+17);
info(str);
}
}
}
return false;
}
bool Game::IsKeyDown(EKEY_CODE keyCode)
{
return KeyIsDown[keyCode];
}