#pragma once #include #include #include #include #include #include using pos = std::pair; enum class DIRECTION { UP, DOWN, RIGHT, LEFT, NONE }; ////////////////////////////////// class Board { public: explicit Board(); ~Board(); bool init(const std::string& path, int splitting, const sf::RenderWindow& window); void draw(sf::RenderWindow& window); bool isWinCondition() const; void setCursorVisibility(bool visible); bool tryProcessDirection(const DIRECTION& direction); bool moveSelection(const DIRECTION& direction); bool swapOnSelection(const DIRECTION& direction); // Go to or leave from selection mode void onSelectionMode(); private: struct Cell { std::vector::size_type inital_index; std::vector::size_type current_index; sf::Sprite *sprite; static int side_length; }; using Cells = std::vector; sf::RectangleShape rect_filling; sf::VertexArray rect_selection; Cells::size_type selection_index; Cells::size_type cells_on_width; // amount of cells on horizontal side of board Cells::size_type cells_on_height; // amount of cells on vertical side of board Cells vec_field; Cells::size_type solved_tiles; // amount of tiles placed on initial positions sf::Texture global_texture; bool on_selection; bool is_cursor_visible; void swapCells(Cells::size_type curr_index, Cells::size_type swap_index); // Draw selection cursor on given tile void setSelectionVertex(Cells::size_type index); void calculateBoardProperties(int splitting); void splitImageIntoTiles(int tile_length); void scaleImageToWindow(const sf::RenderWindow &window); float calculateScalingToWindow(const sf::RenderWindow &window) const; void scaleTiles(float scaling); std::pair calculateTileShiftVector(Cells::size_type tile_index, int shift) const; void shuffleTiles(); };