/******************************************************************************************* * * raylib [textures] example - sprite explosion * * This example has been created using raylib 2.5 (www.raylib.com) * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) * * Copyright (c) 2019 Anata and Ramon Santamaria (@raysan5) * Copyright (c) 2022 Roy Qu (royqh1979@gmail.com) * ********************************************************************************************/ #include #define NUM_FRAMES_PER_LINE 5 #define NUM_LINES 5 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("boom.wav"); // Load explosion texture Texture2D explosion = LoadTexture("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); SetTraceLogLevel(LOG_WARNING); //-------------------------------------------------------------------------------------- // 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) ) { 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); DrawText("Click to explode!", 440, 400, 40, DARKGRAY); EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- UnloadTexture(explosion); // Unload texture UnloadSound(fxBoom); // Unload sound CloseAudioDevice(); CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; }