diff --git a/src/PuzzleSingleImageState.cpp b/src/PuzzleSingleImageState.cpp index 8040ed3..389c805 100644 --- a/src/PuzzleSingleImageState.cpp +++ b/src/PuzzleSingleImageState.cpp @@ -67,15 +67,51 @@ void PuzzleSingleImageState::Draw(SDL_Renderer* target) { source.h = double(source.h)*scale; SDL_RenderCopy(target, this->pictureTex, &source, &destination); } - for (const SDL_Rect& piece : pieces) { + for (size_t i = 0; i < pieces.size(); ++i) { + const SDL_Rect& piece = pieces[i]; + if (i == marked_piece) { + continue; + } 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); } + if (marked_piece > -1 && marked_piece < pieces.size()) { + const SDL_Rect& piece = pieces.at(marked_piece); + rectangleRGBA(target, rect.x+piece.x, rect.y+piece.y, + rect.x+piece.x + piece.w, rect.y+piece.y + piece.h, 255, 0, 0, 255); + } } void PuzzleSingleImageState::Update() { + // If the mouse button is released, make bMouseUp equal true + if ( !(SDL_GetMouseState(nullptr, nullptr)&SDL_BUTTON(1)) ) { + globalData.mouseUp=true; + } + if (SDL_GetMouseState(nullptr,nullptr)&SDL_BUTTON(1) && globalData.mouseUp) { + globalData.mouseUp = false; + + SDL_Rect rect; + rect.x = globalData.xsize/2-resized_image_width/2; + rect.y = globalData.ysize/2-resized_image_height/2;; + rect.h = resized_image_height; + rect.w = resized_image_width; + for (size_t i = 0; i< pieces.size(); ++i) { + const SDL_Rect& piece = pieces[i]; + bool clicked = (globalData.mousex > rect.x+piece.x && globalData.mousex < rect.x+piece.x + piece.w && globalData.mousey > rect.y+piece.y && globalData.mousey < rect.y+piece.y + piece.h); + if (clicked) { + if (i != marked_piece && marked_piece > -1 && marked_piece < pieces.size()) { + std::swap(shuffeled_pieces[i], shuffeled_pieces[marked_piece]); + marked_piece = -1; + } + else { + marked_piece = i; + } + } + } + CheckSolved(); + } } void PuzzleSingleImageState::LoadPictureFromFile(const std::string& filename, SDL_Renderer* renderer) { @@ -173,4 +209,14 @@ void PuzzleSingleImageState::Shuffle() { std::swap(shuffeled_pieces[first], shuffeled_pieces[second]); } shuffeled = true; +} + + +void PuzzleSingleImageState::CheckSolved() { + for (size_t i=0; i < shuffeled_pieces.size(); ++i) { + if (shuffeled_pieces[i] != i) { + return; + } + } + shuffeled = false; } \ No newline at end of file diff --git a/src/PuzzleSingleImageState.hpp b/src/PuzzleSingleImageState.hpp index 3d64009..e849653 100644 --- a/src/PuzzleSingleImageState.hpp +++ b/src/PuzzleSingleImageState.hpp @@ -44,6 +44,7 @@ public: void SplitPieceVertical(size_t piece_number); void SplitPieceHorisontal(size_t piece_number); void Shuffle(); + void CheckSolved(); private: void ClearPicture(); @@ -57,4 +58,5 @@ private: int min_piece_size = 140; bool shuffeled = false; std::vector shuffeled_pieces; + int marked_piece = -1; }; diff --git a/src/globals.hpp b/src/globals.hpp index 9e926a5..fa6c6e7 100644 --- a/src/globals.hpp +++ b/src/globals.hpp @@ -41,6 +41,7 @@ struct GlobalData { int verboseLevel = 0; int mousex = 0; int mousey = 0; + bool mouseUp = false; int xsize = 1366; int ysize = 768; };