From 38bd97148aff4b50d06afb36d8ad37ebea5ce592 Mon Sep 17 00:00:00 2001 From: ElnuDev Date: Fri, 11 Mar 2022 21:25:04 -0800 Subject: [PATCH] Get Windows compilation partially working --- build/.gitignore | 5 +-- build/linux/.gitignore | 3 ++ build/windows/.gitignore | 2 ++ build/windows/build.sh | 11 ++++++ build/windows/mingw-w64-x86_64.cmake | 35 ++++++++++++++++++ include/BlockType.hpp | 4 +-- include/NumberRenderer.hpp | 2 +- include/TileType.hpp | 2 +- src/BlockType.cpp | 4 +-- src/Main.cpp | 53 +++++++++++++++------------- src/NumberRenderer.cpp | 4 +-- 11 files changed, 89 insertions(+), 36 deletions(-) create mode 100644 build/linux/.gitignore create mode 100644 build/windows/.gitignore create mode 100755 build/windows/build.sh create mode 100644 build/windows/mingw-w64-x86_64.cmake diff --git a/build/.gitignore b/build/.gitignore index 8c88efc..bf0629d 100644 --- a/build/.gitignore +++ b/build/.gitignore @@ -2,7 +2,4 @@ CMakeFiles cmake_install.cmake CMakeCache.txt compile_commands.json -Makefile -linux/septadrop -linux/septadrop_1.0_amd64/usr/bin/septadrop -linux/septadrop_1.0_amd64.deb \ No newline at end of file +Makefile \ No newline at end of file diff --git a/build/linux/.gitignore b/build/linux/.gitignore new file mode 100644 index 0000000..00ca04a --- /dev/null +++ b/build/linux/.gitignore @@ -0,0 +1,3 @@ +septadrop +septadrop_1.0_amd64/usr/bin/septadrop +septadrop_1.0_amd64.deb \ No newline at end of file diff --git a/build/windows/.gitignore b/build/windows/.gitignore new file mode 100644 index 0000000..9637d08 --- /dev/null +++ b/build/windows/.gitignore @@ -0,0 +1,2 @@ +SFML-2.5.1 +septadrop.exe \ No newline at end of file diff --git a/build/windows/build.sh b/build/windows/build.sh new file mode 100755 index 0000000..3274433 --- /dev/null +++ b/build/windows/build.sh @@ -0,0 +1,11 @@ +if [[ ! -e SFML-2.5.1 ]]; then + DOWNLOAD=TARGET=SFML-2.5.1-windows-gcc-7.3.0-mingw-64-bit + wget https://www.sfml-dev.org/files/${DOWNLOAD}.zip + unzip ${DOWNLOAD}.zip + rm ${DOWNLOAD}.zip +fi +cmake SFML-2.5.1/ -DCMAKE_TOOLCHAIN_FILE=mingw-w64-x86_64.cmake ../.. +cd .. +python3 packer.py +cd windows +cmake --build . diff --git a/build/windows/mingw-w64-x86_64.cmake b/build/windows/mingw-w64-x86_64.cmake new file mode 100644 index 0000000..b4ee2e9 --- /dev/null +++ b/build/windows/mingw-w64-x86_64.cmake @@ -0,0 +1,35 @@ +# Sample toolchain file for building for Windows from an Ubuntu Linux system. +# +# Typical usage: +# *) install cross compiler: `sudo apt-get install mingw-w64` +# *) cd build +# *) cmake -DCMAKE_TOOLCHAIN_FILE=~/mingw-w64-x86_64.cmake .. + +set(CMAKE_SYSTEM_NAME Windows) +set(TOOLCHAIN_PREFIX x86_64-w64-mingw32) + +# cross compilers to use for C, C++ and Fortran +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++) +set(CMAKE_Fortran_COMPILER ${TOOLCHAIN_PREFIX}-gfortran) +set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) + +# target environment on the build host system +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) + +# modify default behavior of FIND_XXX() commands +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# currently disfunctional, need to set up static linking(?) and not use DLLs +# also set SFML_PATH relative to project directory +set(SFML_PATH "/home/elnu/Projects/septadrop/build/windows/SFML-2.5.1") +set(SFML_INCLUDE_DIR "${SFML_PATH}/include") +include_directories(${SFML_PATH}/include) +set(SFML_LIBRARY_DIR "${SFML_PATH}/lib") +link_directories(${SFML_PATH}/lib) +set(SFML_DIR "${SFML_PATH}/lib/cmake/SFML") + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED 20) diff --git a/include/BlockType.hpp b/include/BlockType.hpp index 2bc78b1..31495d3 100644 --- a/include/BlockType.hpp +++ b/include/BlockType.hpp @@ -1,13 +1,13 @@ #pragma once -#include +#include "TileType.hpp" #include class BlockType { public: TileType* tile_type; std::vector> grid; - uint width, height, starting_line; + unsigned int width, height, starting_line; bool rotate; BlockType(TileType* _tile_type, const std::vector> _grid, bool _rotate = true); diff --git a/include/NumberRenderer.hpp b/include/NumberRenderer.hpp index 7ea4953..68118ca 100644 --- a/include/NumberRenderer.hpp +++ b/include/NumberRenderer.hpp @@ -12,7 +12,7 @@ class NumberRenderer { sf::IntRect _comma_rect, std::initializer_list _numeral_rects ); - void render(sf::RenderWindow* window, uint number, int x, int y); + void render(sf::RenderWindow* window, unsigned int number, int x, int y); private: sf::Sprite sprite; }; \ No newline at end of file diff --git a/include/TileType.hpp b/include/TileType.hpp index e339487..71f7f88 100644 --- a/include/TileType.hpp +++ b/include/TileType.hpp @@ -2,7 +2,7 @@ #include -#include +#include "Config.hpp" class TileType { public: diff --git a/src/BlockType.cpp b/src/BlockType.cpp index b5ea17a..73ef429 100644 --- a/src/BlockType.cpp +++ b/src/BlockType.cpp @@ -7,9 +7,9 @@ BlockType::BlockType(TileType* _tile_type, const std::vector> // Used for alignment in "next block" area width = 0; starting_line = 0; - for (uint y = 0; y < grid.size(); y++) { + for (unsigned int y = 0; y < grid.size(); y++) { bool has_content = false; - for (uint x = 0; x < grid[y].size(); x++) { + for (unsigned int x = 0; x < grid[y].size(); x++) { if (grid[y][x]) { width = std::max({width, x + 1}); has_content = true; diff --git a/src/Main.cpp b/src/Main.cpp index d7e08d0..5d3721a 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -15,7 +15,9 @@ #include #include #include -#include +#if __linux__ + #include +#endif #include #include @@ -26,11 +28,11 @@ #include #include -uint get_level(int lines) { +unsigned int get_level(int lines) { return std::min(lines / LINES_PER_LEVEL, 15); } -uint get_update_interval(int level) { +unsigned int get_update_interval(int level) { // From Tetris Worlds, see https://harddrop.com/wiki/Tetris_Worlds#Gravity return pow(0.8 - (level - 1) * 0.007, level - 1) * 1000; } @@ -95,7 +97,7 @@ int main() bool paused = false; bool paused_from_lost_focus = false; sf::Clock update_clock, move_clock, pause_clock; - uint pause_offset = 0; + unsigned int pause_offset = 0; sf::RectangleShape paused_clear; paused_clear.setFillColor(sf::Color(81, 62, 69)); @@ -111,14 +113,17 @@ int main() PLAYFIELD_Y + ((float)GRID_HEIGHT * TILE_SIZE / 2) - (float)paused_texture_size.y / 2 ); - // https://stackoverflow.com/a/478088 - const char *homedir; - if ((homedir = getenv("HOME")) == NULL) { - homedir = getpwuid(getuid())->pw_dir; - } - - std::string highscore_file_path = homedir; - highscore_file_path += "/.septadrop"; + #if __linux__ + // https://stackoverflow.com/a/478088 + const char *homedir; + if ((homedir = getenv("HOME")) == NULL) { + homedir = getpwuid(getuid())->pw_dir; + } + std::string highscore_file_path = homedir; + highscore_file_path += "/.septadrop"; + #else + std::string highscore_file_path = ".septadrop"; + #endif if (!std::filesystem::exists(highscore_file_path)) { std::ofstream highscore_file(highscore_file_path); @@ -128,19 +133,19 @@ int main() std::fstream highscore_file(highscore_file_path); std::string highscore_string; highscore_file >> highscore_string; - uint highscore = std::stoi(highscore_string); - uint point_gcd = gcd(POINTS_1_LINE, gcd(POINTS_2_LINES, gcd(POINTS_3_LINES, POINTS_4_LINES))); + unsigned int highscore = std::stoi(highscore_string); + unsigned int point_gcd = gcd(POINTS_1_LINE, gcd(POINTS_2_LINES, gcd(POINTS_3_LINES, POINTS_4_LINES))); if (highscore % point_gcd != 0) { std::cout << "It seems your system is misconfigured. Please see this guide for fixing the issue: https://www.youtube.com/watch?v=dQw4w9WgXcQ" << std::endl; return 0; } - uint score = 0; - uint lines = 0; - uint blocks = 0; - uint tiles = 0; + unsigned int score = 0; + unsigned int lines = 0; + unsigned int blocks = 0; + unsigned int tiles = 0; - uint update_interval = get_update_interval(0); + unsigned int update_interval = get_update_interval(0); // https://sfxr.me/#57uBnWWZeyDTsBRrJsAp2Vwd76cMVrdeRQ7DirNQW5XekKxcrCUNx47Zggh7Uqw4R5FdeUpyk362uhjWmpNHmqxE7JBp3EkxDxfJ1VjzMRpuSHieW6B5iyVFM sf::SoundBuffer rotate_buffer; @@ -268,7 +273,7 @@ int main() continue; } - bool is_update_frame = update_clock.getElapsedTime().asMilliseconds() - pause_offset > (sf::Keyboard::isKeyPressed(sf::Keyboard::Down) ? std::min({update_interval, (uint)MAX_FAST_FORWARD_INTERVAL}) : update_interval); + bool is_update_frame = update_clock.getElapsedTime().asMilliseconds() - pause_offset > (sf::Keyboard::isKeyPressed(sf::Keyboard::Down) ? std::min({update_interval, (unsigned int)MAX_FAST_FORWARD_INTERVAL}) : update_interval); if (is_update_frame) { update_clock.restart(); } @@ -365,8 +370,8 @@ int main() auto next_block_tiles = next_block.get_tiles(); // This is assuming the next block spawns unrotated. // Refactoring is needed if random rotations are added - uint x_offset = next_block.type->width * TILE_SIZE / 2; - uint y_offset = (next_block.type->height + next_block.type->starting_line * 2) * TILE_SIZE / 2; + unsigned int x_offset = next_block.type->width * TILE_SIZE / 2; + unsigned int y_offset = (next_block.type->height + next_block.type->starting_line * 2) * TILE_SIZE / 2; for (auto tile : next_block_tiles) { sprite.setTextureRect(next_block.type->tile_type->texture_rect); sprite.setPosition( @@ -395,7 +400,7 @@ int main() for (auto tile : block.get_tiles()) { grid[tile.y][tile.x] = block.type->tile_type; } - uint cleared_lines = 0; + unsigned int cleared_lines = 0; // Check for completed rows for (int y = 0; y < GRID_HEIGHT; y++) { bool completed = true; @@ -415,7 +420,7 @@ int main() } cleared_lines++; } - uint scored; + unsigned int scored; switch (cleared_lines) { case 0: scored = 0; diff --git a/src/NumberRenderer.cpp b/src/NumberRenderer.cpp index cdcc768..55b1c3e 100644 --- a/src/NumberRenderer.cpp +++ b/src/NumberRenderer.cpp @@ -18,13 +18,13 @@ NumberRenderer::NumberRenderer( } } -void NumberRenderer::render(sf::RenderWindow* window, uint number, int x, int y) { +void NumberRenderer::render(sf::RenderWindow* window, unsigned int number, int x, int y) { auto number_string = std::to_string(number); std::string numeral_string; numeral_string.push_back(number_string.back()); auto numeral_rect = numeral_rects[std::stoi(numeral_string)]; int x_offset = -numeral_rect.width; - uint digits = number_string.length(); + unsigned int digits = number_string.length(); for (int i = digits - 1; i >= 0; i--) { char numeral_string[] = {number_string[i]}; auto numeral_rect = numeral_rects[std::stoi(numeral_string)];