diff --git a/BUILDING.md b/BUILDING.md new file mode 100644 index 0000000..832c26e --- /dev/null +++ b/BUILDING.md @@ -0,0 +1,83 @@ +# Building Motherload + +This repository now supports both the original Visual Studio solution files and a CMake-based build. + +## Supported build paths + +### 1. CMake on Windows +Recommended if you want a modern, editor-friendly build setup. + +Requirements: +- Visual Studio 2022 with Desktop development with C++ +- CMake 3.21+ + +The repository already contains the required prebuilt Windows SDL packages in `Libraries/`. + +Configure and build: + +```bash +cmake -S . -B build -G "Visual Studio 17 2022" -A x64 +cmake --build build --config Debug +``` + +### 2. CMake on Linux +Requirements: +- C++ compiler +- CMake 3.21+ +- SDL2 development packages +- OpenGL development package + +Ubuntu / Debian example: + +```bash +sudo apt install build-essential cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libgl1-mesa-dev +cmake -S . -B build +cmake --build build +``` + +### 3. Legacy Visual Studio solution +The existing `.sln` and `.vcxproj` files are still in the repo and can still be opened directly in Visual Studio. + +## Build output + +The CMake build writes the executable to: +- `build/bin/` for single-config generators +- the active configuration output folder for Visual Studio generators + +Resource files from `Resources/` are copied automatically after a successful build. + +## Notes about dependencies + +### Windows +CMake uses the bundled SDL package config files from: +- `Libraries/SDLMain/.../cmake` +- `Libraries/SDLImage/.../cmake` +- `Libraries/SDLMixer/.../cmake` +- `Libraries/SDLTtf/.../cmake` + +### Linux +CMake falls back to `pkg-config` and expects these packages to be installed: +- `sdl2` +- `SDL2_image` +- `SDL2_mixer` +- `SDL2_ttf` + +## Troubleshooting + +### CMake fails at `find_package(OpenGL REQUIRED)` +Install the OpenGL development package. + +Ubuntu / Debian: + +```bash +sudo apt install libgl1-mesa-dev +``` + +### CMake cannot find SDL packages on Linux +Install the SDL development packages listed above. + +### The game starts but cannot find assets +Run the executable from the build output directory, not from the source directory root. The post-build step copies `Resources/` next to the executable. + +### Why are the old MSVC `#pragma comment(lib, ...)` lines still in the code? +They are still there for the legacy Visual Studio project files, but the CMake build disables them explicitly so dependency management stays inside CMake. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d8ce1fa --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,169 @@ +cmake_minimum_required(VERSION 3.21) + +project(Motherload LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + +option(MOTHERLOAD_USE_BUNDLED_WINDOWS_SDL "Use the bundled prebuilt SDL packages on Windows" ON) +option(MOTHERLOAD_ENABLE_WARNINGS "Enable compiler warnings" ON) + +if(WIN32 AND MOTHERLOAD_USE_BUNDLED_WINDOWS_SDL) + list(PREPEND CMAKE_PREFIX_PATH + "${CMAKE_SOURCE_DIR}/Libraries/SDLMain/SDL2-2.26.3/cmake" + "${CMAKE_SOURCE_DIR}/Libraries/SDLImage/SDL2_image-2.6.3/cmake" + "${CMAKE_SOURCE_DIR}/Libraries/SDLMixer/SDL2_mixer-2.6.3/cmake" + "${CMAKE_SOURCE_DIR}/Libraries/SDLTtf/SDL2_ttf-2.20.2/cmake" + ) +endif() + +find_package(OpenGL REQUIRED) + +function(motherload_import_pkgconfig_target imported_target pkg_name pkg_prefix) + if(TARGET "${imported_target}") + return() + endif() + + find_package(PkgConfig REQUIRED) + pkg_check_modules(${pkg_prefix} REQUIRED IMPORTED_TARGET "${pkg_name}") + + add_library("${imported_target}" INTERFACE IMPORTED) + target_link_libraries("${imported_target}" INTERFACE "PkgConfig::${pkg_prefix}") +endfunction() + +function(motherload_enable_warnings target_name) + if(NOT MOTHERLOAD_ENABLE_WARNINGS) + return() + endif() + + if(MSVC) + target_compile_options(${target_name} PRIVATE /W4 /permissive-) + else() + target_compile_options(${target_name} PRIVATE -Wall -Wextra -Wpedantic) + endif() +endfunction() + +find_package(SDL2 QUIET CONFIG) +find_package(SDL2_image QUIET CONFIG) +find_package(SDL2_mixer QUIET CONFIG) +find_package(SDL2_ttf QUIET CONFIG) + +motherload_import_pkgconfig_target(SDL2::SDL2 sdl2 SDL2_PC) +motherload_import_pkgconfig_target(SDL2_image::SDL2_image SDL2_image SDL2_IMAGE_PC) +motherload_import_pkgconfig_target(SDL2_mixer::SDL2_mixer SDL2_mixer SDL2_MIXER_PC) +motherload_import_pkgconfig_target(SDL2_ttf::SDL2_ttf SDL2_ttf SDL2_TTF_PC) + +if(NOT TARGET SDL2::SDL2main) + find_library(SDL2MAIN_LIBRARY NAMES SDL2main) + if(SDL2MAIN_LIBRARY) + add_library(SDL2::SDL2main UNKNOWN IMPORTED) + set_target_properties(SDL2::SDL2main PROPERTIES IMPORTED_LOCATION "${SDL2MAIN_LIBRARY}") + endif() +endif() + +set(ENGINE_SOURCES + Engine/BaseGame.cpp + Engine/Collision.cpp + Engine/Matrix2x3.cpp + Engine/SVGParser.cpp + Engine/SoundEffect.cpp + Engine/SoundStream.cpp + Engine/Text.cpp + Engine/Texture.cpp + Engine/Vector2f.cpp + Engine/structs.cpp + Engine/utils.cpp +) + +set(GAME_SOURCES + Game/Animations/Animation.cpp + Game/Camera.cpp + Game/Game.cpp + Game/GameManager.cpp + Game/GridSystem/GroundTileTypeManager.cpp + Game/GridSystem/WorldGridManager.cpp + Game/GridSystem/WorldTile.cpp + Game/Gui/GuiButton.cpp + Game/Gui/GuiElement.cpp + Game/Gui/GuiMeter.cpp + Game/Gui/GuiText.cpp + Game/Gui/Screen.cpp + Game/Gui/Screens/FuelScreen/FuelScreen.cpp + Game/Gui/Screens/GameOver/GameOverScreen.cpp + Game/Gui/Screens/MainScreen.cpp + Game/Gui/Screens/ScreenManager.cpp + Game/Gui/Screens/SellScreen/SellScreen.cpp + Game/Gui/Screens/SellScreen/SellSreenRow.cpp + Game/Inventory/PlayerInventory.cpp + Game/Levels/Level.cpp + Game/Levels/MainMenu/MainMenuLevel.cpp + Game/Levels/World/Building.cpp + Game/Levels/World/OrbitingObject.cpp + Game/Levels/World/WorldLevel.cpp + Game/Particle/Particle.cpp + Game/Player.cpp + Game/TextureManager.cpp + Game/main.cpp + Game/pch.cpp +) + +add_library(Engine STATIC ${ENGINE_SOURCES}) +target_include_directories(Engine + PUBLIC + "${CMAKE_SOURCE_DIR}/Engine" +) +target_compile_definitions(Engine + PUBLIC + MOTHERLOAD_DISABLE_MSVC_LINK_PRAGMAS=1 +) +target_link_libraries(Engine + PUBLIC + OpenGL::GL + SDL2::SDL2 + SDL2_image::SDL2_image + SDL2_mixer::SDL2_mixer + SDL2_ttf::SDL2_ttf +) +motherload_enable_warnings(Engine) + +add_executable(Motherload ${GAME_SOURCES}) +target_include_directories(Motherload + PRIVATE + "${CMAKE_SOURCE_DIR}/Game" + "${CMAKE_SOURCE_DIR}/Engine" +) +target_link_libraries(Motherload + PRIVATE + Engine + OpenGL::GL + SDL2::SDL2 + SDL2_image::SDL2_image + SDL2_mixer::SDL2_mixer + SDL2_ttf::SDL2_ttf +) + +if(TARGET SDL2::SDL2main) + target_link_libraries(Motherload PRIVATE SDL2::SDL2main) +endif() +motherload_enable_warnings(Motherload) + +source_group(TREE "${CMAKE_SOURCE_DIR}" FILES ${ENGINE_SOURCES} ${GAME_SOURCES}) +set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT Motherload) +set_property(TARGET Motherload PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "$") + +add_custom_command(TARGET Motherload POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${CMAKE_SOURCE_DIR}/Resources" + "$" +) + +if(WIN32) + add_custom_command(TARGET Motherload POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ + $ + COMMAND_EXPAND_LISTS + ) +endif() diff --git a/Engine/BaseGame.h b/Engine/BaseGame.h index 5bf6b30..4b9de0c 100644 --- a/Engine/BaseGame.h +++ b/Engine/BaseGame.h @@ -16,23 +16,23 @@ public: void Run(); - virtual void Update(float elapsedSec) { + virtual void Update(float) { } virtual void Draw() const { } // Event handling - virtual void ProcessKeyDownEvent(const SDL_KeyboardEvent& e) { + virtual void ProcessKeyDownEvent(const SDL_KeyboardEvent&) { } - virtual void ProcessKeyUpEvent(const SDL_KeyboardEvent& e) { + virtual void ProcessKeyUpEvent(const SDL_KeyboardEvent&) { } - virtual void ProcessMouseMotionEvent(const SDL_MouseMotionEvent& e) { + virtual void ProcessMouseMotionEvent(const SDL_MouseMotionEvent&) { } - virtual void ProcessMouseDownEvent(const SDL_MouseButtonEvent& e) { + virtual void ProcessMouseDownEvent(const SDL_MouseButtonEvent&) { } - virtual void ProcessMouseUpEvent(const SDL_MouseButtonEvent& e) { + virtual void ProcessMouseUpEvent(const SDL_MouseButtonEvent&) { } - virtual void ProcessMouseWheelEvent(const SDL_MouseWheelEvent& e) { + virtual void ProcessMouseWheelEvent(const SDL_MouseWheelEvent&) { } diff --git a/Engine/Matrix2x3.cpp b/Engine/Matrix2x3.cpp index df8b30d..c1c1267 100644 --- a/Engine/Matrix2x3.cpp +++ b/Engine/Matrix2x3.cpp @@ -108,8 +108,8 @@ void Matrix2x3::SetAsIdentity() void Matrix2x3::SetAsRotate(float degrees) { float radians = degrees * 3.1415926535f / 180; - dirX = Vector2f{ cos( radians ), sin( radians ) }; - dirY = Vector2f{ -sin( radians ), cos( radians ) }; + dirX = Vector2f{ std::cos( radians ), std::sin( radians ) }; + dirY = Vector2f{ -std::sin( radians ), std::cos( radians ) }; orig = Vector2f{ 0, 0 }; } void Matrix2x3::SetAsTranslate(float tx, float ty) @@ -141,7 +141,7 @@ void Matrix2x3::SetAsScale(float scale) Matrix2x3 Matrix2x3::CreateRotationMatrix(float degrees) { float radians = degrees * 3.1415926535f / 180; - return Matrix2x3( Vector2f{ cos( radians ), sin( radians ) }, Vector2f{ -sin(radians), cos( radians ) }, Vector2f{} ); + return Matrix2x3( Vector2f{ std::cos( radians ), std::sin( radians ) }, Vector2f{ -std::sin(radians), std::cos( radians ) }, Vector2f{} ); } Matrix2x3 Matrix2x3::CreateIdentityMatrix() @@ -199,4 +199,3 @@ std::ostream& operator<<(std::ostream& os, const Matrix2x3& matrix ) os << matrix.ToString( ); return os; } - diff --git a/Engine/SVGParser.cpp b/Engine/SVGParser.cpp index e27faa7..cb02bde 100644 --- a/Engine/SVGParser.cpp +++ b/Engine/SVGParser.cpp @@ -198,7 +198,7 @@ bool SVGParser::GetVerticesFromPathData( const std::string& pathData, std::vecto isOpen = false; break; } - // Fallthrough when isOpen + [[fallthrough]]; case ( 'L' )://lineto case ( 'l' ): vertex = NextSvgPoint( ss, cursor, cmd, isOpen, true ); diff --git a/Engine/SoundEffect.cpp b/Engine/SoundEffect.cpp index db31324..c09c861 100644 --- a/Engine/SoundEffect.cpp +++ b/Engine/SoundEffect.cpp @@ -20,7 +20,7 @@ bool SoundEffect::IsLoaded() const { void SoundEffect::Play(const int loops) const { if (m_pMixChunk != nullptr) { - const int channel { Mix_PlayChannel(m_Channel, m_pMixChunk, loops) }; + Mix_PlayChannel(m_Channel, m_pMixChunk, loops); } else { std::cout << "SoundEffect::Play() failed, sound effect not loaded\n"; diff --git a/Engine/base.h b/Engine/base.h index 3e833d0..bb75d32 100644 --- a/Engine/base.h +++ b/Engine/base.h @@ -1,7 +1,7 @@ #pragma once //ML Detection Extension -#ifdef _DEBUG +#if defined(_MSC_VER) && defined(_DEBUG) #define _CRTDBG_MAP_ALLOC #include #include @@ -9,6 +9,7 @@ #define new DEBUG_NEW #endif +#if defined(_MSC_VER) && !defined(MOTHERLOAD_DISABLE_MSVC_LINK_PRAGMAS) // SDL libs #pragma comment(lib, "SDL2.lib") #pragma comment(lib, "SDL2main.lib") @@ -21,16 +22,21 @@ #pragma comment(lib, "SDL2_image.lib") #pragma comment(lib, "SDL2_ttf.lib") #pragma comment(lib, "SDL2_mixer.lib") +#endif // SDL and OpenGL Includes +#if defined(_MSC_VER) #pragma warning(disable : 26812) #pragma warning(disable : 4820) +#endif #include #include #include #include #include +#if defined(_MSC_VER) #pragma warning(default : 26812) +#pragma warning(default : 4820) +#endif #include "structs.h" - diff --git a/Engine/utils.cpp b/Engine/utils.cpp index 4bb970b..40ecfcc 100644 --- a/Engine/utils.cpp +++ b/Engine/utils.cpp @@ -233,15 +233,15 @@ void utils::FillPolygon(const std::vector& vertices) { void utils::DrawArrow(const Vector2f& start, const Vector2f& end, float lineWidth, float arrowSize) { // Origin is bottom left - utils::DrawLine(start, end); + utils::DrawLine(start, end, lineWidth); const float arrowAngle = atan2f(end.y - start.y, end.x - start.x); const float arrowAngle1 = arrowAngle + g_Pi + 0.4f; const float arrowAngle2 = arrowAngle + g_Pi - 0.4f; const Vector2f arrow1 { end.x + arrowSize * cosf(arrowAngle1), end.y + arrowSize * sinf(arrowAngle1) }; const Vector2f arrow2 { end.x + arrowSize * cosf(arrowAngle2), end.y + arrowSize * sinf(arrowAngle2) }; - utils::DrawLine(end, arrow1); - utils::DrawLine(end, arrow2); + utils::DrawLine(end, arrow1, lineWidth); + utils::DrawLine(end, arrow2, lineWidth); } void utils::FillPolygon(const Vector2f* pVertices, size_t nrVertices) { @@ -610,11 +610,14 @@ bool utils::IsRectInRect(const Rectf& r1, const Rectf& r2) { bool utils::RayVsRect(const Vector2f& rayOrigin, const Vector2f& rayDir, const Rectf& target, Vector2f& contactPoint, Vector2f& contactNormal, float& t_hit_near) { - // Vector2f t_near = Vector2f{(target.BottomLeft() - rayOrigin).x / rayDir.x, (target.BottomLeft() - rayOrigin).y / rayDir.y}; - // Vector2f t_far = Vector2f{(target.BottomLeft() + Vector2f{target.width, target.height} - rayOrigin).x / rayDir.x, (target.BottomLeft() + Vector2f{target.width, target.height} - rayOrigin).y / rayDir.y}; - - Vector2f t_near {}; - Vector2f t_far {}; + Vector2f t_near { + (target.left - rayOrigin.x) / rayDir.x, + (target.bottom - rayOrigin.y) / rayDir.y + }; + Vector2f t_far { + (target.left + target.width - rayOrigin.x) / rayDir.x, + (target.bottom + target.height - rayOrigin.y) / rayDir.y + }; if (std::isnan(t_far.y) || std::isnan(t_far.x)) return false; @@ -757,4 +760,3 @@ bool utils::isMouseDown(int button) { } //utils::getScrollMovement() - diff --git a/Game/Animations/Animation.cpp b/Game/Animations/Animation.cpp index 5359016..82b1b2d 100644 --- a/Game/Animations/Animation.cpp +++ b/Game/Animations/Animation.cpp @@ -5,7 +5,7 @@ #include "utils.h" Animation::Animation(Texture* pTexture, int frames, float frameDuration, Rectf srcRect, bool isLooping): m_pTexture(pTexture), m_SrcRect(srcRect), m_Frames(frames), - m_IsLooping(isLooping), m_FrameDuration(frameDuration) { + m_FrameDuration(frameDuration), m_IsLooping(isLooping) { } void Animation::Update(float elapsedSec) { @@ -28,7 +28,7 @@ void Animation::Draw(const Vector2f& pos) const { Draw(pos, Rectf { pos.x, pos.y, m_SrcRect.width, m_SrcRect.height }); } -void Animation::Draw(const Vector2f& pos, const Rectf& dst) const { +void Animation::Draw(const Vector2f&, const Rectf& dst) const { Rectf src = m_SrcRect; src.left += static_cast(m_CurrentFrame) * src.width; diff --git a/Game/Game.cpp b/Game/Game.cpp index 326d558..cb91563 100644 --- a/Game/Game.cpp +++ b/Game/Game.cpp @@ -36,8 +36,6 @@ void Game::Cleanup() { } void Game::Update(float elapsedSec) { - const Uint8* pStates = SDL_GetKeyboardState(nullptr); - if (m_IsRightMouseDown) { const Vector2f newCameraPos = Vector2f { m_MousePosition.x + m_MouseOffset.x, m_MousePosition.y + m_MouseOffset.y }; m_Camera.SetPosition(Vector2f { -newCameraPos.x, -newCameraPos.y }); @@ -62,7 +60,7 @@ void Game::ProcessKeyDownEvent(const SDL_KeyboardEvent& e) { } } -void Game::ProcessKeyUpEvent(const SDL_KeyboardEvent& e) { +void Game::ProcessKeyUpEvent(const SDL_KeyboardEvent&) { } void Game::ProcessMouseMotionEvent(const SDL_MouseMotionEvent& e) { diff --git a/Game/GameManager.cpp b/Game/GameManager.cpp index 1e5e453..6b7dc94 100644 --- a/Game/GameManager.cpp +++ b/Game/GameManager.cpp @@ -69,7 +69,7 @@ int GameManager::GetMoney() const { void GameManager::IncreaseMoney(int money) { m_Money += money; } -void GameManager::Update(float elapsedSecs) { +void GameManager::Update(float) { m_pMainScreen->SetFuelMeterValue(this->GetMaxFuel() - m_Fuel); m_pMainScreen->SetHullMeterValue((float)m_HullIntegrity); m_pMainScreen->SetScore(std::to_string(m_Score)); @@ -104,4 +104,3 @@ GameManager::GameManager() { - diff --git a/Game/GridSystem/WorldTile.cpp b/Game/GridSystem/WorldTile.cpp index 839cba9..e70de55 100644 --- a/Game/GridSystem/WorldTile.cpp +++ b/Game/GridSystem/WorldTile.cpp @@ -35,7 +35,6 @@ GroundTileType * getRandomGroundTile() { return GroundTileTypeManager::GetInstance()->AIR; // Default value } void InitializeGroundTiles() { - Tiles tiles {}; GroundTileTypeManager::GetInstance()->AIR = new GroundTileType("", GroundTileTypes::Air, 0); GroundTileTypeManager::GetInstance()->DIRT = new RandomGroundTile("tiles/dirt/dirt[0].png", GroundTileTypes::Dirt, 5, 250); diff --git a/Game/GridSystem/WorldTile.h b/Game/GridSystem/WorldTile.h index 8ffc73c..5d55098 100644 --- a/Game/GridSystem/WorldTile.h +++ b/Game/GridSystem/WorldTile.h @@ -96,7 +96,6 @@ public: } std::string GetPath() const override { - int variant = utils::randRange(1, m_maxRandom); std::string toReplace { "[0]" }; std::string replacement = std::to_string(utils::randRange(1, m_maxRandom)); diff --git a/Game/Gui/GuiButton.cpp b/Game/Gui/GuiButton.cpp index 3d3ed5b..75aa6bc 100644 --- a/Game/Gui/GuiButton.cpp +++ b/Game/Gui/GuiButton.cpp @@ -20,7 +20,7 @@ void GuiButton::Draw() const { } } -void GuiButton::Update(float elapsedSec) { +void GuiButton::Update(float) { Vector2f mousePos = utils::GetMousePos(); Rectf buttonRect = Rectf(m_Position, m_Size); diff --git a/Game/Gui/GuiMeter.cpp b/Game/Gui/GuiMeter.cpp index 5df3509..119f96e 100644 --- a/Game/Gui/GuiMeter.cpp +++ b/Game/Gui/GuiMeter.cpp @@ -19,7 +19,7 @@ void GuiMeter::Draw() const { m_Animation->Draw(m_Position, Rectf{m_Position, m_DrawSize}); // utils::DrawRect(Rectf { m_Position, m_DrawSize}); } -void GuiMeter::Update(float elapsedSec) { +void GuiMeter::Update(float) { const int frame = static_cast(utils::map(m_Value, 0.0f, m_MaxValue, 0, (float)m_Animation->GetFrameCount())); m_Animation->SetFrame(frame); } diff --git a/Game/Gui/GuiText.cpp b/Game/Gui/GuiText.cpp index 61ec18b..5641ada 100644 --- a/Game/Gui/GuiText.cpp +++ b/Game/Gui/GuiText.cpp @@ -16,7 +16,7 @@ void GuiText::Draw() const { m_Text->Draw(m_Position); } -void GuiText::Update(float elapsedSec) { +void GuiText::Update(float) { } void GuiText::ChangeText(const std::string& text) const { diff --git a/Game/Gui/Screens/SellScreen/SellSreenRow.cpp b/Game/Gui/Screens/SellScreen/SellSreenRow.cpp index 1eb4028..66b9456 100644 --- a/Game/Gui/Screens/SellScreen/SellSreenRow.cpp +++ b/Game/Gui/Screens/SellScreen/SellSreenRow.cpp @@ -29,7 +29,7 @@ void SellSreenRow::Draw() const { // utils::SetColor(Colors::GREEN); // utils::DrawRect(Rectf { m_Pos, m_Size }); } -void SellSreenRow::Update(float elapsedSecs) { +void SellSreenRow::Update(float) { // m_NameText->ChangeText("EXAMPLE"); // m_CalculationText->ChangeText(std::to_string(m_Item.m_Quantity)); GenerateCalcString(); diff --git a/Game/Levels/MainMenu/MainMenuLevel.cpp b/Game/Levels/MainMenu/MainMenuLevel.cpp index 7108e31..811abaf 100644 --- a/Game/Levels/MainMenu/MainMenuLevel.cpp +++ b/Game/Levels/MainMenu/MainMenuLevel.cpp @@ -13,7 +13,7 @@ MainMenuLevel::~MainMenuLevel() { delete m_TextNewGame; delete m_TextExit; } -void MainMenuLevel::Update(float elapsedSec) { +void MainMenuLevel::Update(float) { } void MainMenuLevel::Draw() const { m_TextMotherload->Draw(Vector2f(200, 100)); @@ -21,5 +21,5 @@ void MainMenuLevel::Draw() const { m_TextExit->Draw(Vector2f(200, 300)); } -void MainMenuLevel::MouseMove(const Vector2f& mousePos) { +void MainMenuLevel::MouseMove(const Vector2f&) { } diff --git a/Game/Levels/World/Building.cpp b/Game/Levels/World/Building.cpp index 98a2df5..a854c3c 100644 --- a/Game/Levels/World/Building.cpp +++ b/Game/Levels/World/Building.cpp @@ -22,7 +22,7 @@ void Building::Draw() const { // temp.bottom += m_Position.y; // utils::DrawRect(temp); } -void Building::Update(float dt, const Rectf& objectBoundingBox) { +void Building::Update(float, const Rectf& objectBoundingBox) { if (IsObjectInHitbox(objectBoundingBox)) { Player* player = GameManager::GetInstance().GetPlayer(); float speed = player->GetVelocity().Length(); diff --git a/Game/Levels/World/OrbitingObject.cpp b/Game/Levels/World/OrbitingObject.cpp index bc9d364..dbbf744 100644 --- a/Game/Levels/World/OrbitingObject.cpp +++ b/Game/Levels/World/OrbitingObject.cpp @@ -1,8 +1,9 @@ #include "pch.h" #include "OrbitingObject.h" +#include #include -OrbitingObject::OrbitingObject(const Vector2f& orbit, float distance, float speed, Texture* texture, float offset): m_Texture(texture), m_Orbit(orbit), m_Speed(speed), m_Distance(distance), m_currentCycle(offset) { +OrbitingObject::OrbitingObject(const Vector2f& orbit, float distance, float speed, Texture* texture, float offset): m_Texture(texture), m_Orbit(orbit), m_Distance(distance), m_Speed(speed), m_currentCycle(offset) { } void OrbitingObject::Update(float elapsedSecs) { m_Position = Vector2f(m_Orbit.x + cosf(m_currentCycle) * m_Distance, m_Orbit.y + sinf(m_currentCycle) * m_Distance); diff --git a/Game/Particle/Particle.cpp b/Game/Particle/Particle.cpp index 82237f1..cb4b4fb 100644 --- a/Game/Particle/Particle.cpp +++ b/Game/Particle/Particle.cpp @@ -1,6 +1,6 @@ #include "pch.h" #include "Particle.h" -Particle::Particle(const Vector2f& pos, const Vector2f& velocity,const Vector2f& gravity, float lifetime, Texture* pTexture): m_Position { pos }, m_Velocity { velocity }, m_LifeTime { lifetime }, m_Gravity(gravity), +Particle::Particle(const Vector2f& pos, const Vector2f& velocity,const Vector2f& gravity, float lifetime, Texture* pTexture): m_Position { pos }, m_Velocity { velocity }, m_Gravity(gravity), m_LifeTime { lifetime }, m_pTexture { pTexture } { } void Particle::Update(float elapsedSec) { diff --git a/Game/Player.cpp b/Game/Player.cpp index 0b3fe15..0c1c66e 100644 --- a/Game/Player.cpp +++ b/Game/Player.cpp @@ -136,7 +136,7 @@ void Player::Die() { m_CurrentAnimation = m_DieStartAnimation; m_HasPlayedDeathAnimation = false; } -void Player::Dig(Collision::CollisionDirection dir, WorldLevel& level) { +void Player::Dig(Collision::CollisionDirection dir, WorldLevel&) { m_State = PlayerState::Digging; m_DigProgress = 0; m_DigTile = m_ContactMap[dir]; @@ -157,7 +157,7 @@ void Player::Dig(Collision::CollisionDirection dir, WorldLevel& level) { m_ContactMap[dir] = nullptr; } -bool Player::CanDig(Collision::CollisionDirection dir, WorldLevel& level) { +bool Player::CanDig(Collision::CollisionDirection dir, WorldLevel&) { WorldTile* tile = m_ContactMap[dir]; if (tile == nullptr) { return false; @@ -371,7 +371,7 @@ void Player::Update(float elapsedTime, WorldLevel& level) { m_ContactMap[Collision::CollisionDirection::Right] = nullptr; m_Grounded = false; - float t = 0, min_t = INFINITY; + float t = 0; Vector2f intersectionPoint, normal; std::vector> contactTimes {}; diff --git a/Game/main.cpp b/Game/main.cpp index 984cb0d..34e13e8 100644 --- a/Game/main.cpp +++ b/Game/main.cpp @@ -7,7 +7,7 @@ void DumpMemoryLeaks(); Vector2f Viewport { 900.f, 500.f }; -int SDL_main(int argv, char** args) { +int SDL_main(int, char**) { srand(static_cast(time(nullptr))); StartHeapControl(); @@ -21,7 +21,7 @@ int SDL_main(int argv, char** args) { void StartHeapControl() { -#if defined(DEBUG) | defined(_DEBUG) +#if defined(_MSC_VER) && defined(_DEBUG) // Notify user if heap is corrupt HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); @@ -34,7 +34,7 @@ void StartHeapControl() { } void DumpMemoryLeaks() { -#if defined(DEBUG) | defined(_DEBUG) +#if defined(_MSC_VER) && defined(_DEBUG) _CrtDumpMemoryLeaks(); #endif } diff --git a/Game/pch.h b/Game/pch.h index 5b798dc..c8fab9c 100644 --- a/Game/pch.h +++ b/Game/pch.h @@ -1,6 +1,6 @@ #pragma once //ML Detection Extension -#ifdef _DEBUG +#if defined(_MSC_VER) && defined(_DEBUG) #define _CRTDBG_MAP_ALLOC #include #include @@ -8,13 +8,18 @@ #define new DEBUG_NEW #endif // SDL and OpenGL Includes +#if defined(_MSC_VER) #pragma warning(disable : 26812) #pragma warning(disable : 4820) +#endif #include #include #include #include #include +#if defined(_MSC_VER) #pragma warning(default : 26812) +#pragma warning(default : 4820) +#endif #include "structs.h" diff --git a/README.md b/README.md index 1fabede..00d1c1e 100644 --- a/README.md +++ b/README.md @@ -79,18 +79,52 @@ This section gives a clear and detailed overview of which parts of the original ## Getting Started -Detailed instructions on how to run your game project are in this section. +This project now includes a CMake build in addition to the original Visual Studio solution files. +For the longer version, troubleshooting, and platform notes, see [`BUILDING.md`](BUILDING.md). ### Prerequisites -This is an example of how to list things you need to use the software and how to install them. -* Visual Studio 2022 Or Jetbrains Rider +#### Windows +* Visual Studio 2022 with the Desktop development with C++ workload +* CMake 3.21 or newer -### How to run the project +The repository already contains prebuilt SDL2 / SDL2_image / SDL2_mixer / SDL2_ttf Windows packages in `Libraries/`, and the CMake build will use those by default. -1. Download the Repo. -2. Open the project in Visual Studio 2022 or Jetbrains Rider. -3. Run the project. +#### Linux +Install the development packages first. + +Ubuntu / Debian example: +```bash +sudo apt install build-essential cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libgl1-mesa-dev +``` + +### Build with CMake + +#### Windows, Visual Studio 2022 +```bash +cmake -S . -B build -G "Visual Studio 17 2022" -A x64 +cmake --build build --config Debug +``` + +The executable will be generated in `build/bin/` or the selected Visual Studio configuration output folder. Resource files are copied automatically after the build. + +#### Linux +```bash +cmake -S . -B build +cmake --build build +``` + +The executable will be generated in `build/bin/`. Resource files are copied automatically after the build. + +### Run the game + +After building, run the generated executable from the build output directory so that the copied resource files are next to it. + +### Notes + +* The original `.sln` and `.vcxproj` files are still present and can still be used in Visual Studio. +* The CMake build creates the same two logical targets as the solution: `Engine` and `Motherload`. +* On non-Windows platforms, SDL dependencies are expected to come from the system package manager.

(back to top)