Get Windows compilation partially working

cpp
Elnu 3 years ago
parent e18094174f
commit 38bd97148a

3
build/.gitignore vendored

@ -3,6 +3,3 @@ cmake_install.cmake
CMakeCache.txt CMakeCache.txt
compile_commands.json compile_commands.json
Makefile Makefile
linux/septadrop
linux/septadrop_1.0_amd64/usr/bin/septadrop
linux/septadrop_1.0_amd64.deb

@ -0,0 +1,3 @@
septadrop
septadrop_1.0_amd64/usr/bin/septadrop
septadrop_1.0_amd64.deb

@ -0,0 +1,2 @@
SFML-2.5.1
septadrop.exe

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

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

@ -1,13 +1,13 @@
#pragma once #pragma once
#include <TileType.hpp> #include "TileType.hpp"
#include <vector> #include <vector>
class BlockType { class BlockType {
public: public:
TileType* tile_type; TileType* tile_type;
std::vector<std::vector<bool>> grid; std::vector<std::vector<bool>> grid;
uint width, height, starting_line; unsigned int width, height, starting_line;
bool rotate; bool rotate;
BlockType(TileType* _tile_type, const std::vector<std::vector<bool>> _grid, bool _rotate = true); BlockType(TileType* _tile_type, const std::vector<std::vector<bool>> _grid, bool _rotate = true);

@ -12,7 +12,7 @@ class NumberRenderer {
sf::IntRect _comma_rect, sf::IntRect _comma_rect,
std::initializer_list<sf::IntRect> _numeral_rects std::initializer_list<sf::IntRect> _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: private:
sf::Sprite sprite; sf::Sprite sprite;
}; };

@ -2,7 +2,7 @@
#include <SFML/Graphics/Rect.hpp> #include <SFML/Graphics/Rect.hpp>
#include <Config.hpp> #include "Config.hpp"
class TileType { class TileType {
public: public:

@ -7,9 +7,9 @@ BlockType::BlockType(TileType* _tile_type, const std::vector<std::vector<bool>>
// Used for alignment in "next block" area // Used for alignment in "next block" area
width = 0; width = 0;
starting_line = 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; 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]) { if (grid[y][x]) {
width = std::max({width, x + 1}); width = std::max({width, x + 1});
has_content = true; has_content = true;

@ -15,7 +15,9 @@
#include <fstream> #include <fstream>
#include <filesystem> #include <filesystem>
#include <unistd.h> #include <unistd.h>
#if __linux__
#include <pwd.h> #include <pwd.h>
#endif
#include <iostream> #include <iostream>
#include <packed/SharedResources.hpp> #include <packed/SharedResources.hpp>
@ -26,11 +28,11 @@
#include <BlockType.hpp> #include <BlockType.hpp>
#include <Block.hpp> #include <Block.hpp>
uint get_level(int lines) { unsigned int get_level(int lines) {
return std::min(lines / LINES_PER_LEVEL, 15); 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 // From Tetris Worlds, see https://harddrop.com/wiki/Tetris_Worlds#Gravity
return pow(0.8 - (level - 1) * 0.007, level - 1) * 1000; return pow(0.8 - (level - 1) * 0.007, level - 1) * 1000;
} }
@ -95,7 +97,7 @@ int main()
bool paused = false; bool paused = false;
bool paused_from_lost_focus = false; bool paused_from_lost_focus = false;
sf::Clock update_clock, move_clock, pause_clock; sf::Clock update_clock, move_clock, pause_clock;
uint pause_offset = 0; unsigned int pause_offset = 0;
sf::RectangleShape paused_clear; sf::RectangleShape paused_clear;
paused_clear.setFillColor(sf::Color(81, 62, 69)); 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 PLAYFIELD_Y + ((float)GRID_HEIGHT * TILE_SIZE / 2) - (float)paused_texture_size.y / 2
); );
#if __linux__
// https://stackoverflow.com/a/478088 // https://stackoverflow.com/a/478088
const char *homedir; const char *homedir;
if ((homedir = getenv("HOME")) == NULL) { if ((homedir = getenv("HOME")) == NULL) {
homedir = getpwuid(getuid())->pw_dir; homedir = getpwuid(getuid())->pw_dir;
} }
std::string highscore_file_path = homedir; std::string highscore_file_path = homedir;
highscore_file_path += "/.septadrop"; highscore_file_path += "/.septadrop";
#else
std::string highscore_file_path = ".septadrop";
#endif
if (!std::filesystem::exists(highscore_file_path)) { if (!std::filesystem::exists(highscore_file_path)) {
std::ofstream highscore_file(highscore_file_path); std::ofstream highscore_file(highscore_file_path);
@ -128,19 +133,19 @@ int main()
std::fstream highscore_file(highscore_file_path); std::fstream highscore_file(highscore_file_path);
std::string highscore_string; std::string highscore_string;
highscore_file >> highscore_string; highscore_file >> highscore_string;
uint highscore = std::stoi(highscore_string); unsigned int 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 point_gcd = gcd(POINTS_1_LINE, gcd(POINTS_2_LINES, gcd(POINTS_3_LINES, POINTS_4_LINES)));
if (highscore % point_gcd != 0) { 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; 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; return 0;
} }
uint score = 0; unsigned int score = 0;
uint lines = 0; unsigned int lines = 0;
uint blocks = 0; unsigned int blocks = 0;
uint tiles = 0; unsigned int tiles = 0;
uint update_interval = get_update_interval(0); unsigned int update_interval = get_update_interval(0);
// https://sfxr.me/#57uBnWWZeyDTsBRrJsAp2Vwd76cMVrdeRQ7DirNQW5XekKxcrCUNx47Zggh7Uqw4R5FdeUpyk362uhjWmpNHmqxE7JBp3EkxDxfJ1VjzMRpuSHieW6B5iyVFM // https://sfxr.me/#57uBnWWZeyDTsBRrJsAp2Vwd76cMVrdeRQ7DirNQW5XekKxcrCUNx47Zggh7Uqw4R5FdeUpyk362uhjWmpNHmqxE7JBp3EkxDxfJ1VjzMRpuSHieW6B5iyVFM
sf::SoundBuffer rotate_buffer; sf::SoundBuffer rotate_buffer;
@ -268,7 +273,7 @@ int main()
continue; 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) { if (is_update_frame) {
update_clock.restart(); update_clock.restart();
} }
@ -365,8 +370,8 @@ int main()
auto next_block_tiles = next_block.get_tiles(); auto next_block_tiles = next_block.get_tiles();
// This is assuming the next block spawns unrotated. // This is assuming the next block spawns unrotated.
// Refactoring is needed if random rotations are added // Refactoring is needed if random rotations are added
uint x_offset = next_block.type->width * TILE_SIZE / 2; unsigned int 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 y_offset = (next_block.type->height + next_block.type->starting_line * 2) * TILE_SIZE / 2;
for (auto tile : next_block_tiles) { for (auto tile : next_block_tiles) {
sprite.setTextureRect(next_block.type->tile_type->texture_rect); sprite.setTextureRect(next_block.type->tile_type->texture_rect);
sprite.setPosition( sprite.setPosition(
@ -395,7 +400,7 @@ int main()
for (auto tile : block.get_tiles()) { for (auto tile : block.get_tiles()) {
grid[tile.y][tile.x] = block.type->tile_type; grid[tile.y][tile.x] = block.type->tile_type;
} }
uint cleared_lines = 0; unsigned int cleared_lines = 0;
// Check for completed rows // Check for completed rows
for (int y = 0; y < GRID_HEIGHT; y++) { for (int y = 0; y < GRID_HEIGHT; y++) {
bool completed = true; bool completed = true;
@ -415,7 +420,7 @@ int main()
} }
cleared_lines++; cleared_lines++;
} }
uint scored; unsigned int scored;
switch (cleared_lines) { switch (cleared_lines) {
case 0: case 0:
scored = 0; scored = 0;

@ -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); auto number_string = std::to_string(number);
std::string numeral_string; std::string numeral_string;
numeral_string.push_back(number_string.back()); numeral_string.push_back(number_string.back());
auto numeral_rect = numeral_rects[std::stoi(numeral_string)]; auto numeral_rect = numeral_rects[std::stoi(numeral_string)];
int x_offset = -numeral_rect.width; 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--) { for (int i = digits - 1; i >= 0; i--) {
char numeral_string[] = {number_string[i]}; char numeral_string[] = {number_string[i]};
auto numeral_rect = numeral_rects[std::stoi(numeral_string)]; auto numeral_rect = numeral_rects[std::stoi(numeral_string)];

Loading…
Cancel
Save