[Change] Cleaned up some of KonoM's Unit tests and GUI.

This commit is contained in:
Rtch90 2012-02-01 23:59:23 +00:00
parent 76517a7a5f
commit f7ae1af267

View File

@ -5,338 +5,330 @@
#include "../libUnuk/UI/EventHistory.h" #include "../libUnuk/UI/EventHistory.h"
Game::Game(void) { Game::Game(void) {
Debug::logger->message("Creating characters.."); Debug::logger->message("Creating characters..");
_player = new Player(&_map); _player = new Player(&_map);
_runGameReturnValue = gameMainMenu; _runGameReturnValue = gameMainMenu;
} }
Game::~Game(void) { Game::~Game(void) {
Debug::logger->message("\n----- Cleaning Up ------"); Debug::logger->message("\n----- Cleaning Up ------");
// cleaning _player up caused a nice seg fault. I'll look later. // cleaning _player up caused a nice seg fault. I'll look later.
//delete _player; //delete _player;
} }
gameNavVal_t Game::Run(const string savegameIDArg) { gameNavVal_t Game::Run(const string savegameIDArg) {
_player->SetXY(400, 400); _player->SetXY(400, 400);
_player->LoadSprites("../Data/Media/Images/Characters/Player.png", 40, 45); _player->LoadSprites("../Data/Media/Images/Characters/Player.png", 40, 45);
LoadSavegame(savegameIDArg); LoadSavegame(savegameIDArg);
// some weird bug. player->_exp is set to unreasonable number randomally after LoadSavegame returns.
_player->SetExpNeeded(Player::BASE_EXP_NEEDED);
int fps = 0; // some weird bug. player->_exp is set to unreasonable number randomally after LoadSavegame returns.
int frame = 0; _player->SetExpNeeded(Player::BASE_EXP_NEEDED);
int nextGameTick = SDL_GetTicks();
Timer frameTimer; int fps = 0;
frameTimer.Start(); int frame = 0;
int nextGameTick = SDL_GetTicks();
Timer fpsCalc; Timer frameTimer;
fpsCalc.Start(); frameTimer.Start();
Timer renderTimer; Timer fpsCalc;
Timer updateTimer; fpsCalc.Start();
_gameRenderTime.SetXY(10, 70); Timer renderTimer;
_gameRenderTime.SetTextBlended("Render - XX", vsmall, COLOUR_BLACK); Timer updateTimer;
_gameUpdateTime.SetXY(10, 90); stringstream playerHealth;
_gameUpdateTime.SetTextBlended("Update - XX", vsmall, COLOUR_BLACK); _playerHealth.SetXY(15, 27);
_playerHealth.SetTextBlended("Player Health - XX", vsmall, COLOUR_WHITE);
stringstream playerXYString; stringstream playerExp;
_playerXY.SetXY(10, 110); _playerExp.SetXY(15, 57);
_playerXY.SetTextBlended("Player coords - XX XX", vsmall, COLOUR_BLACK); _playerExp.SetTextBlended("Player Level XX (XX/XX)", vsmall, COLOUR_WHITE);
stringstream npcHealth; _gameRenderTime.SetXY(10, 90);
_npcHealth.SetXY(10, 130); _gameRenderTime.SetTextBlended("Render - XX", vsmall, COLOUR_BLACK);
_npcHealth.SetTextBlended("NPC X Health - XX", vsmall, COLOUR_BLACK);
_playerHealthBar.SetBackgroundRGB(0, 0, 0); _gameUpdateTime.SetXY(10, 110);
_playerHealthBar.SetForegroundRGB(255, 0, 0); _gameUpdateTime.SetTextBlended("Update - XX", vsmall, COLOUR_BLACK);
_playerHealthBar.SetXY(10, 20);
_playerHealthBar.SetWidthHeight(200, 25);
_playerExpBar.SetBackgroundRGB(0, 0, 0); stringstream playerXYString;
_playerExpBar.SetForegroundRGB(0, 0, 255); _playerXY.SetXY(10, 130);
_playerExpBar.SetXY(10, 50); _playerXY.SetTextBlended("Player coords - XX XX", vsmall, COLOUR_BLACK);
_playerExpBar.SetWidthHeight(200, 25);
_playerExpBar.SetProgress(0.0f);
stringstream playerHealth;
_playerHealth.SetXY(15, 27);
_playerHealth.SetTextBlended("Player Health - XX", vsmall, COLOUR_WHITE);
stringstream playerExp; _playerHealthBar.SetBackgroundRGB(0, 0, 0);
_playerExp.SetXY(15, 57); _playerHealthBar.SetForegroundRGB(255, 0, 0);
_playerExp.SetTextBlended("Player Level XX (XX/XX)", vsmall, COLOUR_WHITE); _playerHealthBar.SetXY(10, 20);
_playerHealthBar.SetWidthHeight(200, 25);
eventHistory = new EventHistory();
_playerExpBar.SetBackgroundRGB(0, 0, 0);
_gameRunning = true; _playerExpBar.SetForegroundRGB(0, 0, 255);
while(_gameRunning) { _playerExpBar.SetXY(10, 50);
_playerExpBar.SetWidthHeight(200, 25);
_playerExpBar.SetProgress(0.0f);
eventHistory = new EventHistory();
_gameRunning = true;
while(_gameRunning) {
bool stillRunning = true; bool stillRunning = true;
updateTimer.Start(); updateTimer.Start();
while((int)SDL_GetTicks() > nextGameTick) { while((int)SDL_GetTicks() > nextGameTick) {
HandleInput(); HandleInput();
if (!_gameRunning) { if (!_gameRunning) {
stillRunning = false; stillRunning = false;
break; break;
} }
UpdateGame(); UpdateGame();
nextGameTick += SKIP_TICKS; nextGameTick += SKIP_TICKS;
} }
updateTimer.Pause(); updateTimer.Pause();
if (!stillRunning) { if (!stillRunning) {
break; break;
} }
renderTimer.Start(); renderTimer.Start();
Render(); Render();
renderTimer.Pause(); renderTimer.Pause();
// Calculate and display our FPS. // Calculate and display our FPS.
if(fpsCalc.GetTicks() >= 1000) { if(fpsCalc.GetTicks() >= 1000) {
fps = frame / (fpsCalc.GetTicks() / 1000); fps = frame / (fpsCalc.GetTicks() / 1000);
stringstream caption; stringstream caption;
caption << "Unuk - FPS: " << fps; caption << "Unuk - FPS: " << fps;
SDL_WM_SetCaption(caption.str().c_str(), NULL); SDL_WM_SetCaption(caption.str().c_str(), NULL);
fpsCalc.Start(); fpsCalc.Start();
frame = 0; frame = 0;
playerHealth.str(""); playerHealth.str("");
playerHealth << "Player Health - " << _player->GetHealth(); playerHealth << "Player Health - " << _player->GetHealth();
_playerHealth.SetTextBlended(playerHealth.str(), vsmall, COLOUR_WHITE); _playerHealth.SetTextBlended(playerHealth.str(), vsmall, COLOUR_WHITE);
_playerHealthBar.SetProgress((float)_player->GetHealth() / 100.0f); _playerHealthBar.SetProgress((float)_player->GetHealth() / 100.0f);
playerExp.str("");
playerExp << "Player Level " << _player->GetLevel() << " (" << _player->GetExp() << "/" << _player->GetExpNeeded() << ")";
_playerExp.SetTextBlended(playerExp.str(), vsmall, COLOUR_WHITE);
_playerExpBar.SetProgress((float)_player->GetExp() / (float)_player->GetExpNeeded());
// Check to see if we are allowed to display debug info. playerExp.str("");
if(debugEnabled) { playerExp << "Player Level " << _player->GetLevel() << " (" << _player->GetExp() << "/" << _player->GetExpNeeded() << ")";
_gameUpdateTime.SetTextBlended("Update - " + updateTimer.GetTicksStr(), vsmall, COLOUR_BLACK); _playerExp.SetTextBlended(playerExp.str(), vsmall, COLOUR_WHITE);
_gameRenderTime.SetTextBlended("Render - " + renderTimer.GetTicksStr(), vsmall, COLOUR_BLACK);
playerXYString.str(""); _playerExpBar.SetProgress((float)_player->GetExp() / (float)_player->GetExpNeeded());
playerXYString << "Player coords: x" << _player->GetX() << ", y" << _player->GetY();
_playerXY.SetTextBlended(playerXYString.str(), vsmall, COLOUR_BLACK);
int npc0Health = 0; // Check to see if we are allowed to display debug info.
if(_map.GetWorld().GetNPCCount() == 0) { if(debugEnabled) {
npc0Health = 0; _gameUpdateTime.SetTextBlended("Update - " + updateTimer.GetTicksStr(), vsmall, COLOUR_BLACK);
} _gameRenderTime.SetTextBlended("Render - " + renderTimer.GetTicksStr(), vsmall, COLOUR_BLACK);
else {
npc0Health = _map.GetWorld().GetNPC(0)->GetHealth();
}
npcHealth.str(""); playerXYString.str("");
npcHealth << "NPC 0 Health: " << npc0Health; playerXYString << "Player coords: x" << _player->GetX() << ", y" << _player->GetY();
_npcHealth.SetTextBlended(npcHealth.str(), vsmall, COLOUR_BLACK); _playerXY.SetTextBlended(playerXYString.str(), vsmall, COLOUR_BLACK);
}
} int npc0Health = 0;
// Restrict the fps. if(_map.GetWorld().GetNPCCount() == 0) {
if(1000 / MAX_FPS > frameTimer.GetTicks()) { npc0Health = 0;
// SDL_Delay does not accept a float so for higher framerate }
// limits there's an innacuracy. This is as much as 3fps else {
// at a limit of 60fps. npc0Health = _map.GetWorld().GetNPC(0)->GetHealth();
SDL_Delay((1000 / MAX_FPS) - frameTimer.GetTicks()); }
} }
frameTimer.Start(); }
frame++; // Restrict the fps.
} if(1000 / MAX_FPS > frameTimer.GetTicks()) {
// SDL_Delay does not accept a float so for higher framerate
delete eventHistory; // limits there's an innacuracy. This is as much as 3fps
// at a limit of 60fps.
return _runGameReturnValue; SDL_Delay((1000 / MAX_FPS) - frameTimer.GetTicks());
}
frameTimer.Start();
frame++;
}
delete eventHistory;
return _runGameReturnValue;
} }
void Game::HandleInput(void) { void Game::HandleInput(void) {
if(_ingameMenu.GetStatus() == false) { if(_ingameMenu.GetStatus() == false) {
while(SDL_PollEvent(&event)) { while(SDL_PollEvent(&event)) {
_player->HandleInput(); _player->HandleInput();
if(event.key.type == SDL_KEYDOWN) { if(event.key.type == SDL_KEYDOWN) {
if(event.key.keysym.sym == SDLK_ESCAPE) if(event.key.keysym.sym == SDLK_ESCAPE)
_ingameMenu.SetStatus(true); _ingameMenu.SetStatus(true);
if(event.key.keysym.sym == SDLK_p) if(event.key.keysym.sym == SDLK_p)
debugEnabled = !debugEnabled; debugEnabled = !debugEnabled;
if(event.key.keysym.sym == SDLK_0) if(event.key.keysym.sym == SDLK_0)
eventHistory->LogEvent("Item gained."); eventHistory->LogEvent("Item gained.");
} }
else if(event.type == SDL_QUIT) { else if(event.type == SDL_QUIT) {
_gameRunning = false; _gameRunning = false;
_runGameReturnValue = gameQuitGame; _runGameReturnValue = gameQuitGame;
break; break;
} }
} }
} else { } else {
switch(_ingameMenu.HandleInput()) { switch(_ingameMenu.HandleInput()) {
case ingameMenuNothing: case ingameMenuNothing:
break; break;
case ingameMenuResume: case ingameMenuResume:
_ingameMenu.SetStatus(false); _ingameMenu.SetStatus(false);
break; break;
case ingameMenuSaveGame: case ingameMenuSaveGame:
SaveSavegame(); SaveSavegame();
_ingameMenu.SetStatus(false); _ingameMenu.SetStatus(false);
Debug::logger->message("Game Saved!"); Debug::logger->message("Game Saved!");
break; break;
case ingameMenuLoadGame: case ingameMenuLoadGame:
LoadSavegame(_saveGameID); LoadSavegame(_saveGameID);
_ingameMenu.SetStatus(false); _ingameMenu.SetStatus(false);
Debug::logger->message("Game Loaded!"); Debug::logger->message("Game Loaded!");
break; break;
case ingameMenuOptions: case ingameMenuOptions:
break; break;
case ingameMenuMainMenu: case ingameMenuMainMenu:
SDL_FillRect(screen, NULL, 0); SDL_FillRect(screen, NULL, 0);
_gameRunning = false; _gameRunning = false;
break; break;
} }
if(event.type == SDL_QUIT) { if(event.type == SDL_QUIT) {
_gameRunning = false; _gameRunning = false;
_ingameMenu.SetStatus(false); _ingameMenu.SetStatus(false);
_runGameReturnValue = gameQuitGame; _runGameReturnValue = gameQuitGame;
} }
} }
} }
void Game::UpdateGame(void) { void Game::UpdateGame(void) {
if(_ingameMenu.GetStatus() == false) { if(_ingameMenu.GetStatus() == false) {
_map.Update(); _map.Update();
_player->Update(); _player->Update();
} else { } else {
// :D // :D
} }
} }
void Game::Render(void) { void Game::Render(void) {
//SDL_FillRect(screen, NULL, 0); // You might want to clear the buffer! --konom | I don't want a blacked out ingame menu, save it for MainMenu. --Allanis //SDL_FillRect(screen, NULL, 0); // You might want to clear the buffer! --konom | I don't want a blacked out ingame menu, save it for MainMenu. --Allanis
if(_ingameMenu.GetStatus() == false) { if(_ingameMenu.GetStatus() == false) {
_map.Render(); _map.Render();
_player->Render(); _player->Render();
_playerHealthBar.DrawLiteral(); _playerHealthBar.DrawLiteral();
_playerHealth.RenderLiteral(); _playerHealth.RenderLiteral();
_playerExpBar.DrawLiteral();
_playerExp.RenderLiteral();
if(debugEnabled) {
_gameRenderTime.RenderLiteral();
_gameUpdateTime.RenderLiteral();
_playerXY.RenderLiteral();
_npcHealth.RenderLiteral();
}
eventHistory->Render(); _playerExpBar.DrawLiteral();
_playerExp.RenderLiteral();
} else { if(debugEnabled) {
_ingameMenu.Render(); _gameRenderTime.RenderLiteral();
} _gameUpdateTime.RenderLiteral();
SDL_Flip(screen); _playerXY.RenderLiteral();
_npcHealth.RenderLiteral();
}
eventHistory->Render();
} else {
_ingameMenu.Render();
}
SDL_Flip(screen);
} }
void Game::LoadSavegame(const string savegameIDArg) { void Game::LoadSavegame(const string savegameIDArg) {
_saveGameID = savegameIDArg; _saveGameID = savegameIDArg;
string saveFilename = "../Save/" + _saveGameID; string saveFilename = "../Save/" + _saveGameID;
// Converting to XML ftw! // Converting to XML ftw!
TiXmlDocument mapFile(saveFilename.c_str()); TiXmlDocument mapFile(saveFilename.c_str());
assert(mapFile.LoadFile() == true); assert(mapFile.LoadFile() == true);
TiXmlElement* rootElem = NULL;
TiXmlElement* dataElem = NULL;
// <save> - Grab a save file.
rootElem = mapFile.FirstChildElement("save");
assert(rootElem != NULL);
if(rootElem) {
// <name> - Parse the player name.
dataElem = rootElem->FirstChildElement("name");
assert(dataElem != NULL);
// Overloaded new/delete operator takes this out of scope.. TiXmlElement* rootElem = NULL;
// TODO: Fix. TiXmlElement* dataElem = NULL;
//_player->SetName(dataElem->GetText());
// </name> // <save> - Grab a save file.
rootElem = mapFile.FirstChildElement("save");
// <x> - Parse the player x coord. assert(rootElem != NULL);
dataElem = dataElem->NextSiblingElement("x"); if(rootElem) {
assert(dataElem != NULL); // <name> - Parse the player name.
int playerX = atoi(dataElem->GetText()); dataElem = rootElem->FirstChildElement("name");
// </x> assert(dataElem != NULL);
// <y> - Parse the player y coord. // Overloaded new/delete operator takes this out of scope..
dataElem = dataElem->NextSiblingElement("y"); // TODO: Fix.
assert(dataElem != NULL); //_player->SetName(dataElem->GetText());
int playerY = atoi(dataElem->GetText()); // </name>
// </y>
// <x> - Parse the player x coord.
_player->SetXY((float)playerX, (float)playerY); dataElem = dataElem->NextSiblingElement("x");
assert(dataElem != NULL);
// <map> - Parse the map file. int playerX = atoi(dataElem->GetText());
dataElem = dataElem->NextSiblingElement("map"); // </x>
assert(dataElem != NULL);
_map.Load(dataElem->GetText()); // <y> - Parse the player y coord.
// </map> dataElem = dataElem->NextSiblingElement("y");
} assert(dataElem != NULL);
// <save> int playerY = atoi(dataElem->GetText());
// </y>
// </save>
_player->SetXY((float)playerX, (float)playerY);
// <map> - Parse the map file.
dataElem = dataElem->NextSiblingElement("map");
assert(dataElem != NULL);
_map.Load(dataElem->GetText());
// </map>
}
// <save>
// </save>
} }
void Game::SaveSavegame(void) { void Game::SaveSavegame(void) {
string saveFilename = "../Save/" + _saveGameID; string saveFilename = "../Save/" + _saveGameID;
TiXmlDocument doc; TiXmlDocument doc;
TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "", ""); TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "", "");
TiXmlElement* saveElement = new TiXmlElement("save"); TiXmlElement* saveElement = new TiXmlElement("save");
TiXmlElement* nameElement = new TiXmlElement("name"); TiXmlElement* nameElement = new TiXmlElement("name");
TiXmlText* nameText = new TiXmlText("Allanis"); //TODO: replace with _player->GetName() when it works. --konom TiXmlText* nameText = new TiXmlText("Allanis"); //TODO: replace with _player->GetName() when it works. --konom
nameElement->LinkEndChild(nameText); nameElement->LinkEndChild(nameText);
std::stringstream xString; std::stringstream xString;
xString << _player->GetX(); xString << _player->GetX();
TiXmlElement* xElement = new TiXmlElement("x"); TiXmlElement* xElement = new TiXmlElement("x");
TiXmlText* xText = new TiXmlText(xString.str().c_str()); TiXmlText* xText = new TiXmlText(xString.str().c_str());
xElement->LinkEndChild(xText); xElement->LinkEndChild(xText);
std::stringstream yString; std::stringstream yString;
yString << _player->GetY(); yString << _player->GetY();
TiXmlElement* yElement = new TiXmlElement("y"); TiXmlElement* yElement = new TiXmlElement("y");
TiXmlText* yText = new TiXmlText(yString.str().c_str()); TiXmlText* yText = new TiXmlText(yString.str().c_str());
yElement->LinkEndChild(yText); yElement->LinkEndChild(yText);
TiXmlElement* mapElement = new TiXmlElement("map"); TiXmlElement* mapElement = new TiXmlElement("map");
TiXmlText* mapText = new TiXmlText("map"); //TODO: replace with actual map name. TiXmlText* mapText = new TiXmlText("map"); //TODO: replace with actual map name.
mapElement->LinkEndChild(mapText); mapElement->LinkEndChild(mapText);
saveElement->LinkEndChild(nameElement); saveElement->LinkEndChild(nameElement);
saveElement->LinkEndChild(xElement); saveElement->LinkEndChild(xElement);
saveElement->LinkEndChild(yElement); saveElement->LinkEndChild(yElement);
saveElement->LinkEndChild(mapElement); saveElement->LinkEndChild(mapElement);
doc.LinkEndChild(decl); doc.LinkEndChild(decl);
doc.LinkEndChild(saveElement); doc.LinkEndChild(saveElement);
doc.SaveFile(saveFilename.c_str()); doc.SaveFile(saveFilename.c_str());
} }