This repository has been archived on 2026-04-30. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Tortuga/client/scene_manager.cpp
T

122 lines
2.5 KiB
C++

#include "scene_manager.hpp"
#include <stdexcept>
//-------------------------
//Scene headers
//-------------------------
//Add the custom scene headers here
#ifdef DEBUG
#include "test_systems.hpp"
#endif
#include "splash.hpp"
#include "main_menu.hpp"
#include "in_game.hpp"
#ifdef DEBUG
#include "lobby.hpp"
#include "combat.hpp"
#endif
//-------------------------
//Public access members
//-------------------------
SceneManager::SceneManager() {
activeScene = nullptr;
}
SceneManager::~SceneManager() {
UnloadScene();
}
void SceneManager::Init() {
if (SDL_Init(SDL_INIT_VIDEO)) {
throw(std::runtime_error("Failed to initialize SDL"));
}
if (SDLNet_Init()) {
throw(std::runtime_error("Failed to initialize SDL_net"));
}
configUtil.Load("rsc/config.cfg");
netUtil.Open(0, sizeof(Packet));
//set the screen from the config file
int flags = SDL_HWSURFACE|SDL_DOUBLEBUF;
if (configUtil.Boolean("screen.f")) {
flags |= SDL_FULLSCREEN;
}
BaseScene::SetScreen(configUtil.Integer("screen.w"),configUtil.Integer("screen.h"),0,flags);
}
void SceneManager::Proc() {
LoadScene(SceneList::FIRST);
//The main loop
while(activeScene->GetNextScene() != SceneList::QUIT) {
//switch scenes when necessary
if (activeScene->GetNextScene() != SceneList::CONTINUE) {
LoadScene(activeScene->GetNextScene());
continue;
}
//call each user defined function
activeScene->RunFrame();
}
UnloadScene();
}
void SceneManager::Quit() {
UnloadScene();
SDLNet_Quit();
SDL_Quit();
}
//-------------------------
//Private access members
//-------------------------
void SceneManager::LoadScene(SceneList sceneIndex) {
UnloadScene();
switch(sceneIndex) {
//add scene creation calls here
#ifdef DEBUG
case SceneList::TESTSYSTEMS:
activeScene = new TestSystems(&configUtil, &surfaceMgr, &netUtil);
break;
#endif
case SceneList::FIRST:
case SceneList::SPLASH:
activeScene = new Splash(&configUtil, &surfaceMgr);
break;
case SceneList::MAINMENU:
activeScene = new MainMenu(&configUtil, &surfaceMgr);
break;
case SceneList::INGAME:
activeScene = new InGame(&configUtil, &surfaceMgr, &netUtil);
break;
case SceneList::LOBBY:
activeScene = new Lobby(&configUtil, &surfaceMgr, &netUtil);
break;
#ifdef DEBUG
case SceneList::COMBAT:
activeScene = new Combat();
break;
#endif
default:
throw(std::logic_error("Failed to recognize the scene index"));
}
}
void SceneManager::UnloadScene() {
delete activeScene;
activeScene = nullptr;
}