← index
Mutatris/source/android/puzzle.hpp
Source: Mutatris/source/android/puzzle.hpp
#ifndef _PUZZLE_H__

#define _PUZZLE_H__


#include"game_object.hpp"

#include"SDL.h"

#include"SDL_ttf.h"

#include"quadtris.hpp"

#include<vector>

#include<unordered_map>


namespace obj {

    enum SwipeDirection {
        SWIPE_UP,
        SWIPE_DOWN,
        SWIPE_LEFT,
        SWIPE_RIGHT,
        SWIPE_NONE
    };

    class PuzzleObject : public GameObject {
    public:
        PuzzleObject(int diff);
        virtual ~PuzzleObject();
        virtual void draw(SDL_Renderer *renderer) override;
        virtual void event(SDL_Renderer *renderer, SDL_Event &e) override;
        virtual void load(SDL_Renderer *renderer) override;
        void drawGrid(SDL_Renderer *renderer, SDL_Texture *tex, int focus);
    protected:
        puzzle::PuzzleGame game;
        std::vector<SDL_Texture *> blocks;
        std::vector<SDL_Texture *> backgrounds;
        SDL_Texture *pause_menu = nullptr;
        bool paused = false;
        int cur_level = 0;
        int cur_focus = 0;
        SDL_Point swipeStartPos = {0, 0};
        Uint32 swipeStartTime = 0;
        const int SWIPE_DISTANCE_THRESHOLD = 50; 
        const Uint32 SWIPE_TIME_THRESHOLD = 500; 
        bool isTapPending = false;
        Uint32 lastTapTime = 0;       
        SDL_Point lastTapPos = {0, 0}; 
        const Uint32 DOUBLE_TAP_THRESHOLD = 200; 
        const int DOUBLE_TAP_DISTANCE = 50;    
        SDL_Texture *game_textures[4] = {nullptr};
        TTF_Font *font = nullptr;
        TTF_Font *paused_small, *paused_large;
        void twistColors();
        void procHat(int cur_focus, int value);
        void procStick(int cur_focus, int axis_x, int axis_y);
        void procDPad(int cur_focus, int button);
        void moveBlockToPosition(SDL_Point position);
        void detectSwipe(SDL_Point startPos, SDL_Point endPos, Uint32 startTime, Uint32 endTime);
        bool isDropSwipe(SwipeDirection swipeDir);
        bool isSwitchSwipe(SwipeDirection swipeDir);
        void handleDoubleTap(SDL_Point p);
        void handleSingleTap(SDL_Point tapPos);
        void handleControllerButtonRepeat(SDL_GameController *controller, int cur_focus, Uint32 current_time);
        const Uint32 REPEAT_DELAY = 300;   
        const Uint32 REPEAT_INTERVAL = 150; 
        struct ButtonState {
            bool is_pressed;
            Uint32 last_repeat_time;
        };
        std::unordered_map<SDL_GameControllerButton, ButtonState> button_states;
    };

}

#endif