diff --git a/src/PuzzleSingleImageState.cpp b/src/PuzzleSingleImageState.cpp index 66d1227..378038f 100644 --- a/src/PuzzleSingleImageState.cpp +++ b/src/PuzzleSingleImageState.cpp @@ -65,7 +65,14 @@ void PuzzleSingleImageState::Draw(SDL_Renderer* target) { source.y = double(source.y)*scale; source.w = double(source.w)*scale; source.h = double(source.h)*scale; - SDL_RenderCopy(target, this->pictureTex, &source, &destination); + int flip = static_cast(SDL_FLIP_NONE); + if (rotated_pieces[i] == 1 || rotated_pieces[i] == 3) { + flip |= SDL_FLIP_HORIZONTAL; + } + if (rotated_pieces[i] == 2 || rotated_pieces[i] == 3) { + flip |= SDL_FLIP_VERTICAL; + } + SDL_RenderCopyEx(target, this->pictureTex, &source, &destination, 0, nullptr, static_cast(flip) ); } for (size_t i = 0; i < pieces.size(); ++i) { const SDL_Rect& piece = pieces[i]; @@ -101,15 +108,20 @@ void PuzzleSingleImageState::Update() { 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 if (i == marked_piece) { - marked_piece = -1; + if (flipMode) { + rotated_pieces[i] = (rotated_pieces[i]+1)%4; } else { - marked_piece = i; + if (i != marked_piece && marked_piece > -1 && marked_piece < pieces.size()) { + std::swap(shuffeled_pieces[i], shuffeled_pieces[marked_piece]); + marked_piece = -1; + } + else if (i == marked_piece) { + marked_piece = -1; + } + else { + marked_piece = i; + } } } } @@ -208,13 +220,21 @@ void PuzzleSingleImageState::ClearPicture() { void PuzzleSingleImageState::Shuffle() { size_t number_of_peices = pieces.size(); shuffeled_pieces.resize(number_of_peices); + rotated_pieces.resize(number_of_peices); for (size_t i = 0; i< shuffeled_pieces.size(); ++i) { shuffeled_pieces.at(i) = i; } - for (int i = 0 ; i < 100; ++i) { - size_t first = rand()%number_of_peices; - size_t second = rand()%number_of_peices; - std::swap(shuffeled_pieces[first], shuffeled_pieces[second]); + if (flipMode) { + for (size_t i = 0; i< shuffeled_pieces.size(); ++i) { + rotated_pieces.at(i) = rand()%4; + } + } + else { + for (int i = 0 ; i < 100; ++i) { + size_t first = rand()%number_of_peices; + size_t second = rand()%number_of_peices; + std::swap(shuffeled_pieces[first], shuffeled_pieces[second]); + } } shuffeled = true; } @@ -222,6 +242,9 @@ void PuzzleSingleImageState::Shuffle() { void PuzzleSingleImageState::CheckSolved() { for (size_t i=0; i < shuffeled_pieces.size(); ++i) { + if (rotated_pieces[i] != 0) { + return; + } if (shuffeled_pieces[i] != i) { return; } diff --git a/src/PuzzleSingleImageState.hpp b/src/PuzzleSingleImageState.hpp index ec44361..afc5521 100644 --- a/src/PuzzleSingleImageState.hpp +++ b/src/PuzzleSingleImageState.hpp @@ -45,6 +45,8 @@ public: void SplitPieceHorisontal(size_t piece_number); void Shuffle(); void CheckSolved(); + + bool flipMode = false; private: void ClearPicture(); @@ -60,5 +62,6 @@ private: int min_piece_size = 120; bool shuffeled = false; std::vector shuffeled_pieces; + std::vector rotated_pieces; int marked_piece = -1; };