git repos / sago_multi_scrambler_puzzle2

commit a68c664f

Poul Sander · 2022-04-23 18:05
a68c664f72444af95cbdb77c4deecad9a803fb99 patch · browse files
parent 95634cf86072926acbce9136c8a9729630ee60cb

Split the image

Changed files

M src/PuzzleSingleImageState.cpp before
M src/PuzzleSingleImageState.hpp before
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 <iostream>
#include "globals.hpp"
+#include <SDL2/SDL2_gfxPrimitives.h>
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 <string>
+#include <vector>
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<SDL_Rect> pieces;
+ int min_piece_size = 140;
+};