commit 6a50d2ec
Now shuffle the pieces.
Changed files
| M | src/MainGameState.cpp before |
| M | src/PuzzleSingleImageState.cpp before |
| M | src/PuzzleSingleImageState.hpp before |
diff --git a/src/MainGameState.cpp b/src/MainGameState.cpp
index 2c13470..e226714 100644
--- a/src/MainGameState.cpp
+++ b/src/MainGameState.cpp
@@ -31,7 +31,7 @@ MainGameState::~MainGameState() {
}
bool MainGameState::IsActive() {
- return true;
+ return true;
}
void MainGameState::ProcessInput(const SDL_Event& event, bool &processed) {
diff --git a/src/PuzzleSingleImageState.cpp b/src/PuzzleSingleImageState.cpp
index 3bd779b..8040ed3 100644
--- a/src/PuzzleSingleImageState.cpp
+++ b/src/PuzzleSingleImageState.cpp
@@ -37,7 +37,7 @@ PuzzleSingleImageState::~PuzzleSingleImageState() {
}
bool PuzzleSingleImageState::IsActive() {
- return true;
+ return true;
}
void PuzzleSingleImageState::ProcessInput(const SDL_Event& event, bool &processed) {
@@ -51,7 +51,22 @@ void PuzzleSingleImageState::Draw(SDL_Renderer* target) {
rect.y = globalData.ysize/2-resized_image_height/2;;
rect.h = resized_image_height;
rect.w = resized_image_width;
- SDL_RenderCopy(target, this->pictureTex, NULL, &rect);
+ if (!shuffeled) {
+ SDL_RenderCopy(target, this->pictureTex, NULL, &rect);
+ return;
+ }
+ for (size_t i = 0; i < pieces.size(); ++i) {
+ SDL_Rect destination = pieces[i];
+ destination.x += rect.x;
+ destination.y += rect.y;
+ SDL_Rect source = pieces.at(shuffeled_pieces[i]);
+ double scale = double(source_image_height)/double(resized_image_height);
+ source.x = double(source.x)*scale;
+ 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);
+ }
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);
@@ -87,6 +102,7 @@ void PuzzleSingleImageState::LoadPictureFromFile(const std::string& filename, SD
for (int i = 0; i<10; ++i) {
SplitPiece();
}
+ Shuffle();
}
void PuzzleSingleImageState::SplitPiece(size_t piece_number) {
@@ -143,4 +159,18 @@ void PuzzleSingleImageState::ClearPicture() {
SDL_DestroyTexture(this->pictureTex);
this->pictureTex = nullptr;
}
+}
+
+void PuzzleSingleImageState::Shuffle() {
+ size_t number_of_peices = pieces.size();
+ shuffeled_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]);
+ }
+ shuffeled = true;
}
\ No newline at end of file
diff --git a/src/PuzzleSingleImageState.hpp b/src/PuzzleSingleImageState.hpp
index ab0c327..3d64009 100644
--- a/src/PuzzleSingleImageState.hpp
+++ b/src/PuzzleSingleImageState.hpp
@@ -39,10 +39,11 @@ public:
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);
+ void SplitPiece();
+ void SplitPiece(size_t piece_number);
+ void SplitPieceVertical(size_t piece_number);
+ void SplitPieceHorisontal(size_t piece_number);
+ void Shuffle();
private:
void ClearPicture();
@@ -52,6 +53,8 @@ private:
int source_image_width = 1;
const int resized_image_height = 700;
int resized_image_width = 1;
- std::vector<SDL_Rect> pieces;
- int min_piece_size = 140;
+ std::vector<SDL_Rect> pieces;
+ int min_piece_size = 140;
+ bool shuffeled = false;
+ std::vector<size_t> shuffeled_pieces;
};