| /******************************************************************************************* | |
| * | |
| *   raylib [textures] example - sprite explosion | |
| * | |
| *   Example originally created with raylib 2.5, last time updated with raylib 3.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) 2019-2023 Anata and Ramon Santamaria (@raysan5) | |
| * | |
| ********************************************************************************************/ | |
| 
 | |
| #include "raylib.h" | |
|  | |
| #define NUM_FRAMES_PER_LINE     5 | |
| #define NUM_LINES               5 | |
|  | |
| //------------------------------------------------------------------------------------ | |
| // Program main entry point | |
| //------------------------------------------------------------------------------------ | |
| int main(void) | |
| { | |
|     // Initialization | |
|     //-------------------------------------------------------------------------------------- | |
|     const int screenWidth = 800; | |
|     const int screenHeight = 450; | |
| 
 | |
|     InitWindow(screenWidth, screenHeight, "raylib [textures] example - sprite explosion"); | |
| 
 | |
|     InitAudioDevice(); | |
| 
 | |
|     // Load explosion sound | |
|     Sound fxBoom = LoadSound("resources/boom.wav"); | |
| 
 | |
|     // Load explosion texture | |
|     Texture2D explosion = LoadTexture("resources/explosion.png"); | |
| 
 | |
|     // Init variables for animation | |
|     float frameWidth = (float)(explosion.width/NUM_FRAMES_PER_LINE);   // Sprite one frame rectangle width | |
|     float frameHeight = (float)(explosion.height/NUM_LINES);           // Sprite one frame rectangle height | |
|     int currentFrame = 0; | |
|     int currentLine = 0; | |
| 
 | |
|     Rectangle frameRec = { 0, 0, frameWidth, frameHeight }; | |
|     Vector2 position = { 0.0f, 0.0f }; | |
| 
 | |
|     bool active = false; | |
|     int framesCounter = 0; | |
| 
 | |
|     SetTargetFPS(120); | |
|     //-------------------------------------------------------------------------------------- | |
|  | |
|     // Main game loop | |
|     while (!WindowShouldClose())    // Detect window close button or ESC key | |
|     { | |
|         // Update | |
|         //---------------------------------------------------------------------------------- | |
|  | |
|         // Check for mouse button pressed and activate explosion (if not active) | |
|         if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && !active) | |
|         { | |
|             position = GetMousePosition(); | |
|             active = true; | |
| 
 | |
|             position.x -= frameWidth/2.0f; | |
|             position.y -= frameHeight/2.0f; | |
| 
 | |
|             PlaySound(fxBoom); | |
|         } | |
| 
 | |
|         // Compute explosion animation frames | |
|         if (active) | |
|         { | |
|             framesCounter++; | |
| 
 | |
|             if (framesCounter > 2) | |
|             { | |
|                 currentFrame++; | |
| 
 | |
|                 if (currentFrame >= NUM_FRAMES_PER_LINE) | |
|                 { | |
|                     currentFrame = 0; | |
|                     currentLine++; | |
| 
 | |
|                     if (currentLine >= NUM_LINES) | |
|                     { | |
|                         currentLine = 0; | |
|                         active = false; | |
|                     } | |
|                 } | |
| 
 | |
|                 framesCounter = 0; | |
|             } | |
|         } | |
| 
 | |
|         frameRec.x = frameWidth*currentFrame; | |
|         frameRec.y = frameHeight*currentLine; | |
|         //---------------------------------------------------------------------------------- | |
|  | |
|         // Draw | |
|         //---------------------------------------------------------------------------------- | |
|         BeginDrawing(); | |
| 
 | |
|             ClearBackground(RAYWHITE); | |
| 
 | |
|             // Draw explosion required frame rectangle | |
|             if (active) DrawTextureRec(explosion, frameRec, position, WHITE); | |
| 
 | |
|         EndDrawing(); | |
|         //---------------------------------------------------------------------------------- | |
|     } | |
| 
 | |
|     // De-Initialization | |
|     //-------------------------------------------------------------------------------------- | |
|     UnloadTexture(explosion);   // Unload texture | |
|     UnloadSound(fxBoom);        // Unload sound | |
|  | |
|     CloseAudioDevice(); | |
| 
 | |
|     CloseWindow();              // Close window and OpenGL context | |
|     //-------------------------------------------------------------------------------------- | |
|  | |
|     return 0; | |
| } |