mirror of
				https://github.com/haya3218/SDfmL.git
				synced 2024-08-14 23:57:09 +00:00 
			
		
		
		
	transitions
currently buggy tho
This commit is contained in:
		
							parent
							
								
									5d0e099482
								
							
						
					
					
						commit
						a1aacff687
					
				
					 5 changed files with 116 additions and 37 deletions
				
			
		| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
# Make sur cmake is 3.8
 | 
			
		||||
cmake_minimum_required(VERSION 3.8)
 | 
			
		||||
# Make sur cmake is 3.10
 | 
			
		||||
cmake_minimum_required(VERSION 3.10)
 | 
			
		||||
 | 
			
		||||
# proj name
 | 
			
		||||
project(Skateboard)
 | 
			
		||||
| 
						 | 
				
			
			@ -14,16 +14,16 @@ set(OUT5_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/src/SDL_gpu/")
 | 
			
		|||
 | 
			
		||||
option(PREFER_MODPLUG "Use libmodplug api instead of libopenmpt for module playback" ON)
 | 
			
		||||
 | 
			
		||||
if (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
 | 
			
		||||
	set(MAIN_LIBRARIES_E "${CMAKE_CURRENT_LIST_DIR}/lib/x64")
 | 
			
		||||
else ()
 | 
			
		||||
	set(MAIN_LIBRARIES_E "${CMAKE_CURRENT_LIST_DIR}/lib/x86")
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
# Support both 32 and 64 bit builds
 | 
			
		||||
# Someone make a pull request to support MingW
 | 
			
		||||
# Way to lazy to do that right now
 | 
			
		||||
if (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
 | 
			
		||||
  set(MAIN_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2_gpu.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/libmodplug.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/soloud_static.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2_ttf.lib")
 | 
			
		||||
  set(MAIN_LIBRARIES_E "${CMAKE_CURRENT_LIST_DIR}/lib/x64/")
 | 
			
		||||
else ()
 | 
			
		||||
  set(MAIN_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2_gpu.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/libmodplug.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/soloud_static.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2_ttf.lib")
 | 
			
		||||
  set(MAIN_LIBRARIES_E "${CMAKE_CURRENT_LIST_DIR}/lib/x86/")
 | 
			
		||||
endif ()
 | 
			
		||||
set(MAIN_LIBRARIES "${MAIN_LIBRARIES_E}/SDL2_gpu.lib;${MAIN_LIBRARIES_E}/libmodplug.lib;${MAIN_LIBRARIES_E}/soloud_static.lib;${MAIN_LIBRARIES_E}/SDL2.lib;${MAIN_LIBRARIES_E}/SDL2_ttf.lib")
 | 
			
		||||
 | 
			
		||||
# strip it all
 | 
			
		||||
string(STRIP "${MAIN_LIBRARIES}" MAIN_LIBRARIES)
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +80,7 @@ set_target_properties(Skateboard PROPERTIES
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
# copy dll files
 | 
			
		||||
file(COPY ${MAIN_LIBRARIES_E} DESTINATION ${BUILD_DIRECTORY})
 | 
			
		||||
file(COPY "${MAIN_LIBRARIES_E}/" DESTINATION ${BUILD_DIRECTORY})
 | 
			
		||||
 | 
			
		||||
# remove lib files
 | 
			
		||||
file(REMOVE_RECURSE "${BUILD_DIRECTORY}/*.lib")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,7 @@ To use it (in windows atleast),
 | 
			
		|||
 | 
			
		||||
- Get SDL2 and SDL_ttf 2.0, and put em on the respective x86 and x64 folders.
 | 
			
		||||
You know how to place them. It's fucking common sense.
 | 
			
		||||
- Get SDL_gpu as well.
 | 
			
		||||
- [SoLoud fork.](https://github.com/haya3218/soloud) Follow GENie instructions and build as a static library.
 | 
			
		||||
- You also need to build libmodplug with it as well.
 | 
			
		||||
- If you are gonna be using the OpenMPT module, you'll need the libopenmpt dll in your exe directory as well.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 339 B After Width: | Height: | Size: 12 KiB  | 
| 
						 | 
				
			
			@ -39,6 +39,7 @@ class ExampleState : public sdfml::sdState {
 | 
			
		|||
            add(&bg1);
 | 
			
		||||
            bg1.updateCamera(&camera);
 | 
			
		||||
            add(&example);
 | 
			
		||||
            //bg1.screenCenter();
 | 
			
		||||
        }
 | 
			
		||||
        virtual void update(float elapsed) {
 | 
			
		||||
            if (sdfml::key_pressed(SDL_SCANCODE_LEFT))
 | 
			
		||||
| 
						 | 
				
			
			@ -49,9 +50,12 @@ class ExampleState : public sdfml::sdState {
 | 
			
		|||
                example.y -= 1;
 | 
			
		||||
            if (sdfml::key_pressed(SDL_SCANCODE_DOWN))
 | 
			
		||||
                example.y += 1;
 | 
			
		||||
            if (sdfml::key_just_pressed(SDL_SCANCODE_R))
 | 
			
		||||
                sdfml::switchState(this);
 | 
			
		||||
 | 
			
		||||
            bg1.scale.x = sin(sdfml::elapsed/100);
 | 
			
		||||
            bg1.scale.y = cos(sdfml::elapsed/100);
 | 
			
		||||
 | 
			
		||||
            bg1.screenCenter();
 | 
			
		||||
 | 
			
		||||
            sdfml::focusCamera(&camera, example);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,9 @@
 | 
			
		|||
 | 
			
		||||
#include "SDL_gpu/SDL_gpu.h"
 | 
			
		||||
 | 
			
		||||
#include <thread>         // std::this_thread::sleep_for
 | 
			
		||||
#include <chrono>         // std::chrono::seconds
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			@ -65,6 +68,13 @@ struct Vector2
 | 
			
		|||
    int y = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct Vector3 {
 | 
			
		||||
    T r;
 | 
			
		||||
    T g;
 | 
			
		||||
    T b;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum lLOG_TYPE {
 | 
			
		||||
    NORMAL,
 | 
			
		||||
    WARNING,
 | 
			
		||||
| 
						 | 
				
			
			@ -147,6 +157,25 @@ namespace sdfml {
 | 
			
		|||
 | 
			
		||||
    static context mContext;
 | 
			
		||||
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    inline int getIndex(vector<T> v, T K)
 | 
			
		||||
    {
 | 
			
		||||
        auto it = find(v.begin(), v.end(), K);
 | 
			
		||||
    
 | 
			
		||||
        // If element was found
 | 
			
		||||
        if (it != v.end())
 | 
			
		||||
        {
 | 
			
		||||
        
 | 
			
		||||
            // calculating the index
 | 
			
		||||
            // of K
 | 
			
		||||
            int index = it - v.begin();
 | 
			
		||||
            return index;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            return -1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class sdSprite {
 | 
			
		||||
        public:
 | 
			
		||||
            int x, y, width, height;
 | 
			
		||||
| 
						 | 
				
			
			@ -156,6 +185,8 @@ namespace sdfml {
 | 
			
		|||
            Vector2f scale = {1, 1};
 | 
			
		||||
            Vector2 offset;
 | 
			
		||||
 | 
			
		||||
            Vector3<Uint8> color;
 | 
			
		||||
 | 
			
		||||
            virtual void create(int x, int y, string path) {
 | 
			
		||||
                this->x = x;
 | 
			
		||||
                this->y = y;
 | 
			
		||||
| 
						 | 
				
			
			@ -163,34 +194,26 @@ namespace sdfml {
 | 
			
		|||
                GPU_SetBlendMode(_tex_gpu, GPU_BLEND_NORMAL);
 | 
			
		||||
                width = _tex_gpu->w;
 | 
			
		||||
                height = _tex_gpu->h;
 | 
			
		||||
                color.r = 255;
 | 
			
		||||
                color.g = 255;
 | 
			
		||||
                color.b = 255;
 | 
			
		||||
            }
 | 
			
		||||
            SDL_Rect emptyRect = {0, 0, 0, 0};
 | 
			
		||||
            GPU_Rect *r;
 | 
			
		||||
            virtual void update(float elapsed) {
 | 
			
		||||
                _x = x+offset.x;
 | 
			
		||||
                _y = y+offset.y;
 | 
			
		||||
                _w = width*scale.x;
 | 
			
		||||
                _h = height*scale.y;
 | 
			
		||||
 | 
			
		||||
                _sc.x = _x-_camera->x;
 | 
			
		||||
                _sc.y = _y-_camera->y;
 | 
			
		||||
                _sc.w = _w;
 | 
			
		||||
                _sc.h = _h;
 | 
			
		||||
 | 
			
		||||
                // GPU_SetRGBA(_tex_gpu, 255, 255, 255, alpha*255);
 | 
			
		||||
 | 
			
		||||
                GPU_SetRGBA(_tex_gpu, color.r, color.g, color.b, alpha*255);
 | 
			
		||||
                r = &_src_rect;
 | 
			
		||||
 | 
			
		||||
                if (r->w == 0)
 | 
			
		||||
                    r = NULL;
 | 
			
		||||
                GPU_BlitRectX(_tex_gpu, r, mContext.gpu_render, &_sc, angle, NULL, NULL, GPU_FLIP_NONE);
 | 
			
		||||
                GPU_Rect dst = {static_cast<float>(_x-_camera->x), static_cast<float>(_y-_camera->y), width*scale.x, height*scale.y};
 | 
			
		||||
                GPU_BlitRectX(_tex_gpu, r, mContext.gpu_render, &dst, angle, NULL, NULL, GPU_FLIP_NONE);
 | 
			
		||||
            }
 | 
			
		||||
            virtual void destroy() {
 | 
			
		||||
                _x = 0;
 | 
			
		||||
                _y = 0;
 | 
			
		||||
                _w = 0;
 | 
			
		||||
                _h = 0;
 | 
			
		||||
                _sc = {0, 0, 0, 0};
 | 
			
		||||
                GPU_FreeImage(_tex_gpu);
 | 
			
		||||
            }
 | 
			
		||||
            virtual void updateCamera(SDL_Rect* camera) {
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +236,6 @@ namespace sdfml {
 | 
			
		|||
        protected:
 | 
			
		||||
            int _x, _y, _w, _h;
 | 
			
		||||
 | 
			
		||||
            GPU_Rect _sc;
 | 
			
		||||
            GPU_Rect _src_rect = {0, 0, 0, 0};
 | 
			
		||||
            SDL_Rect dummy = {0, 0, 0, 0};
 | 
			
		||||
            sdCam _cam;
 | 
			
		||||
| 
						 | 
				
			
			@ -316,7 +338,10 @@ namespace sdfml {
 | 
			
		|||
            vector<sdSprite> get_mspr() {
 | 
			
		||||
                return _mut_sprites;
 | 
			
		||||
            }
 | 
			
		||||
        private:
 | 
			
		||||
            void freeSprites() {
 | 
			
		||||
                _mut_sprites.clear();
 | 
			
		||||
                _sprites.clear();
 | 
			
		||||
            }
 | 
			
		||||
            vector<sdSprite> _mut_sprites;
 | 
			
		||||
            vector<sdSprite*> _sprites;
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			@ -423,14 +448,22 @@ namespace sdfml {
 | 
			
		|||
    static const Uint8* kb_last;
 | 
			
		||||
 | 
			
		||||
    inline bool key_just_pressed(SDL_Scancode code) {
 | 
			
		||||
        if (kb[code] && !kb_last[code])
 | 
			
		||||
            return true;
 | 
			
		||||
        while (SDL_PollEvent(&mContext.events))
 | 
			
		||||
        {
 | 
			
		||||
            if (mContext.events.type == SDL_KEYDOWN)
 | 
			
		||||
                if (mContext.events.key.keysym.scancode == code)
 | 
			
		||||
                    return true;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline bool key_just_released(SDL_Scancode code) {
 | 
			
		||||
        if (!kb[code] && kb_last[code])
 | 
			
		||||
            return true;
 | 
			
		||||
        while (SDL_PollEvent(&mContext.events))
 | 
			
		||||
        {
 | 
			
		||||
            if (mContext.events.type == SDL_KEYUP)
 | 
			
		||||
                if (mContext.events.key.keysym.scancode == code)
 | 
			
		||||
                    return true;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -502,12 +535,12 @@ namespace sdfml {
 | 
			
		|||
 | 
			
		||||
            float elapsedMS = (float)(end - start) / SDL_GetPerformanceFrequency() * 1000.0f;
 | 
			
		||||
 | 
			
		||||
            kb_last = SDL_GetKeyboardState(NULL);
 | 
			
		||||
 | 
			
		||||
            elapsed += 1;
 | 
			
		||||
 | 
			
		||||
            SDL_Delay(floor((1000.0f/FRAMERATE) - elapsedMS));
 | 
			
		||||
 | 
			
		||||
            kb_last = SDL_GetKeyboardState(NULL);
 | 
			
		||||
 | 
			
		||||
            GPU_Flip(mContext.gpu_render);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -530,12 +563,18 @@ namespace sdfml {
 | 
			
		|||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline void switchState(sdState* state) {
 | 
			
		||||
    static sdSprite transitionSprite;
 | 
			
		||||
    static sdSprite transitionSprite2;
 | 
			
		||||
    static sdTimer fadeTimer;
 | 
			
		||||
    static sdTimer switchTimer;
 | 
			
		||||
 | 
			
		||||
    inline double clamp(double d, double min, double max) {
 | 
			
		||||
        const double t = d < min ? min : d;
 | 
			
		||||
        return t > max ? max : t;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline int lmao(sdState* state) {
 | 
			
		||||
        if (curState != nullptr) {
 | 
			
		||||
            _ticks = {};
 | 
			
		||||
            _call = {};
 | 
			
		||||
            _repeats = {};
 | 
			
		||||
            _sec = {};
 | 
			
		||||
            if (curState->get_spr().size() > 0) {
 | 
			
		||||
                for (auto texture : curState->get_spr()) {
 | 
			
		||||
                    texture->destroy();
 | 
			
		||||
| 
						 | 
				
			
			@ -546,9 +585,44 @@ namespace sdfml {
 | 
			
		|||
                    texture.destroy();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            curState->freeSprites();
 | 
			
		||||
        }
 | 
			
		||||
        curState = state;
 | 
			
		||||
        _ticks = {};
 | 
			
		||||
        _call = {};
 | 
			
		||||
        _repeats = {};
 | 
			
		||||
        _sec = {};
 | 
			
		||||
        curState->create();
 | 
			
		||||
        transitionSprite2.create(0, 0, "data/images/black.png");
 | 
			
		||||
        curState->add(&transitionSprite2);
 | 
			
		||||
        fadeTimer.start(0, []() {
 | 
			
		||||
            transitionSprite2.x = clamp(transitionSprite2.x - 10, -mContext.size.x, 0);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }, true);
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline void switchState(sdState* state) {
 | 
			
		||||
        try {
 | 
			
		||||
            if (curState != nullptr) {
 | 
			
		||||
                transitionSprite.create(mContext.size.x, 0, "data/images/black.png");
 | 
			
		||||
                curState->add(&transitionSprite);
 | 
			
		||||
                fadeTimer.start(0, []() {
 | 
			
		||||
                    transitionSprite.x = clamp(transitionSprite.x - 7, 0, mContext.size.x);
 | 
			
		||||
                    return 0;
 | 
			
		||||
                }, true);
 | 
			
		||||
                switchTimer.start(1, [state](){
 | 
			
		||||
                    lmao(state);
 | 
			
		||||
                    return 0;
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
                lmao(state);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (...) {
 | 
			
		||||
            lmao(state);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue