Skip to content
Snippets Groups Projects
Commit 8553275f authored by Frederik Alexander Keens's avatar Frederik Alexander Keens
Browse files

Merge branch 'main' into 'LevelEventHandler'

# Conflicts:
#   src/game/Unit.cpp
parents 21e608fb 8796f9b4
Branches
No related tags found
2 merge requests!29Merge main into box2d to implement physics,!20Level event handler
......@@ -8,6 +8,8 @@ project(ADVANCED_WARS
)
include(FetchContent)
# HighFive einbinden
FetchContent_Declare(
highfive
GIT_REPOSITORY https://github.com/highfive-devs/highfive.git
......@@ -19,13 +21,13 @@ set(HIGHFIVE_UNIT_TESTS OFF)
FetchContent_MakeAvailable(highfive)
# Box2D einbinden
FetchContent_Declare(
box2d
GIT_REPOSITORY https://github.com/erincatto/box2d.git
GIT_TAG v3.0.0
)
# Box2D Build-Optionen konfigurieren
set(BOX2D_BUILD_TESTBED OFF CACHE BOOL "" FORCE)
set(BOX2D_BUILD_UNIT_TESTS OFF CACHE BOOL "" FORCE)
set(BOX2D_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
......@@ -72,43 +74,12 @@ file(GLOB HDF5_FILES ${RES_DIR}/*.h5)
# Executable erstellen
add_executable(advanced_wars ${ADVANCED_WARS_SOURCES})
target_include_directories(advanced_wars
PRIVATE
${highfive_SOURCE_DIR}/include
${Boost_INCLUDE_DIRS}
)
foreach(FONT ${FONT_FILES})
add_custom_command(
TARGET advanced_wars PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${FONT} ${OUTPUT_RES_DIR}
COMMENT "Kopiere Font: ${FONT} nach ${OUTPUT_RES_DIR}"
)
endforeach()
foreach(IMAGE ${IMAGE_FILES})
add_custom_command(
TARGET advanced_wars PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${IMAGE} ${OUTPUT_RES_DIR}
COMMENT "Kopiere Image: ${IMAGE} nach ${OUTPUT_RES_DIR}"
)
endforeach()
foreach(H5_FILE ${HDF5_FILES})
add_custom_command(
TARGET advanced_wars PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${H5_FILE} ${OUTPUT_RES_DIR}
COMMENT "Kopiere HDF5 File: ${H5_FILE} nach ${OUTPUT_RES_DIR}"
)
endforeach()
set(CMAKE_MODULE_PATH ${ADVANCED_WARS_SOURCE_DIR}/cmake/ ${CMAKE_MODULE_PATH})
# Plattform-spezifische Konfiguration
if(APPLE)
# SDL2 Frameworks für macOS
set(SDL2_PATH "/Library/Frameworks")
set(CMAKE_OSX_ARCHITECTURES "arm64")
target_include_directories(
advanced_wars PRIVATE
${SDL2_PATH}/SDL2.framework/Headers
......@@ -125,18 +96,26 @@ if(APPLE)
box2d
)
# HDF5 für macOS korrekt einbinden
find_package(HDF5 REQUIRED COMPONENTS CXX HL)
target_include_directories(advanced_wars PRIVATE ${HDF5_INCLUDE_DIRS} ${highfive_SOURCE_DIR}/include)
target_link_libraries(advanced_wars PRIVATE ${HDF5_LIBRARIES})
message(STATUS "Include Dir (SDL2): ${SDL2_PATH}/SDL2.framework/Headers")
message(STATUS "Include Dir (SDL2_image): ${SDL2_PATH}/SDL2_image.framework/Headers")
message(STATUS "Include Dir (SDL2_ttf): ${SDL2_PATH}/SDL2_ttf.framework/Headers")
message(STATUS "HDF5 Include Dirs: ${HDF5_INCLUDE_DIRS}")
message(STATUS "HDF5 Libraries: ${HDF5_LIBRARIES}")
message(STATUS "Boost Include Dirs: ${Boost_INCLUDE_DIRS}")
else()
# Linux Konfiguration
find_package(SDL2 REQUIRED)
find_package(SDL2_IMAGE REQUIRED)
find_package(SDL2_ttf REQUIRED)
find_package(HDF5 REQUIRED COMPONENTS CXX)
find_package(HDF5 REQUIRED COMPONENTS CXX HL)
include_directories(/usr/include/SDL2)
include_directories(${SDL2_INCLUDE_DIR})
include_directories(${SDL2_IMG_INCLUDE_DIR})
include_directories(${SDL2_TTF_INCLUDE_DIR})
......@@ -151,4 +130,33 @@ else()
box2d
m
)
target_include_directories(advanced_wars PRIVATE ${highfive_SOURCE_DIR}/include)
endif()
# Ressourcen kopieren (plattformübergreifend)
foreach(FONT ${FONT_FILES})
add_custom_command(
TARGET advanced_wars PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${FONT} ${OUTPUT_RES_DIR}
COMMENT "Kopiere Font: ${FONT} nach ${OUTPUT_RES_DIR}"
)
endforeach()
foreach(IMAGE ${IMAGE_FILES})
add_custom_command(
TARGET advanced_wars PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${IMAGE} ${OUTPUT_RES_DIR}
COMMENT "Kopiere Image: ${IMAGE} nach ${OUTPUT_RES_DIR}"
)
endforeach()
foreach(H5_FILE ${HDF5_FILES})
add_custom_command(
TARGET advanced_wars PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${H5_FILE} ${OUTPUT_RES_DIR}
COMMENT "Kopiere HDF5 File: ${H5_FILE} nach ${OUTPUT_RES_DIR}"
)
endforeach()
set(CMAKE_MODULE_PATH ${ADVANCED_WARS_SOURCE_DIR}/cmake/ ${CMAKE_MODULE_PATH})
\ No newline at end of file
No preview for this file type
......@@ -357,6 +357,44 @@ Spritesheet::Spritesheet(std::string path, Engine& engine)
this->m_effectWidth = 32;
this->m_effectHeight = 32;
// Numbers
HighFive::DataSet number_ds = file.getDataSet("/misc/numbers");
std::vector<std::vector<uint32_t>> number_frames;
number_ds.read(number_frames);
std::vector<uint32_t> number_buffer(8 * 80, 0);
for (int y = 0; y < 8; y++)
{
for (int x = 0; x < 80; x++)
{
int index = y * 80 + x;
number_buffer.at(index) = number_frames.at(8 - y - 1).at(x);
}
}
SDL_Texture* tmp = SDL_CreateTexture(
engine.renderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, 80, 8);
SDL_SetTextureBlendMode(tmp, SDL_BLENDMODE_BLEND);
if (tmp == nullptr)
{
throw std::runtime_error(
"Fehler beim Erstellen der Textur für die Effects: " + std::string(SDL_GetError()));
}
if (SDL_UpdateTexture(tmp, NULL, number_buffer.data(), 80 * sizeof(int32_t)) != 0)
{
throw std::runtime_error(
"Fehler beim updaten der Textur für die Tiles: " + std::string(SDL_GetError()));
}
this->m_numberTextures = tmp;
this->m_numberWidth = 8;
this->m_numberHeight = 8;
}
// Tiles
......@@ -434,6 +472,22 @@ std::vector<std::pair<SDL_Texture*, int>>& Spritesheet::getEffectTextures()
return this->m_effectTextures;
}
// Numbers
int Spritesheet::getNumberWidth()
{
return this->m_numberWidth;
}
int Spritesheet::getNumberHeight()
{
return this->m_numberHeight;
}
SDL_Texture* Spritesheet::getNumberTexture()
{
return this->m_numberTextures;
}
Spritesheet::~Spritesheet()
{
for (std::pair<SDL_Texture*, int> tile_texture : m_tileTextures)
......@@ -456,6 +510,13 @@ Spritesheet::~Spritesheet()
}
}
}
for (auto& [texture, i] : m_effectTextures)
{
SDL_DestroyTexture(texture);
}
SDL_DestroyTexture(m_numberTextures);
}
} // namespace advanced_wars
\ No newline at end of file
......@@ -153,6 +153,26 @@ class Spritesheet
*/
std::vector<std::pair<SDL_Texture*, int>>& getEffectTextures();
// Numbers
/**
* @return The width of a number in pixels
*/
int getNumberWidth();
/**
* @return The height of a number in pixels
*/
int getNumberHeight();
/**
* The texture represents the individual texture for all numbers linearised.
*
* The order of the numbers is the following: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
*
* @return Number texture
*/
SDL_Texture* getNumberTexture();
private:
// Tiles
std::vector<std::pair<SDL_Texture*, int>> m_tileTextures;
......@@ -179,5 +199,11 @@ class Spritesheet
int m_effectWidth;
int m_effectHeight;
// Numbers
SDL_Texture* m_numberTextures;
int m_numberWidth;
int m_numberHeight;
};
} // namespace advanced_wars
......@@ -64,7 +64,7 @@ void Unit::render(Engine& engine, int scale)
SDL_Rect dst;
dst.x = ((m_x * spritesheet->getUnitWidth()) - 4) * scale;
dst.y = ((m_y * spritesheet->getUnitHeight()) - 4) * scale;
dst.y = ((m_y * spritesheet->getUnitHeight()) - 8) * scale;
dst.w = spritesheet->getUnitMovingWidth() * scale;
dst.h = spritesheet->getUnitMovingHeight() * scale;
......@@ -77,6 +77,7 @@ void Unit::render(Engine& engine, int scale)
.first,
&src, &dst, 0, NULL, SDL_FLIP_NONE);
}
renderHP(engine, scale);
}
void Unit::attack(Unit& enemy)
......@@ -221,4 +222,38 @@ UnitFaction Unit::getFaction()
return this->m_faction;
}
void Unit::renderHP(Engine& engine, int scale)
{
Spritesheet* spritesheet = engine.getSpritesheet();
SDL_Texture* numbers = spritesheet->getNumberTexture();
int numberWidth = spritesheet->getNumberWidth();
int numberHeight = spritesheet->getNumberHeight();
int hp = ceil((double)m_health / 10);
SDL_Rect src;
src.x = hp % 10 * numberWidth;
src.y = 0;
src.w = numberWidth;
src.h = numberHeight;
SDL_Rect dest;
dest.x = (m_x * spritesheet->getTileWidth() + 8) * scale;
dest.y = (m_y * spritesheet->getTileHeight() + 12) * scale;
dest.w = numberWidth * scale;
dest.h = numberHeight * scale;
SDL_RenderCopy(engine.renderer(), numbers, &src, &dest);
if (hp == 10)
{
src.x = 8;
dest.x = (m_x * spritesheet->getTileWidth() + 1) * scale;
SDL_RenderCopy(engine.renderer(), numbers, &src, &dest);
}
}
} // namespace advanced_wars
\ No newline at end of file
......@@ -137,6 +137,8 @@ class Unit
Weapon m_primaryWeapon;
int m_ammo;
void renderHP(Engine& engine, int scale);
};
} // namespace advanced_wars
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment