Skip to content
Snippets Groups Projects
Commit 762f668a authored by David Maul's avatar David Maul :crab:
Browse files

basic structure

parent 7c33c4be
No related branches found
No related tags found
No related merge requests found
cmake_minimum_required(VERSION 3.15)
# Projektname und Sprache
project(cpp-project
project(ADVANCED_WARS
VERSION 1.0.0
DESCRIPTION "HSFD C++ Project"
LANGUAGES CXX
)
set(ADVANCED_WARS_SOURCES
src/scene.hpp
src/unit.cpp
src/building.cpp
src/level.cpp
src/engine.cpp
src/window.cpp
)
# C++ Standard festlegen
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
......@@ -19,13 +28,17 @@ else()
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# Executable erstellen
add_executable(${PROJECT_NAME}
src/main.cpp
)
# CMake
set(CMAKE_MODULE_PATH ${ADVANCED_WARS_SOURCE_DIR}/cmake/ ${CMAKE_MODULE_PATH})
# Include-Verzeichnisse hinzufügen (falls benötigt)
target_include_directories(${PROJECT_NAME}
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
)
# SDL2
find_package(SDL2 REQUIRED)
find_package(SDL2_IMAGE REQUIRED)
include_directories(${SDL2_INCLUDE_DIR})
include_directories(${SDL2_IMG_INCLUDE_DIR})
# Executable erstellen
add_executable(advanced_wars src/main.cpp ${ADVANCED_WARS_SOURCES})
target_link_libraries(advanced_wars ${SDL2_LIBRARY} ${SDL2_IMG_LIBRARY})
target_link_libraries(advanced_wars m)
# Locate SDL2 library
# This module defines
# SDL2_LIBRARY, the name of the library to link against
# SDL2_FOUND, if false, do not try to link to SDL2
# SDL2_INCLUDE_DIR, where to find SDL.h
#
# This module responds to the the flag:
# SDL2_BUILDING_LIBRARY
# If this is defined, then no SDL2main will be linked in because
# only applications need main().
# Otherwise, it is assumed you are building an application and this
# module will attempt to locate and set the the proper link flags
# as part of the returned SDL2_LIBRARY variable.
#
# Don't forget to include SDLmain.h and SDLmain.m your project for the
# OS X framework based version. (Other versions link to -lSDL2main which
# this module will try to find on your behalf.) Also for OS X, this
# module will automatically add the -framework Cocoa on your behalf.
#
#
# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration
# and no SDL2_LIBRARY, it means CMake did not find your SDL2 library
# (SDL2.dll, libsdl2.so, SDL2.framework, etc).
# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again.
# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value
# as appropriate. These values are used to generate the final SDL2_LIBRARY
# variable, but when these values are unset, SDL2_LIBRARY does not get created.
#
#
# $SDL2DIR is an environment variable that would
# correspond to the ./configure --prefix=$SDL2DIR
# used in building SDL2.
# l.e.galup 9-20-02
#
# Modified by Eric Wing.
# Added code to assist with automated building by using environmental variables
# and providing a more controlled/consistent search behavior.
# Added new modifications to recognize OS X frameworks and
# additional Unix paths (FreeBSD, etc).
# Also corrected the header search path to follow "proper" SDL guidelines.
# Added a search for SDL2main which is needed by some platforms.
# Added a search for threads which is needed by some platforms.
# Added needed compile switches for MinGW.
#
# On OSX, this will prefer the Framework version (if found) over others.
# People will have to manually change the cache values of
# SDL2_LIBRARY to override this selection or set the CMake environment
# CMAKE_INCLUDE_PATH to modify the search paths.
#
# Note that the header path has changed from SDL2/SDL.h to just SDL.h
# This needed to change because "proper" SDL convention
# is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability
# reasons because not all systems place things in SDL2/ (see FreeBSD).
#=============================================================================
# Copyright 2003-2009 Kitware, Inc.
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
SET(SDL2_SEARCH_PATHS
~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/sw # Fink
/opt/local # DarwinPorts
/opt/csw # Blastwave
/opt
)
FIND_PATH(SDL2_INCLUDE_DIR SDL.h
HINTS
$ENV{SDL2DIR}
PATH_SUFFIXES include/SDL2 include
PATHS ${SDL2_SEARCH_PATHS}
)
FIND_LIBRARY(SDL2_LIBRARY_TEMP
NAMES SDL2
HINTS
$ENV{SDL2DIR}
PATH_SUFFIXES lib64 lib
PATHS ${SDL2_SEARCH_PATHS}
)
IF(NOT SDL2_BUILDING_LIBRARY)
IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
# Non-OS X framework versions expect you to also dynamically link to
# SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms
# seem to provide SDL2main for compatibility even though they don't
# necessarily need it.
FIND_LIBRARY(SDL2MAIN_LIBRARY
NAMES SDL2main
HINTS
$ENV{SDL2DIR}
PATH_SUFFIXES lib64 lib
PATHS ${SDL2_SEARCH_PATHS}
)
ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
ENDIF(NOT SDL2_BUILDING_LIBRARY)
# SDL2 may require threads on your system.
# The Apple build may not need an explicit flag because one of the
# frameworks may already provide it.
# But for non-OSX systems, I will use the CMake Threads package.
IF(NOT APPLE)
FIND_PACKAGE(Threads)
ENDIF(NOT APPLE)
# MinGW needs an additional library, mwindows
# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows
# (Actually on second look, I think it only needs one of the m* libraries.)
IF(MINGW)
SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
ENDIF(MINGW)
IF(SDL2_LIBRARY_TEMP)
# For SDL2main
IF(NOT SDL2_BUILDING_LIBRARY)
IF(SDL2MAIN_LIBRARY)
SET(SDL2_LIBRARY_TEMP ${SDL2MAIN_LIBRARY} ${SDL2_LIBRARY_TEMP})
ENDIF(SDL2MAIN_LIBRARY)
ENDIF(NOT SDL2_BUILDING_LIBRARY)
# For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa.
# CMake doesn't display the -framework Cocoa string in the UI even
# though it actually is there if I modify a pre-used variable.
# I think it has something to do with the CACHE STRING.
# So I use a temporary variable until the end so I can set the
# "real" variable in one-shot.
IF(APPLE)
SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa")
ENDIF(APPLE)
# For threads, as mentioned Apple doesn't need this.
# In fact, there seems to be a problem if I used the Threads package
# and try using this line, so I'm just skipping it entirely for OS X.
IF(NOT APPLE)
SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
ENDIF(NOT APPLE)
# For MinGW library
IF(MINGW)
SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
ENDIF(MINGW)
# Set the final string here so the GUI reflects the final state.
SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found")
# Set the temp variable to INTERNAL so it is not seen in the CMake GUI
SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "")
ENDIF(SDL2_LIBRARY_TEMP)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR)
# Locate SDL2_IMAGE library
# This module defines
# SDL2_IMG_LIBRARY, the name of the library to link against
# SDL2_IMG_FOUND, if false, do not try to link to SDL2_IMG_
# SDL2_IMG_INCLUDE_DIR, where to find SDL.h
#
# This module responds to the the flag:
# SDL2_IMG_BUILDING_LIBRARY
# If this is defined, then no SDL2_IMG_main will be linked in because
# only applications need main().
# Otherwise, it is assumed you are building an application and this
# module will attempt to locate and set the the proper link flags
# as part of the returned SDL2_IMG_LIBRARY variable.
#
# Don't forget to include SDLmain.h and SDLmain.m your project for the
# OS X framework based version. (Other versions link to -lSDL2_IMG_main which
# this module will try to find on your behalf.) Also for OS X, this
# module will automatically add the -framework Cocoa on your behalf.
#
#
# Additional Note: If you see an empty SDL2_IMG_LIBRARY_TEMP in your configuration
# and no SDL2_IMG_LIBRARY, it means CMake did not find your SDL2_IMG_ library
# (SDL2_IMG_.dll, libSDL2_IMG_.so, SDL2_IMG_.framework, etc).
# Set SDL2_IMG_LIBRARY_TEMP to point to your SDL2_IMG_ library, and configure again.
# Similarly, if you see an empty SDL2_IMG_MAIN_LIBRARY, you should set this value
# as appropriate. These values are used to generate the final SDL2_IMG_LIBRARY
# variable, but when these values are unset, SDL2_IMG_LIBRARY does not get created.
#
#
# $SDL2_IMG_DIR is an environment variable that would
# correspond to the ./configure --prefix=$SDL2_IMG_DIR
# used in building SDL2_IMG_.
# l.e.galup 9-20-02
#
# Modified by Eric Wing.
# Added code to assist with automated building by using environmental variables
# and providing a more controlled/consistent search behavior.
# Added new modifications to recognize OS X frameworks and
# additional Unix paths (FreeBSD, etc).
# Also corrected the header search path to follow "proper" SDL guidelines.
# Added a search for SDL2_IMG_main which is needed by some platforms.
# Added a search for threads which is needed by some platforms.
# Added needed compile switches for MinGW.
#
# On OSX, this will prefer the Framework version (if found) over others.
# People will have to manually change the cache values of
# SDL2_IMG_LIBRARY to override this selection or set the CMake environment
# CMAKE_INCLUDE_PATH to modify the search paths.
#
# Note that the header path has changed from SDL2_IMG_/SDL.h to just SDL.h
# This needed to change because "proper" SDL convention
# is #include "SDL.h", not <SDL2_IMG_/SDL.h>. This is done for portability
# reasons because not all systems place things in SDL2_IMG_/ (see FreeBSD).
#=============================================================================
# Copyright 2003-2009 Kitware, Inc.
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
SET(SDL2_IMG_SEARCH_PATHS
~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/sw # Fink
/opt/local # DarwinPorts
/opt/csw # Blastwave
/opt
)
FIND_PATH(SDL2_IMG_INCLUDE_DIR SDL_image.h
HINTS
$ENV{SDL2_IMG_DIR}
PATH_SUFFIXES include/SDL2 include
PATHS ${SDL2_IMG_SEARCH_PATHS}
)
FIND_LIBRARY(SDL2_IMG_LIBRARY_TEMP
NAMES SDL2_image
HINTS
$ENV{SDL2_IMG_DIR}
PATH_SUFFIXES lib64 lib
PATHS ${SDL2_IMG_SEARCH_PATHS}
)
IF(NOT SDL2_IMG_BUILDING_LIBRARY)
IF(NOT ${SDL2_IMG_INCLUDE_DIR} MATCHES ".framework")
# Non-OS X framework versions expect you to also dynamically link to
# SDL2_IMG_main. This is mainly for Windows and OS X. Other (Unix) platforms
# seem to provide SDL2_IMG_main for compatibility even though they don't
# necessarily need it.
FIND_LIBRARY(SDL2_IMG_MAIN_LIBRARY
NAMES SDL2_image
HINTS
$ENV{SDL2_IMG_DIR}
PATH_SUFFIXES lib64 lib
PATHS ${SDL2_IMG_SEARCH_PATHS}
)
ENDIF(NOT ${SDL2_IMG_INCLUDE_DIR} MATCHES ".framework")
ENDIF(NOT SDL2_IMG_BUILDING_LIBRARY)
# SDL2_IMG_ may require threads on your system.
# The Apple build may not need an explicit flag because one of the
# frameworks may already provide it.
# But for non-OSX systems, I will use the CMake Threads package.
IF(NOT APPLE)
FIND_PACKAGE(Threads)
ENDIF(NOT APPLE)
# MinGW needs an additional library, mwindows
# It's total link flags should look like -lmingw32 -lSDL2_IMG_main -lSDL2_IMG_ -lmwindows
# (Actually on second look, I think it only needs one of the m* libraries.)
IF(MINGW)
SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
ENDIF(MINGW)
IF(SDL2_IMG_LIBRARY_TEMP)
# For SDL2_IMG_main
IF(NOT SDL2_IMG_BUILDING_LIBRARY)
IF(SDL2_IMG_MAIN_LIBRARY)
SET(SDL2_IMG_LIBRARY_TEMP ${SDL2_IMG_MAIN_LIBRARY} ${SDL2_IMG_LIBRARY_TEMP})
ENDIF(SDL2_IMG_MAIN_LIBRARY)
ENDIF(NOT SDL2_IMG_BUILDING_LIBRARY)
# For OS X, SDL2_IMG_ uses Cocoa as a backend so it must link to Cocoa.
# CMake doesn't display the -framework Cocoa string in the UI even
# though it actually is there if I modify a pre-used variable.
# I think it has something to do with the CACHE STRING.
# So I use a temporary variable until the end so I can set the
# "real" variable in one-shot.
IF(APPLE)
SET(SDL2_IMG_LIBRARY_TEMP ${SDL2_IMG_LIBRARY_TEMP} "-framework Cocoa")
ENDIF(APPLE)
# For threads, as mentioned Apple doesn't need this.
# In fact, there seems to be a problem if I used the Threads package
# and try using this line, so I'm just skipping it entirely for OS X.
IF(NOT APPLE)
SET(SDL2_IMG_LIBRARY_TEMP ${SDL2_IMG_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
ENDIF(NOT APPLE)
# For MinGW library
IF(MINGW)
SET(SDL2_IMG_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_IMG_LIBRARY_TEMP})
ENDIF(MINGW)
# Set the final string here so the GUI reflects the final state.
SET(SDL2_IMG_LIBRARY ${SDL2_IMG_LIBRARY_TEMP} CACHE STRING "Where the SDL2_IMG Library can be found")
# Set the temp variable to INTERNAL so it is not seen in the CMake GUI
SET(SDL2_IMG_LIBRARY_TEMP "${SDL2_IMG_LIBRARY_TEMP}" CACHE INTERNAL "")
ENDIF(SDL2_IMG_LIBRARY_TEMP)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_IMG_ REQUIRED_VARS SDL2_IMG_LIBRARY SDL2_IMG_INCLUDE_DIR)
#include "building.hpp"
Building::Building(int x, int y): x(x), y(y) {};
#ifndef BUILDING_HPP
#define BUILDING_HPP
class Building{
public:
Building(int x, int y);
private:
// Position
int x;
int y;
};
#endif
#include "scene.hpp"
#include "window.hpp"
#include "engine.hpp"
#include <vector>
#include <stdexcept>
#include <SDL.h>
namespace advanced_wars {
Engine::Engine(Window &window, Scene &scene): window(window), scene(scene) {
this->renderer = SDL_CreateRenderer(
this->window.sdl_window(), -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == nullptr) {
throw std::runtime_error("SDL could not generate renderer: " +
std::string(SDL_GetError()));
}
}
void Engine::set_scene() {}
void Engine::pump() {
SDL_Event e;
while(SDL_PollEvent(&e)) {
if(e.type == SDL_QUIT) {
this->quit = true;
} else {
this->events.push_back(e);
}
}
}
bool Engine::exited() {
return this->quit;
}
void Engine::render() {
if(SDL_RenderClear(this->renderer) != 0) {
throw std::runtime_error("Could not clear renderer: " + std::string(SDL_GetError()));
}
this->scene.render(this->renderer, this->events);
SDL_RenderPresent(this->renderer);
}
} // namespace advanced_wars
#ifndef ENGINE_HPP
#define ENGINE_HPP
#include "window.hpp"
#include "scene.hpp"
#include <SDL.h>
#include <vector>
namespace advanced_wars
{
/**
* @brief The main window of the game
*/
class Engine
{
public:
Engine(Window &window, Scene &scene);
/**
* Forbids the creation of copies of a window
*/
Engine(const Engine&) = delete;
Engine& operator=(const Engine&) = delete;
bool exited();
void pump();
void set_scene();
void render();
private:
Window &window;
Scene &scene;
SDL_Renderer* renderer;
std::vector<SDL_Event> events;
bool quit;
};
}
#endif
#include "level.hpp"
#include "building.hpp"
#include "unit.hpp"
#include <string>
#include <iostream>
#include <SDL.h>
namespace advanced_wars
{
Level::Level(std::string name, int width, int height, std::vector<Tile> tiles, std::vector<Building> buildings, std::vector<Unit> units): name(name), width(width), height(height), buildings(buildings), units(units) {};
void Level::render(SDL_Renderer *renderer, std::vector<SDL_Event> &events) {
// Iterate over all events
while (!events.empty()) {
events.erase(events.begin());
}
// Set background color for renderer
if(SDL_SetRenderDrawColor(renderer, 255, 0, 0, 0))
{
std::cout << "Could not set render draw color: " << SDL_GetError() << std::endl;
}
}
}
#ifndef LEVEL_HPP
#define LEVEL_HPP
#include "scene.hpp"
#include "tile.hpp"
#include "unit.hpp"
#include "building.hpp"
#include <string>
#include <vector>
#include <SDL.h>
namespace advanced_wars
{
/**
* @brief The main window of the game
*/
class Level: public Scene
{
public:
Level(std::string name, int width, int height, std::vector<Tile> tiles, std::vector<Building> buildings, std::vector<Unit> units);
void render(SDL_Renderer *renderer, std::vector<SDL_Event> &events);
private:
std::string name;
int width;
int height;
std::vector<Building> buildings;
std::vector<Unit> units;
};
}
#endif
#include <iostream>
#include "window.hpp"
#include "engine.hpp"
#include "level.hpp"
#include <vector>
using namespace advanced_wars;
int main() {
std::cout << "Hello World!" << std::endl;
Window window("Advanced Wars", 800, 600);
Level level("Osnabrück",20,20, std::vector<Tile>(), std::vector<Building>(),std::vector<Unit>());
Engine engine(window, level);
while(!engine.exited()) {
engine.pump();
engine.render();
}
return 0;
}
#ifndef SCENE_HPP
#define SCENE_HPP
#include <SDL.h>
#include <vector>
namespace advanced_wars {
class Scene {
public:
virtual void render(SDL_Renderer *renderer, std::vector<SDL_Event> &events) = 0;
};
}
#endif
#include "tile.hpp"
Tile::Tile() {};
#ifndef TILE_HPP
#define TILE_HPP
class Tile {
public:
Tile();
};
#endif
#include "unit.hpp"
Unit::Unit(int x, int y): x(x), y(y) {};
#ifndef UNIT_HPP
#define UNIT_HPP
class Unit {
public:
Unit(int x, int y);
private:
// Position
int x;
int y;
};
#endif
#include "window.hpp"
#include <stdexcept>
namespace advanced_wars
{
Window::Window(std::string title, int w, int h)
{
/// Init width and height
width = w;
height = h;
// Generate SDL main window
window = SDL_CreateWindow(
title.c_str(),
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
width,
height,
SDL_WINDOW_SHOWN );
if(window == nullptr)
{
throw std::runtime_error("SDL window could not be generated: " + std::string(SDL_GetError()));
}
}
int Window::w()
{
return width;
}
int Window::h()
{
return height;
}
SDL_Window* Window::sdl_window()
{
return window;
}
Window::~Window()
{
if(window)
{
SDL_DestroyWindow(window);
window = nullptr;
}
}
}
#ifndef WINDOW_HPP
#define WINDOW_HPP
#include <string>
#include <SDL.h>
namespace advanced_wars
{
/**
* @brief The main window of the game
*/
class Window
{
public:
/***
* Creates a main window with given \ref title, width \ref w and height \ref h
*
* @param title Title of the window
* @param w Width
* @param h Height
*/
Window(std::string title, int w, int h);
/**
* Forbids the creation of copies of a window
*/
Window(const Window&) = delete;
//Window& operator=(const Window&) = delete;
/***
* Destructor.
*/
~Window();
/// Retruns the current width of the window
int w();
/// Returns the current height of the window
int h();
SDL_Window* sdl_window();
private:
/// SDL main window struct
SDL_Window* window;
/// Window width
int width;
/// Window height
int height;
};
}
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment