editor now in a separate executable
This commit is contained in:
+33
-32
@@ -31,6 +31,39 @@ class View : public Engine::ViewBase {
|
||||
public:
|
||||
virtual ~View() {};
|
||||
|
||||
/** \brief Pushes the given state onto mViewStateStack */
|
||||
void PushViewState (const ViewState state) {
|
||||
Engine::LogDebug ("Pushing ViewState %s", GetStringViewState(state));
|
||||
mViewStateStack.push(state);
|
||||
|
||||
// Fire the view state change event to properly clear the IMGUI state
|
||||
Engine::EventBasePtr changeviewstate_event (new Engine::EventBase());
|
||||
changeviewstate_event->mEventType = EventChangeViewState;
|
||||
QueueEvent (changeviewstate_event);
|
||||
}
|
||||
/** \brief Returns the current ViewState */
|
||||
ViewState GetViewState () {
|
||||
return mViewStateStack.top();
|
||||
}
|
||||
/** \brief Removes the top element of the current ViewState stack */
|
||||
void PopViewState () {
|
||||
// Warning: you must not query for an invalid enum with
|
||||
// GetStringENUM_NAME!
|
||||
std::string popped_name = GetStringViewState(mViewStateStack.top());
|
||||
mViewStateStack.pop();
|
||||
|
||||
std::string current_name ("None");
|
||||
if (mViewStateStack.size() > 0)
|
||||
current_name = GetStringViewState(mViewStateStack.top());
|
||||
|
||||
Engine::LogDebug("Popped ViewState: %s current %s remaining: %u", popped_name.c_str(), current_name.c_str(), mViewStateStack.size());
|
||||
|
||||
// Fire the view state change event to properly clear the IMGUI state
|
||||
Engine::EventBasePtr changeviewstate_event (new Engine::EventBase());
|
||||
changeviewstate_event->mEventType = EventChangeViewState;
|
||||
QueueEvent (changeviewstate_event);
|
||||
}
|
||||
|
||||
protected:
|
||||
/** \brief Initializes the system */
|
||||
virtual int OnInit (int argc, char* argv[]);
|
||||
@@ -74,38 +107,6 @@ class View : public Engine::ViewBase {
|
||||
/** \brief The ViewState stack that is used for non-linear menus */
|
||||
std::stack<ViewState> mViewStateStack;
|
||||
|
||||
/** \brief Pushes the given state onto mViewStateStack */
|
||||
void PushViewState (const ViewState state) {
|
||||
Engine::LogDebug ("Pushing ViewState %s", GetStringViewState(state));
|
||||
mViewStateStack.push(state);
|
||||
|
||||
// Fire the view state change event to properly clear the IMGUI state
|
||||
Engine::EventBasePtr changeviewstate_event (new Engine::EventBase());
|
||||
changeviewstate_event->mEventType = EventChangeViewState;
|
||||
QueueEvent (changeviewstate_event);
|
||||
}
|
||||
/** \brief Returns the current ViewState */
|
||||
ViewState GetViewState () {
|
||||
return mViewStateStack.top();
|
||||
}
|
||||
/** \brief Removes the top element of the current ViewState stack */
|
||||
void PopViewState () {
|
||||
// Warning: you must not query for an invalid enum with
|
||||
// GetStringENUM_NAME!
|
||||
std::string popped_name = GetStringViewState(mViewStateStack.top());
|
||||
mViewStateStack.pop();
|
||||
|
||||
std::string current_name ("None");
|
||||
if (mViewStateStack.size() > 0)
|
||||
current_name = GetStringViewState(mViewStateStack.top());
|
||||
|
||||
Engine::LogDebug("Popped ViewState: %s current %s remaining: %u", popped_name.c_str(), current_name.c_str(), mViewStateStack.size());
|
||||
|
||||
// Fire the view state change event to properly clear the IMGUI state
|
||||
Engine::EventBasePtr changeviewstate_event (new Engine::EventBase());
|
||||
changeviewstate_event->mEventType = EventChangeViewState;
|
||||
QueueEvent (changeviewstate_event);
|
||||
}
|
||||
/** \brief Removes all elements of the ViewState stack */
|
||||
void ResetViewState() {
|
||||
Engine::LogDebug ("Resetting ViewState stack");
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
|
||||
#include "Engine.h"
|
||||
|
||||
#include "Controller.h"
|
||||
#include "View.h"
|
||||
#include "Model.h"
|
||||
#include "Physics.h"
|
||||
#include "EntityFactory.h"
|
||||
|
||||
#include "Game.h"
|
||||
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
|
||||
/* Returns a path where files such as logs and config files can be
|
||||
* written to
|
||||
*/
|
||||
std::string create_user_path () {
|
||||
std::string result_dir = ".";
|
||||
std::string test_file_path = result_dir;
|
||||
|
||||
// first we check in $HOME/.fysxasteroids
|
||||
char* env_home_dir = getenv("HOME");
|
||||
result_dir = env_home_dir;
|
||||
result_dir += "/.fysxasteroids";
|
||||
|
||||
boost::filesystem::path result_dir_path(result_dir);
|
||||
if(!boost::filesystem::is_directory (result_dir_path)) {
|
||||
if (!boost::filesystem::create_directory(result_dir_path)) {
|
||||
cerr << "Warning: could not create user data directory " << result_dir<< endl;
|
||||
result_dir = "";
|
||||
}
|
||||
}
|
||||
|
||||
test_file_path = result_dir;
|
||||
test_file_path += "/game.log";
|
||||
ofstream test_file (test_file_path.c_str(), ios_base::app);
|
||||
if (!test_file) {
|
||||
test_file.close();
|
||||
cerr << "Warning: user data directory not writable! " << result_dir << endl;
|
||||
result_dir = "";
|
||||
} else {
|
||||
test_file.close();
|
||||
return result_dir;
|
||||
}
|
||||
|
||||
// then we check the local directory
|
||||
result_dir = ".";
|
||||
test_file_path = result_dir;
|
||||
test_file_path += "/game.log";
|
||||
test_file.open (test_file_path.c_str(), ios_base::out);
|
||||
if (test_file) {
|
||||
test_file.close();
|
||||
return result_dir;
|
||||
} else {
|
||||
cerr << "Warning could not find suitable user data directory" << endl;
|
||||
result_dir = "";
|
||||
}
|
||||
test_file.close();
|
||||
|
||||
return result_dir;
|
||||
}
|
||||
|
||||
std::string find_game_data_dir () {
|
||||
std::string result;
|
||||
|
||||
std::vector<std::string> paths;
|
||||
paths.push_back(".");
|
||||
paths.push_back("/usr/local/share/fysxasteroids");
|
||||
paths.push_back("/usr/share/fysxasteroids");
|
||||
|
||||
std::vector<std::string>::iterator iter = paths.begin();
|
||||
for (iter; iter != paths.end(); iter++) {
|
||||
std::string test_path = *iter;
|
||||
|
||||
if (!boost::filesystem::is_directory(test_path + "/data/fonts"))
|
||||
continue;
|
||||
if (!boost::filesystem::is_directory(test_path + "/data/levels"))
|
||||
continue;
|
||||
if (!boost::filesystem::is_directory(test_path + "/data/sounds"))
|
||||
continue;
|
||||
if (!boost::filesystem::is_directory(test_path + "/data/textures"))
|
||||
continue;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (iter != paths.end())
|
||||
return *iter;
|
||||
|
||||
cerr << "Could not find game data" << endl;
|
||||
return result;
|
||||
}
|
||||
|
||||
int main (int argc, char* argv[]) {
|
||||
cout << "Game Start" << endl;
|
||||
|
||||
#ifdef WIN32
|
||||
HWND hWnd = GetConsoleWindow();
|
||||
ShowWindow( hWnd, SW_HIDE );
|
||||
#endif
|
||||
|
||||
Engine::Engine engine;
|
||||
|
||||
engine.SetEntityFactory (new asteroids::EntityFactory);
|
||||
engine.SetController (new asteroids::Controller);
|
||||
engine.SetModel (new asteroids::Model);
|
||||
engine.SetPhysics (new asteroids::Physics);
|
||||
engine.SetView (new asteroids::View);
|
||||
|
||||
SetLogPrintLevel (Engine::LogLevelMessage);
|
||||
|
||||
// we assume the user path to be local folder
|
||||
std::string user_path = create_user_path();
|
||||
std::string log_file_path = user_path;
|
||||
log_file_path += "/editor.log";
|
||||
|
||||
cout << "User Data Dir = " << user_path << endl;
|
||||
engine.SetUserDataPath (user_path);
|
||||
Engine::SetLogFilename (log_file_path.c_str());
|
||||
|
||||
std::string game_data_path = find_game_data_dir();
|
||||
engine.SetGameDataPath (game_data_path);
|
||||
cout << "Game Data Dir = " << game_data_path << endl;
|
||||
|
||||
if (engine.Init (argc, argv) != 0) {
|
||||
cout << "Could not start engine!" << endl;
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
Engine::SetMusicVolume (0.);
|
||||
|
||||
// Load the icon
|
||||
Uint32 colorkey;
|
||||
SDL_Surface *image = NULL;
|
||||
image = SDL_LoadBMP("./data/textures/icon.bmp");
|
||||
if (!image)
|
||||
Engine::LogWarning("Could not load icon: ./data/textures/icon.bmp");
|
||||
else
|
||||
SDL_WM_SetIcon(image,NULL);
|
||||
|
||||
SDL_WM_SetCaption("Asteroids -BETA1-","Asteroids -BETA 1-");
|
||||
|
||||
engine.GetView()->SetGridSize (8,8);
|
||||
|
||||
/// \todo get rid of the world settings in asteroids
|
||||
dynamic_cast<asteroids::Physics*>(engine.GetPhysics())->SetWorldSize (26, 20);
|
||||
engine.GetPhysics()->SetWorldBounds (vector3d (-13, 0, -10), vector3d (13, 0, 10));
|
||||
engine.GetPhysics()->EnableWorldWarp(Engine::PhysicsBase::WorldWarpModeX);
|
||||
engine.GetPhysics()->EnableWorldWarp(Engine::PhysicsBase::WorldWarpModeZ);
|
||||
|
||||
// run the default commands and load the configuration
|
||||
Engine::RunCommand ("exec asteroids.rc");
|
||||
Engine::RunCommand ("exec config.rc");
|
||||
|
||||
asteroids::GetView()->PopViewState();
|
||||
asteroids::GetView()->PushViewState(asteroids::ViewStateEditor);
|
||||
|
||||
engine.MainLoop ();
|
||||
|
||||
SDL_WM_SetIcon(NULL,NULL);
|
||||
SDL_FreeSurface (image);
|
||||
|
||||
engine.Destroy ();
|
||||
|
||||
cout << "Game Quit" << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -105,9 +105,6 @@ int main (int argc, char* argv[]) {
|
||||
ShowWindow( hWnd, SW_HIDE );
|
||||
#endif
|
||||
|
||||
create_dir ("./root");
|
||||
create_dir ("./root/blaa");
|
||||
|
||||
Engine::Engine engine;
|
||||
|
||||
engine.SetEntityFactory (new asteroids::EntityFactory);
|
||||
|
||||
Reference in New Issue
Block a user