/*******************************************************************************************
							 | 
						|
								*
							 | 
						|
								*   raylib [shapes] example - easings box anim
							 | 
						|
								*
							 | 
						|
								*   Example complexity rating: [★★☆☆] 2/4
							 | 
						|
								*
							 | 
						|
								*   Example originally created with raylib 2.5, last time updated with raylib 2.5
							 | 
						|
								*
							 | 
						|
								*   Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
							 | 
						|
								*   BSD-like license that allows static linking with closed source software
							 | 
						|
								*
							 | 
						|
								*   Copyright (c) 2014-2025 Ramon Santamaria (@raysan5)
							 | 
						|
								*
							 | 
						|
								********************************************************************************************/
							 | 
						|
								
							 | 
						|
								#include "raylib.h"
							 | 
						|
								
							 | 
						|
								#include "reasings.h"            // Required for easing functions
							 | 
						|
								
							 | 
						|
								//------------------------------------------------------------------------------------
							 | 
						|
								// Program main entry point
							 | 
						|
								//------------------------------------------------------------------------------------
							 | 
						|
								int main(void)
							 | 
						|
								{
							 | 
						|
								    // Initialization
							 | 
						|
								    //--------------------------------------------------------------------------------------
							 | 
						|
								    const int screenWidth = 800;
							 | 
						|
								    const int screenHeight = 450;
							 | 
						|
								
							 | 
						|
								    InitWindow(screenWidth, screenHeight, "raylib [shapes] example - easings box anim");
							 | 
						|
								
							 | 
						|
								    // Box variables to be animated with easings
							 | 
						|
								    Rectangle rec = { GetScreenWidth()/2.0f, -100, 100, 100 };
							 | 
						|
								    float rotation = 0.0f;
							 | 
						|
								    float alpha = 1.0f;
							 | 
						|
								
							 | 
						|
								    int state = 0;
							 | 
						|
								    int framesCounter = 0;
							 | 
						|
								
							 | 
						|
								    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
							 | 
						|
								    //--------------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								    // Main game loop
							 | 
						|
								    while (!WindowShouldClose())    // Detect window close button or ESC key
							 | 
						|
								    {
							 | 
						|
								        // Update
							 | 
						|
								        //----------------------------------------------------------------------------------
							 | 
						|
								        switch (state)
							 | 
						|
								        {
							 | 
						|
								            case 0:     // Move box down to center of screen
							 | 
						|
								            {
							 | 
						|
								                framesCounter++;
							 | 
						|
								
							 | 
						|
								                // NOTE: Remember that 3rd parameter of easing function refers to
							 | 
						|
								                // desired value variation, do not confuse it with expected final value!
							 | 
						|
								                rec.y = EaseElasticOut((float)framesCounter, -100, GetScreenHeight()/2.0f + 100, 120);
							 | 
						|
								
							 | 
						|
								                if (framesCounter >= 120)
							 | 
						|
								                {
							 | 
						|
								                    framesCounter = 0;
							 | 
						|
								                    state = 1;
							 | 
						|
								                }
							 | 
						|
								            } break;
							 | 
						|
								            case 1:     // Scale box to an horizontal bar
							 | 
						|
								            {
							 | 
						|
								                framesCounter++;
							 | 
						|
								                rec.height = EaseBounceOut((float)framesCounter, 100, -90, 120);
							 | 
						|
								                rec.width = EaseBounceOut((float)framesCounter, 100, (float)GetScreenWidth(), 120);
							 | 
						|
								
							 | 
						|
								                if (framesCounter >= 120)
							 | 
						|
								                {
							 | 
						|
								                    framesCounter = 0;
							 | 
						|
								                    state = 2;
							 | 
						|
								                }
							 | 
						|
								            } break;
							 | 
						|
								            case 2:     // Rotate horizontal bar rectangle
							 | 
						|
								            {
							 | 
						|
								                framesCounter++;
							 | 
						|
								                rotation = EaseQuadOut((float)framesCounter, 0.0f, 270.0f, 240);
							 | 
						|
								
							 | 
						|
								                if (framesCounter >= 240)
							 | 
						|
								                {
							 | 
						|
								                    framesCounter = 0;
							 | 
						|
								                    state = 3;
							 | 
						|
								                }
							 | 
						|
								            } break;
							 | 
						|
								            case 3:     // Increase bar size to fill all screen
							 | 
						|
								            {
							 | 
						|
								                framesCounter++;
							 | 
						|
								                rec.height = EaseCircOut((float)framesCounter, 10, (float)GetScreenWidth(), 120);
							 | 
						|
								
							 | 
						|
								                if (framesCounter >= 120)
							 | 
						|
								                {
							 | 
						|
								                    framesCounter = 0;
							 | 
						|
								                    state = 4;
							 | 
						|
								                }
							 | 
						|
								            } break;
							 | 
						|
								            case 4:     // Fade out animation
							 | 
						|
								            {
							 | 
						|
								                framesCounter++;
							 | 
						|
								                alpha = EaseSineOut((float)framesCounter, 1.0f, -1.0f, 160);
							 | 
						|
								
							 | 
						|
								                if (framesCounter >= 160)
							 | 
						|
								                {
							 | 
						|
								                    framesCounter = 0;
							 | 
						|
								                    state = 5;
							 | 
						|
								                }
							 | 
						|
								            } break;
							 | 
						|
								            default: break;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // Reset animation at any moment
							 | 
						|
								        if (IsKeyPressed(KEY_SPACE))
							 | 
						|
								        {
							 | 
						|
								            rec = (Rectangle){ GetScreenWidth()/2.0f, -100, 100, 100 };
							 | 
						|
								            rotation = 0.0f;
							 | 
						|
								            alpha = 1.0f;
							 | 
						|
								            state = 0;
							 | 
						|
								            framesCounter = 0;
							 | 
						|
								        }
							 | 
						|
								        //----------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								        // Draw
							 | 
						|
								        //----------------------------------------------------------------------------------
							 | 
						|
								        BeginDrawing();
							 | 
						|
								
							 | 
						|
								            ClearBackground(RAYWHITE);
							 | 
						|
								
							 | 
						|
								            DrawRectanglePro(rec, (Vector2){ rec.width/2, rec.height/2 }, rotation, Fade(BLACK, alpha));
							 | 
						|
								
							 | 
						|
								            DrawText("PRESS [SPACE] TO RESET BOX ANIMATION!", 10, GetScreenHeight() - 25, 20, LIGHTGRAY);
							 | 
						|
								
							 | 
						|
								        EndDrawing();
							 | 
						|
								        //----------------------------------------------------------------------------------
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    // De-Initialization
							 | 
						|
								    //--------------------------------------------------------------------------------------
							 | 
						|
								    CloseWindow();        // Close window and OpenGL context
							 | 
						|
								    //--------------------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								    return 0;
							 | 
						|
								}
							 |