diff --git a/src/PuzzleSingleImageState.cpp b/src/PuzzleSingleImageState.cpp index 1730478..667d05c 100644 --- a/src/PuzzleSingleImageState.cpp +++ b/src/PuzzleSingleImageState.cpp @@ -25,6 +25,7 @@ https://github.com/sago007/saland #include "SDL_image.h" #include #include "globals.hpp" +#include PuzzleSingleImageState::PuzzleSingleImageState() { @@ -50,6 +51,10 @@ void PuzzleSingleImageState::Draw(SDL_Renderer* target) { rect.h = resized_image_height; rect.w = resized_image_width; SDL_RenderCopy(target, this->pictureTex, NULL, &rect); + for (const SDL_Rect& piece : pieces) { + rectangleRGBA(target, rect.x+piece.x, rect.y+piece.y, + rect.x+piece.x + piece.w, rect.y+piece.y + piece.h, 255, 255, 0, 255); + } } @@ -71,6 +76,64 @@ void PuzzleSingleImageState::LoadPictureFromFile(const std::string& filename, SD this->pictureTex = SDL_CreateTextureFromSurface(renderer, bitmapSurface); std::cerr << resized_image_width << ", " << resized_image_height << "\n"; SDL_FreeSurface(bitmapSurface); + pieces.clear(); + SDL_Rect piece; + piece.x = 0; + piece.y = 0; + piece.h = resized_image_height; + piece.w = resized_image_width; + pieces.push_back(piece); + for (int i = 0; i<10; ++i) { + SplitPiece(); + } +} + +void PuzzleSingleImageState::SplitPiece(size_t piece_number) { + if (rand()%2==1) { + SplitPieceVertical(piece_number); + SplitPieceHorisontal(piece_number); + return; + } + SplitPieceHorisontal(piece_number); + SplitPieceVertical(piece_number); +} + +void PuzzleSingleImageState::SplitPieceVertical(size_t piece_number) { + SDL_Rect piece1 = pieces.at(piece_number); + if (piece1.w > 2*min_piece_size) { + int new_piece_width = min_piece_size + (rand()%(piece1.w-2*min_piece_size)); + SDL_Rect piece2 = piece1; + piece2.w = new_piece_width; + piece1.w -= new_piece_width; + piece2.x = piece2.x + piece1.w; + pieces.at(piece_number) = piece1; + pieces.push_back(piece2); + return; + } +} + +void PuzzleSingleImageState::SplitPieceHorisontal(size_t piece_number) { + SDL_Rect piece1 = pieces.at(piece_number); + if (piece1.h > 2*min_piece_size) { + int new_piece_height = min_piece_size + (rand()%(piece1.h-2*min_piece_size)); + SDL_Rect piece2 = piece1; + piece2.h = new_piece_height; + piece1.h -= new_piece_height; + piece2.y = piece2.y + piece1.h; + pieces.at(piece_number) = piece1; + pieces.push_back(piece2); + } +} + + +void PuzzleSingleImageState::SplitPiece() { + size_t number_of_pieces = pieces.size(); + for (size_t i= 0; i < number_of_pieces; ++i ) { + const SDL_Rect& piece = pieces.at(i); + if (piece.w > 2*min_piece_size || piece.h > 2*min_piece_size) { + SplitPiece(i); + } + } } void PuzzleSingleImageState::ClearPicture() { diff --git a/src/PuzzleSingleImageState.hpp b/src/PuzzleSingleImageState.hpp index 458c103..ab0c327 100644 --- a/src/PuzzleSingleImageState.hpp +++ b/src/PuzzleSingleImageState.hpp @@ -24,6 +24,7 @@ https://github.com/sago007/saland #include "sago/GameStateInterface.hpp" #include "SDL.h" #include +#include class PuzzleSingleImageState : public sago::GameStateInterface { public: @@ -37,6 +38,11 @@ public: void Update() override; void LoadPictureFromFile(const std::string& filename, SDL_Renderer* renderer); + + void SplitPiece(); + void SplitPiece(size_t piece_number); + void SplitPieceVertical(size_t piece_number); + void SplitPieceHorisontal(size_t piece_number); private: void ClearPicture(); @@ -46,4 +52,6 @@ private: int source_image_width = 1; const int resized_image_height = 700; int resized_image_width = 1; -}; \ No newline at end of file + std::vector pieces; + int min_piece_size = 140; +};