From d9ffa22b7602cab0722fd2a5212a1e3b5466e2cf Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sun, 23 Jun 2013 16:19:35 +1000 Subject: [PATCH] Created the editor shell --- editor/base_scene.cpp | 139 +++++++++++++++++++++++++++++++++++++++ editor/base_scene.hpp | 74 +++++++++++++++++++++ editor/main.cpp | 47 +++++++++++++ editor/makefile | 39 +++++++++++ editor/map_editor.cpp | 82 +++++++++++++++++++++++ editor/map_editor.hpp | 48 ++++++++++++++ editor/scene_list.hpp | 35 ++++++++++ editor/scene_manager.cpp | 118 +++++++++++++++++++++++++++++++++ editor/scene_manager.hpp | 48 ++++++++++++++ makefile | 1 + 10 files changed, 631 insertions(+) create mode 100644 editor/base_scene.cpp create mode 100644 editor/base_scene.hpp create mode 100644 editor/main.cpp create mode 100644 editor/makefile create mode 100644 editor/map_editor.cpp create mode 100644 editor/map_editor.hpp create mode 100644 editor/scene_list.hpp create mode 100644 editor/scene_manager.cpp create mode 100644 editor/scene_manager.hpp diff --git a/editor/base_scene.cpp b/editor/base_scene.cpp new file mode 100644 index 0000000..ec1aabe --- /dev/null +++ b/editor/base_scene.cpp @@ -0,0 +1,139 @@ +/* Copyright: (c) Kayne Ruse 2013 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "base_scene.hpp" + +#include + +//------------------------- +//Static declarations +//------------------------- + +SDL_Surface* BaseScene::screen = nullptr; + +//------------------------- +//Public access members +//------------------------- + +BaseScene::BaseScene() { + nextScene = SceneList::CONTINUE; +} + +BaseScene::~BaseScene() { + // +} + +//------------------------- +//Program control +//------------------------- + +SDL_Surface* BaseScene::SetScreen(int w, int h, int bpp, Uint32 flags) { + if (!bpp) { + bpp = SDL_GetVideoInfo()->vfmt->BitsPerPixel; + } + + screen = SDL_SetVideoMode(w, h, bpp, flags); + + if (!screen) { + throw(std::runtime_error("Failed to create the screen surface")); + } + + return screen; +} + +SDL_Surface* BaseScene::GetScreen() { + return screen; +} + +SceneList BaseScene::SetNextScene(SceneList sceneIndex) { + return nextScene = sceneIndex; +} + +SceneList BaseScene::GetNextScene() const { + return nextScene; +} + +//------------------------- +//Frame loop +//------------------------- + +void BaseScene::RunFrame(double delta) { + FrameStart(); + HandleEvents(); + Update(delta); + FrameEnd(); +} + +void BaseScene::RenderFrame() { + SDL_FillRect(screen, 0, 0); + Render(screen); + SDL_Flip(screen); +} + +//------------------------- +//Event handlers +//------------------------- + +void BaseScene::HandleEvents() { + SDL_Event event; + + while(SDL_PollEvent(&event)) { + switch(event.type) { + case SDL_QUIT: + QuitEvent(); + break; + + case SDL_VIDEORESIZE: + SetScreen(event.resize.w, event.resize.h, 0, screen->flags); + break; + + case SDL_MOUSEMOTION: + MouseMotion(event.motion); + break; + + case SDL_MOUSEBUTTONDOWN: + MouseButtonDown(event.button); + break; + + case SDL_MOUSEBUTTONUP: + MouseButtonUp(event.button); + break; + + case SDL_KEYDOWN: + KeyDown(event.key); + break; + + case SDL_KEYUP: + KeyUp(event.key); + break; + +#ifdef USE_EVENT_JOYSTICK + //TODO: joystick/gamepad support +#endif + +#ifdef USE_EVENT_UNKNOWN + default: + UnknownEvent(event); + break; +#endif + }//switch + }//while +} diff --git a/editor/base_scene.hpp b/editor/base_scene.hpp new file mode 100644 index 0000000..cbb26ca --- /dev/null +++ b/editor/base_scene.hpp @@ -0,0 +1,74 @@ +/* Copyright: (c) Kayne Ruse 2013 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef BASESCENE_HPP_ +#define BASESCENE_HPP_ + +#include "scene_list.hpp" + +#include "SDL/SDL.h" + +class BaseScene { +public: + /* Public access members */ + BaseScene(); + virtual ~BaseScene(); + + /* Program control */ + static SDL_Surface* SetScreen(int w, int h, int bpp = 0, Uint32 flags = SDL_HWSURFACE|SDL_DOUBLEBUF); + static SDL_Surface* GetScreen(); + + SceneList SetNextScene(SceneList sceneIndex); + SceneList GetNextScene() const; + + /* Frame loop */ + virtual void RunFrame(double delta); + virtual void RenderFrame(); + +protected: + virtual void FrameStart() {} + virtual void HandleEvents(); + virtual void Update(double delta) {} + virtual void FrameEnd() {} + virtual void Render(SDL_Surface* const screen) {} + + /* Event handlers */ + virtual void QuitEvent() { SetNextScene(SceneList::QUIT); } + virtual void MouseMotion(SDL_MouseMotionEvent const&) {} + virtual void MouseButtonDown(SDL_MouseButtonEvent const&) {} + virtual void MouseButtonUp(SDL_MouseButtonEvent const&) {} + virtual void KeyDown(SDL_KeyboardEvent const&) {} + virtual void KeyUp(SDL_KeyboardEvent const&) {} + +#ifdef USE_EVENT_JOYSTICK + //TODO: joystick/gamepad support +#endif + +#ifdef USE_EVENT_UNKNOWN + virtual void UnknownEvent(SDL_Event const&) {} +#endif + +private: + static SDL_Surface* screen; + SceneList nextScene; +}; + +#endif diff --git a/editor/main.cpp b/editor/main.cpp new file mode 100644 index 0000000..7a76519 --- /dev/null +++ b/editor/main.cpp @@ -0,0 +1,47 @@ +/* Copyright: (c) Kayne Ruse 2013 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "scene_manager.hpp" + +#include +#include + +using namespace std; + +int main(int, char**) { +#ifdef DEBUG + cout << "Beginning program" << endl; +#endif + try { + SceneManager app; + app.Init(); + app.Proc(); + app.Quit(); + } + catch(exception& e) { + cerr << "Fatal error: " << e.what() << endl; + return 1; + } +#ifdef DEBUG + cout << "Clean exit" << endl; +#endif + return 0; +} diff --git a/editor/makefile b/editor/makefile new file mode 100644 index 0000000..6e173fb --- /dev/null +++ b/editor/makefile @@ -0,0 +1,39 @@ +#config +LIBDIR=../libs +LOCALLIBS=$(LIBDIR)/out/libCodebase.a $(LIBDIR)/out/libCommon.a +LIB=$(LOCALLIBS) -lmingw32 -lSDLmain -lSDL +INCLUDES=$(LIBDIR)/Codebase $(LIBDIR)/common +CXXFLAGS+=-std=c++11 -DDEBUG $(addprefix -I,$(INCLUDES)) + +#source +SRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ=$(addprefix $(OBJDIR)/,$(SRC:.cpp=.o)) + +#output +OUTDIR=../out +OUT=$(addprefix $(OUTDIR)/,editor) + +#targets +all: $(OBJ) $(OUT) + $(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIB) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/editor/map_editor.cpp b/editor/map_editor.cpp new file mode 100644 index 0000000..35307e8 --- /dev/null +++ b/editor/map_editor.cpp @@ -0,0 +1,82 @@ +/* Copyright: (c) Kayne Ruse 2013 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "map_editor.hpp" + +//------------------------- +//Public access members +//------------------------- + +MapEditor::MapEditor() { + // +} + +MapEditor::~MapEditor() { + // +} + +//------------------------- +//Frame loop +//------------------------- + +void MapEditor::FrameStart() { + // +} + +void MapEditor::Update(double delta) { + // +} + +void MapEditor::FrameEnd() { + // +} + +void MapEditor::Render(SDL_Surface* const screen) { + // +} + +//------------------------- +//Event handlers +//------------------------- + +void MapEditor::MouseMotion(SDL_MouseMotionEvent const& motion) { + // +} + +void MapEditor::MouseButtonDown(SDL_MouseButtonEvent const& button) { + // +} + +void MapEditor::MouseButtonUp(SDL_MouseButtonEvent const& button) { + // +} + +void MapEditor::KeyDown(SDL_KeyboardEvent const& key) { + switch(key.keysym.sym) { + case SDLK_ESCAPE: + QuitEvent(); + break; + } +} + +void MapEditor::KeyUp(SDL_KeyboardEvent const& key) { + // +} diff --git a/editor/map_editor.hpp b/editor/map_editor.hpp new file mode 100644 index 0000000..d04390f --- /dev/null +++ b/editor/map_editor.hpp @@ -0,0 +1,48 @@ +/* Copyright: (c) Kayne Ruse 2013 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef MAPEDITOR_HPP_ +#define MAPEDITOR_HPP_ + +#include "base_scene.hpp" + +class MapEditor : public BaseScene { +public: + //Public access members + MapEditor(); + ~MapEditor(); + +protected: + //Frame loop + void FrameStart(); + void Update(double delta); + void FrameEnd(); + void Render(SDL_Surface* const); + + //Event handlers + void MouseMotion(SDL_MouseMotionEvent const&); + void MouseButtonDown(SDL_MouseButtonEvent const&); + void MouseButtonUp(SDL_MouseButtonEvent const&); + void KeyDown(SDL_KeyboardEvent const&); + void KeyUp(SDL_KeyboardEvent const&); +}; + +#endif diff --git a/editor/scene_list.hpp b/editor/scene_list.hpp new file mode 100644 index 0000000..cd3a8f0 --- /dev/null +++ b/editor/scene_list.hpp @@ -0,0 +1,35 @@ +/* Copyright: (c) Kayne Ruse 2013 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef SCENELIST_HPP_ +#define SCENELIST_HPP_ + +enum class SceneList { + //these are reserved + QUIT, + CONTINUE, + FIRST, + + //custom indexes + MAPEDITOR, +}; + +#endif diff --git a/editor/scene_manager.cpp b/editor/scene_manager.cpp new file mode 100644 index 0000000..7bfb4f0 --- /dev/null +++ b/editor/scene_manager.cpp @@ -0,0 +1,118 @@ +/* Copyright: (c) Kayne Ruse 2013 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "scene_manager.hpp" + +#include +#include + +//------------------------- +//Scene headers +//------------------------- + +//Add the custom scene headers here +#include "map_editor.hpp" + +//------------------------- +//Public access members +//------------------------- + +SceneManager::SceneManager() { + // +} + +SceneManager::~SceneManager() { + UnloadScene(); +} + +void SceneManager::Init() { + if (SDL_Init(SDL_INIT_VIDEO)) + throw(std::runtime_error("Failed to initialize SDL")); + + BaseScene::SetScreen(800, 600); +} + +void SceneManager::Proc() { + LoadScene(SceneList::FIRST); + + //prepare the time system + typedef std::chrono::high_resolution_clock Clock; + + Clock::duration delta(16 * Clock::duration::period::den / std::milli::den); + Clock::time_point simTime = Clock::now(); + Clock::time_point realTime; + + //The main loop + while(activeScene->GetNextScene() != SceneList::QUIT) { + //switch scenes when necessary + if (activeScene->GetNextScene() != SceneList::CONTINUE) { + LoadScene(activeScene->GetNextScene()); + continue; + } + + //update the current time + realTime = Clock::now(); + + //simulate game time + while (simTime < realTime) { + //call each user defined function + activeScene->RunFrame(double(delta.count()) / Clock::duration::period::den); + simTime += delta; + } + + //draw the game to the screen + activeScene->RenderFrame(); + + //give the computer a break + SDL_Delay(10); + } + + UnloadScene(); +} + +void SceneManager::Quit() { + UnloadScene(); + SDL_Quit(); +} + +//------------------------- +//Private access members +//------------------------- + +void SceneManager::LoadScene(SceneList sceneIndex) { + UnloadScene(); + + switch(sceneIndex) { + //add scene creation calls here + case SceneList::FIRST: + case SceneList::MAPEDITOR: + activeScene = new MapEditor(); + break; + + default: + throw(std::logic_error("Failed to recognize the scene index")); + } +} + +void SceneManager::UnloadScene() { + delete activeScene; + activeScene = nullptr; +} diff --git a/editor/scene_manager.hpp b/editor/scene_manager.hpp new file mode 100644 index 0000000..2d59678 --- /dev/null +++ b/editor/scene_manager.hpp @@ -0,0 +1,48 @@ +/* Copyright: (c) Kayne Ruse 2013 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef SCENEMANAGER_HPP_ +#define SCENEMANAGER_HPP_ + +#include "scene_list.hpp" +#include "base_scene.hpp" + +#include "SDL/SDL.h" + +class SceneManager { +public: + /* Public access members */ + SceneManager(); + ~SceneManager(); + + void Init(); + void Proc(); + void Quit(); + +private: + /* Private access members */ + void LoadScene(SceneList sceneIndex); + void UnloadScene(); + + BaseScene* activeScene = nullptr; +}; + +#endif diff --git a/makefile b/makefile index 407e817..4e39923 100644 --- a/makefile +++ b/makefile @@ -4,6 +4,7 @@ all: $(OUTDIR) $(MAKE) -C libs $(MAKE) -C server $(MAKE) -C client + $(MAKE) -C editor $(MAKE) -C test $(OUTDIR):