diff --git a/frameworks/network/makefile b/frameworks/network/makefile new file mode 100644 index 0000000..3bcac3d --- /dev/null +++ b/frameworks/network/makefile @@ -0,0 +1,29 @@ +#config +INCLUDES+=. packet_types ../gameplay ../map ../utilities +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + $(MAKE) -C packet_types + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< diff --git a/frameworks/scenes/application.cpp b/frameworks/scenes/application.cpp new file mode 100644 index 0000000..32b9906 --- /dev/null +++ b/frameworks/scenes/application.cpp @@ -0,0 +1,188 @@ +/* Copyright: (c) Kayne Ruse 2015 + * + * 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 "application.hpp" + +#include +#include +#include + +void Application::Init(int argc, char* argv[]) { + //create and check the window + window = SDL_CreateWindow( + "Example Caption", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + screenWidth, + screenHeight, + SDL_WINDOW_RESIZABLE); + + if (!window) { + std::ostringstream msg; + msg << "Failed to create the window: " << SDL_GetError(); + throw(std::runtime_error(msg.str())); + } + + //create and check the renderer + renderer = SDL_CreateRenderer(window, -1, 0); + + if (!renderer) { + std::ostringstream msg; + msg << "Failed to create the renderer: " << SDL_GetError(); + throw(std::runtime_error(msg.str())); + } + + //screen scaling + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best"); + SDL_RenderSetLogicalSize(renderer, 800, 600); + + //set the hook for the renderer + BaseScene::SetRenderer(renderer); +} + +void Application::Proc() { + //load the first scene + ProcessSceneSignal(SceneSignal::FIRST); + + //fixed frame rate + typedef std::chrono::steady_clock Clock; + + Clock::time_point simTime = Clock::now(); + Clock::time_point realTime; + constexpr std::chrono::duration frameDelay(16); //~60FPS + + //the game loop continues until the scenes signal QUIT + while(activeScene->GetSceneSignal() != SceneSignal::QUIT) { + //switch scenes if necessary + if(activeScene->GetSceneSignal() != SceneSignal::CONTINUE) { + ProcessSceneSignal(activeScene->GetSceneSignal()); + continue; + } + + //update the current time + realTime = Clock::now(); + + //simulate the game or give the machine a break + if (simTime < realTime) { + while(simTime < realTime) { + //call the user defined functions + activeScene->FrameStart(); + ProcessEvents(); + activeScene->Update(); + activeScene->FrameEnd(); + + //step to the next frame + simTime += frameDelay; + } + } + else { + SDL_Delay(1); + } + + SDL_RenderClear(renderer); + activeScene->RenderFrame(renderer); + SDL_RenderPresent(renderer); + } + + //cleanup + ClearScene(); +} + +void Application::Quit() { + //clean up after the program + BaseScene::SetRenderer(nullptr); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); +} + +//------------------------- +//Scene management +//------------------------- + +void Application::ProcessEvents() { + SDL_Event event; + while(SDL_PollEvent(&event)) { + switch(event.type) { + case SDL_QUIT: + activeScene->QuitEvent(); + break; + + case SDL_MOUSEMOTION: + activeScene->MouseMotion(event.motion); + break; + + case SDL_MOUSEBUTTONDOWN: + activeScene->MouseButtonDown(event.button); + break; + + case SDL_MOUSEBUTTONUP: + activeScene->MouseButtonUp(event.button); + break; + + case SDL_MOUSEWHEEL: + activeScene->MouseWheel(event.wheel); + break; + + case SDL_KEYDOWN: + activeScene->KeyDown(event.key); + break; + + case SDL_KEYUP: + activeScene->KeyUp(event.key); + break; + + //TODO: joystick and controller events + + //window events are handled internally + case SDL_WINDOWEVENT: + switch(event.window.event) { + case SDL_WINDOWEVENT_RESIZED: + SDL_RenderSetLogicalSize(renderer, event.window.data1, event.window.data2); + break; + } + break; + } + } +} + +//Add the custom scene headers here +#include "example_scene.hpp" + +void Application::ProcessSceneSignal(SceneSignal signal) { + ClearScene(); + + switch(signal) { + case SceneSignal::FIRST: + case SceneSignal::EXAMPLE_SCENE: + activeScene = new ExampleScene(); + break; + default: { + std::ostringstream msg; + msg << "Failed to recognize the scene signal: " << signal; + throw(std::logic_error(msg.str())); + } + } +} + +void Application::ClearScene() { + delete activeScene; + activeScene = nullptr; +} \ No newline at end of file diff --git a/frameworks/scenes/application.hpp b/frameworks/scenes/application.hpp new file mode 100644 index 0000000..c927734 --- /dev/null +++ b/frameworks/scenes/application.hpp @@ -0,0 +1,54 @@ +/* Copyright: (c) Kayne Ruse 2015 + * + * 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. +*/ +#pragma once + +#include "base_scene.hpp" +#include "scene_signal.hpp" + +#include "SDL2/SDL.h" + +//TODO: do something with these +constexpr int screenWidth = 800; +constexpr int screenHeight = 600; + +//DOCS: The Application class handles scene switching, utilizing only one window +class Application { +public: + Application() = default; + ~Application() = default; + + void Init(int argc, char* argv[]); + void Proc(); + void Quit(); + +private: + //scene management + void ProcessEvents(); + void ProcessSceneSignal(SceneSignal); + void ClearScene(); + + BaseScene* activeScene = nullptr; + + //TODO: build a "window" class? + SDL_Window* window = nullptr; + SDL_Renderer* renderer = nullptr; +}; \ No newline at end of file diff --git a/frameworks/scenes/base_scene.cpp b/frameworks/scenes/base_scene.cpp new file mode 100644 index 0000000..f637710 --- /dev/null +++ b/frameworks/scenes/base_scene.cpp @@ -0,0 +1,105 @@ +/* Copyright: (c) Kayne Ruse 2015 + * + * 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" + +SDL_Renderer* BaseScene::rendererHandle = nullptr; + +BaseScene::BaseScene() { + //EMPTY +} + +BaseScene::~BaseScene() { + //EMPTY +} + +void BaseScene::RenderFrame(SDL_Renderer* renderer) { + //EMPTY +} + +void BaseScene::SetRenderer(SDL_Renderer* r) { + rendererHandle = r; +} + +SDL_Renderer* BaseScene::GetRenderer() { + return rendererHandle; +} + +void BaseScene::SetSceneSignal(SceneSignal signal) { + sceneSignal = signal; +} + +SceneSignal BaseScene::GetSceneSignal() { + return sceneSignal; +} + +//------------------------- +//frame phases +//------------------------- + +void BaseScene::FrameStart() { + //EMPTY +} + +void BaseScene::Update() { + //EMPTY +} + +void BaseScene::FrameEnd() { + //EMPTY +} + +//------------------------- +//input events +//------------------------- + +void BaseScene::QuitEvent() { + sceneSignal = SceneSignal::QUIT; +} + +void BaseScene::MouseMotion(SDL_MouseMotionEvent const& event) { + //EMPTY +} + +void BaseScene::MouseButtonDown(SDL_MouseButtonEvent const& event) { + //EMPTY +} + +void BaseScene::MouseButtonUp(SDL_MouseButtonEvent const& event) { + //EMPTY +} + +void BaseScene::MouseWheel(SDL_MouseWheelEvent const& event) { + //EMPTY +} + +void BaseScene::KeyDown(SDL_KeyboardEvent const& event) { + //preference as a default + switch(event.keysym.sym) { + case SDLK_ESCAPE: + QuitEvent(); + break; + } +} + +void BaseScene::KeyUp(SDL_KeyboardEvent const& event) { + //EMPTY +} diff --git a/frameworks/scenes/base_scene.hpp b/frameworks/scenes/base_scene.hpp new file mode 100644 index 0000000..96a4085 --- /dev/null +++ b/frameworks/scenes/base_scene.hpp @@ -0,0 +1,61 @@ +/* Copyright: (c) Kayne Ruse 2015 + * + * 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. +*/ +#pragma once + +#include "scene_signal.hpp" + +#include "SDL2/SDL.h" + +class BaseScene { +public: + BaseScene(); + virtual ~BaseScene(); + + virtual void RenderFrame(SDL_Renderer*); + static void SetRenderer(SDL_Renderer*); + SceneSignal GetSceneSignal(); + + //frame phases + virtual void FrameStart(); + virtual void Update(); + virtual void FrameEnd(); + + //input events + virtual void QuitEvent(); + virtual void MouseMotion(SDL_MouseMotionEvent const& event); + virtual void MouseButtonDown(SDL_MouseButtonEvent const& event); + virtual void MouseButtonUp(SDL_MouseButtonEvent const& event); + virtual void MouseWheel(SDL_MouseWheelEvent const& event); + virtual void KeyDown(SDL_KeyboardEvent const& event); + virtual void KeyUp(SDL_KeyboardEvent const& event); + + //TODO: joystick and controller events + +protected: + //control + static SDL_Renderer* GetRenderer(); + void SetSceneSignal(SceneSignal); + +private: + static SDL_Renderer* rendererHandle; + SceneSignal sceneSignal = SceneSignal::CONTINUE; +}; \ No newline at end of file diff --git a/frameworks/scenes/example_scene.cpp b/frameworks/scenes/example_scene.cpp new file mode 100644 index 0000000..33be9ab --- /dev/null +++ b/frameworks/scenes/example_scene.cpp @@ -0,0 +1,83 @@ +/* Copyright: (c) Kayne Ruse 2015 + * + * 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 "example_scene.hpp" + +ExampleScene::ExampleScene() { + // +} + +ExampleScene::~ExampleScene() { + // +} + +//------------------------- +//frame phases +//------------------------- + +void ExampleScene::FrameStart() { + // +} + +void ExampleScene::Update() { + // +} + +void ExampleScene::FrameEnd() { + // +} + +void ExampleScene::RenderFrame(SDL_Renderer* renderer) { + // +} + +//------------------------- +//input events +//------------------------- + +void ExampleScene::MouseMotion(SDL_MouseMotionEvent const& event) { + // +} + +void ExampleScene::MouseButtonDown(SDL_MouseButtonEvent const& event) { + // +} + +void ExampleScene::MouseButtonUp(SDL_MouseButtonEvent const& event) { + // +} + +void ExampleScene::MouseWheel(SDL_MouseWheelEvent const& event) { + // +} + +void ExampleScene::KeyDown(SDL_KeyboardEvent const& event) { + //preference as a default + switch(event.keysym.sym) { + case SDLK_ESCAPE: + QuitEvent(); + break; + } +} + +void ExampleScene::KeyUp(SDL_KeyboardEvent const& event) { + // +} diff --git a/frameworks/scenes/example_scene.hpp b/frameworks/scenes/example_scene.hpp new file mode 100644 index 0000000..2f18af1 --- /dev/null +++ b/frameworks/scenes/example_scene.hpp @@ -0,0 +1,46 @@ +/* Copyright: (c) Kayne Ruse 2015 + * + * 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. +*/ +#pragma once + +#include "base_scene.hpp" + +class ExampleScene : public BaseScene { +public: + ExampleScene(); + ~ExampleScene(); + + void RenderFrame(SDL_Renderer* renderer) override; + +private: + //frame phases + void FrameStart() override; + void Update() override; + void FrameEnd() override; + + //input events + void MouseMotion(SDL_MouseMotionEvent const& event) override; + void MouseButtonDown(SDL_MouseButtonEvent const& event) override; + void MouseButtonUp(SDL_MouseButtonEvent const& event) override; + void MouseWheel(SDL_MouseWheelEvent const& event) override; + void KeyDown(SDL_KeyboardEvent const& event) override; + void KeyUp(SDL_KeyboardEvent const& event) override; +}; diff --git a/frameworks/scenes/main.cpp b/frameworks/scenes/main.cpp new file mode 100644 index 0000000..90f7d67 --- /dev/null +++ b/frameworks/scenes/main.cpp @@ -0,0 +1,43 @@ +/* Copyright: (c) Kayne Ruse 2015 + * + * 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 "application.hpp" + +#include "SDL2/SDL.h" + +#include +#include + +int main(int argc, char** argv) { + std::cout << "Beginning " << argv[0] << std::endl; + try { + Application app; + app.Init(argc, argv); + app.Proc(); + app.Quit(); + } + catch(std::exception& e) { + std::cerr << "Fatal Error: " << e.what() << std::endl; + return 1; + } + std::cout << "Clean exit from " << argv[0] << std::endl; + return 0; +} \ No newline at end of file diff --git a/frameworks/scenes/makefile b/frameworks/scenes/makefile new file mode 100644 index 0000000..a8f0ea0 --- /dev/null +++ b/frameworks/scenes/makefile @@ -0,0 +1,56 @@ +#include directories +INCLUDES+=. + +#libraries +#the order of the $(LIBS) is important, at least for MinGW +LIBS+= +ifeq ($(OS),Windows_NT) + LIBS+=-lmingw32 +endif +LIBS+=-lSDL2main -lSDL2 + +#flags +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) +ifeq ($(shell uname), Linux) + #read data about the current install + CXXFLAGS+=$(shell sdl-config --cflags --static-libs) +endif + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=out +OUT=$(addprefix $(OUTDIR)/,scenes) + +#targets +all: $(OBJ) $(OUT) + $(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: +ifeq ($(OS),Windows_NT) + $(RM) *.o *.a *.exe +else ifeq ($(shell uname), Linux) + find . -type f -name '*.o' -exec rm -f -r -v {} \; + find . -type f -name '*.a' -exec rm -f -r -v {} \; + rm -f -v $(OUT) +endif + +rebuild: clean all diff --git a/frameworks/scenes/scene_signal.hpp b/frameworks/scenes/scene_signal.hpp new file mode 100644 index 0000000..49e0bcb --- /dev/null +++ b/frameworks/scenes/scene_signal.hpp @@ -0,0 +1,32 @@ +/* Copyright: (c) Kayne Ruse 2015 + * + * 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. +*/ +#pragma once + +enum SceneSignal { + //reserved members for internal use + QUIT = -1, + CONTINUE = 0, + FIRST = 1, + + //custom scenes + EXAMPLE_SCENE +}; \ No newline at end of file