main() moved to a D function.

This commit is contained in:
King_DuckZ 2014-02-08 11:04:53 +01:00
parent ef3a4c1ef6
commit 85c3347417
5 changed files with 144 additions and 65 deletions

View file

@ -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}

View file

@ -1,63 +0,0 @@
#include <SDL2/SDL.h>
#include <iostream>
#include "CloonelJumpConfig.h"
#include <stdexcept>
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;
}

39
src/main.d Normal file
View file

@ -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;
}

94
src/sdlinit.cpp Normal file
View file

@ -0,0 +1,94 @@
#include "sdlinit.hpp"
#include <SDL2/SDL.h>
#include "CloonelJumpConfig.h"
#include <stdexcept>
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;
//}

8
src/sdlinit.hpp Normal file
View file

@ -0,0 +1,8 @@
#ifndef id2ED86EA85A6843258307486DFB17FFE7
#define id2ED86EA85A6843258307486DFB17FFE7
struct InitSDLStuff;
int cloonel_InitSDL ( InitSDLStuff** ) noexcept;
void cloonel_DestroySDL ( InitSDLStuff* ) noexcept;
#endif