git repos / sago_multi_scrambler_puzzle2

commit c9d63b04

Poul Sander · 2022-04-23 21:26
c9d63b0454314f06e0493dd969968d5649ba9958 patch · browse files
parent 6a50d2ecd0b1b10fd8f93333b44b2b7a187e16a5

Can now shuffle and solve puzzles

Changed files

M src/PuzzleSingleImageState.cpp before
M src/PuzzleSingleImageState.hpp before
M src/globals.hpp before
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<size_t> 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;
};