diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c7f043..2f041e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 2.8) -project(CloonelJump CXX) +project(CloonelJump CXX D) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11") @@ -23,7 +23,8 @@ configure_file( ) add_executable(${PROJECT_NAME} - src/main.cpp + src/main.d + src/sdlinit.cpp ) target_link_libraries(${PROJECT_NAME} diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index d79af39..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include -#include "CloonelJumpConfig.h" -#include - -namespace { - struct InitSDLStuff { - SDL_Window* window; - SDL_Renderer* renderer; - bool initialized; - }; - - ///------------------------------------------------------------------------- - ///------------------------------------------------------------------------- - void InitSDL (InitSDLStuff& parInitSDL) { - parInitSDL.window = nullptr; - parInitSDL.renderer = nullptr; - parInitSDL.initialized = false; - - if (SDL_Init(SDL_INIT_EVERYTHING) == -1) - throw std::runtime_error(SDL_GetError()); - parInitSDL.initialized = true; - - SDL_Window* const win = SDL_CreateWindow(GameName, 100, 100, 640, 480, SDL_WINDOW_SHOWN); - if (!win) - throw std::runtime_error(SDL_GetError()); - parInitSDL.window = win; - - SDL_Renderer* const renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); - if (!renderer) - throw std::runtime_error(SDL_GetError()); - parInitSDL.renderer = renderer; - } - - ///------------------------------------------------------------------------- - ///------------------------------------------------------------------------- - void ClearIFN (InitSDLStuff& parInitSDL) { - if (parInitSDL.renderer) - SDL_DestroyRenderer(parInitSDL.renderer); - if (parInitSDL.window) - SDL_DestroyWindow(parInitSDL.window); - if (parInitSDL.initialized) - SDL_Quit(); - } -} //unnamed namespace - -//following http://twinklebeardev.blogspot.co.uk/2012/07/lesson-1-hello-world.html -int main() { - std::cout << GameName << " v" << GameVersionMajor << "." << GameVersionMinor << std::endl; - - InitSDLStuff sdlstuff; - try { - InitSDL(sdlstuff); - } - catch (const std::runtime_error& e) { - std::cerr << "Error during SDL2 initialization:\n"; - std::cerr << e.what() << std::endl; - } - - ClearIFN(sdlstuff); - std::cout << "Quitting now" << std::endl; - return 0; -} diff --git a/src/main.d b/src/main.d new file mode 100644 index 0000000..96f9f22 --- /dev/null +++ b/src/main.d @@ -0,0 +1,39 @@ +import std.stdio; + +struct InitSDLStuff; + +extern(C++) nothrow int cloonel_InitSDL ( InitSDLStuff** ); +extern(C++) nothrow void cloonel_DestroySDL ( InitSDLStuff* ); + +///----------------------------------------------------------------------------- +///----------------------------------------------------------------------------- +int RunGame (const InitSDLStuff* parContext) { + return 0; +} + +///----------------------------------------------------------------------------- +///----------------------------------------------------------------------------- +int main() { + InitSDLStuff* context = null; + int retVal = 0; + + scope(exit) cloonel_DestroySDL(context); + const int initRetVal = cloonel_InitSDL(&context); + switch (initRetVal) { + case 1: + writeln("Error during SDL initialization"); + retVal = 1; + break; + + case 2: + writeln("Wrong parameters to cloonel_InitSDL()"); + retVal = 1; + break; + + default: + retVal = RunGame(context); + break; + } + + return retVal; +} diff --git a/src/sdlinit.cpp b/src/sdlinit.cpp new file mode 100644 index 0000000..b509691 --- /dev/null +++ b/src/sdlinit.cpp @@ -0,0 +1,94 @@ +#include "sdlinit.hpp" +#include +#include "CloonelJumpConfig.h" +#include + +struct InitSDLStuff { + SDL_Window* window; + SDL_Renderer* renderer; + bool initialized; +}; + +namespace { + ///------------------------------------------------------------------------- + ///------------------------------------------------------------------------- + void InitSDL (InitSDLStuff& parInitSDL) { + parInitSDL.window = nullptr; + parInitSDL.renderer = nullptr; + parInitSDL.initialized = false; + + if (SDL_Init(SDL_INIT_EVERYTHING) == -1) + throw std::runtime_error(SDL_GetError()); + parInitSDL.initialized = true; + + SDL_Window* const win = SDL_CreateWindow(GameName, 100, 100, 640, 480, SDL_WINDOW_SHOWN); + if (!win) + throw std::runtime_error(SDL_GetError()); + parInitSDL.window = win; + + SDL_Renderer* const renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + if (!renderer) + throw std::runtime_error(SDL_GetError()); + parInitSDL.renderer = renderer; + } + + ///------------------------------------------------------------------------- + ///------------------------------------------------------------------------- + void ClearIFN (InitSDLStuff& parInitSDL) { + if (parInitSDL.renderer) + SDL_DestroyRenderer(parInitSDL.renderer); + if (parInitSDL.window) + SDL_DestroyWindow(parInitSDL.window); + if (parInitSDL.initialized) + SDL_Quit(); + } +} //unnamed namespace + +///----------------------------------------------------------------------------- +///following http://twinklebeardev.blogspot.co.uk/2012/07/lesson-1-hello-world.html +///----------------------------------------------------------------------------- +int cloonel_InitSDL (InitSDLStuff** parContext) noexcept { + if (not parContext) + return 2; + + *parContext = nullptr; + try { + *parContext = new InitSDLStuff; + InitSDL(**parContext); + } + catch(...) { + if (*parContext) { + ClearIFN(**parContext); + delete *parContext; + *parContext = nullptr; + } + return 1; + } + return 0; +} + +///----------------------------------------------------------------------------- +///----------------------------------------------------------------------------- +void cloonel_DestroySDL (InitSDLStuff* parContext) noexcept { + if (parContext) { + ClearIFN(*parContext); + delete parContext; + } +} + +//int main() { + //std::cout << GameName << " v" << GameVersionMajor << "." << GameVersionMinor << std::endl; + + //InitSDLStuff sdlstuff; + //try { + //InitSDL(sdlstuff); + //} + //catch (const std::runtime_error& e) { + //std::cerr << "Error during SDL2 initialization:\n"; + //std::cerr << e.what() << std::endl; + //} + + //ClearIFN(sdlstuff); + //std::cout << "Quitting now" << std::endl; + //return 0; +//} diff --git a/src/sdlinit.hpp b/src/sdlinit.hpp new file mode 100644 index 0000000..d2f0de0 --- /dev/null +++ b/src/sdlinit.hpp @@ -0,0 +1,8 @@ +#ifndef id2ED86EA85A6843258307486DFB17FFE7 +#define id2ED86EA85A6843258307486DFB17FFE7 + +struct InitSDLStuff; + +int cloonel_InitSDL ( InitSDLStuff** ) noexcept; +void cloonel_DestroySDL ( InitSDLStuff* ) noexcept; +#endif