------------------------------------------------------------------------------------------- -- -- raylib example - particles trail blending -- -- This example has been created using raylib 1.6 (www.raylib.com) -- raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) -- -- Copyright (c) 2014-2016 Ramon Santamaria (@raysan5) -- ------------------------------------------------------------------------------------------- MAX_PARTICLES = 200 -- Initialization ------------------------------------------------------------------------------------------- local screenWidth = 800 local screenHeight = 450 InitWindow(screenWidth, screenHeight, "raylib [textures] example - particles trail blending") -- Particles pool, reuse them! local mouseTail = {} -- Initialize particles for i = 1, MAX_PARTICLES do mouseTail[i] = {} mouseTail[i].position = Vector2(0, 0) mouseTail[i].color = Color(GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255) mouseTail[i].alpha = 1.0 mouseTail[i].size = GetRandomValue(1, 30)/20.0 mouseTail[i].rotation = GetRandomValue(0, 360) mouseTail[i].active = false end local gravity = 3.0 local smoke = LoadTexture("resources/smoke.png") local blending = BlendMode.ALPHA SetTargetFPS(60) ------------------------------------------------------------------------------------------- -- Main game loop while not WindowShouldClose() do -- Detect window close button or ESC key -- Update --------------------------------------------------------------------------------------- -- Activate one particle every frame and Update active particles -- NOTE: Particles initial position should be mouse position when activated -- NOTE: Particles fall down with gravity and rotation... and disappear after 2 seconds (alpha = 0) -- NOTE: When a particle disappears, active = false and it can be reused. for i = 1, MAX_PARTICLES do if (not mouseTail[i].active) then mouseTail[i].active = true mouseTail[i].alpha = 1.0 mouseTail[i].position = GetMousePosition() break end end for i = 1, MAX_PARTICLES do if (mouseTail[i].active) then mouseTail[i].position.y = mouseTail[i].position.y + gravity mouseTail[i].alpha = mouseTail[i].alpha - 0.01 if (mouseTail[i].alpha <= 0.0) then mouseTail[i].active = false end mouseTail[i].rotation = mouseTail[i].rotation + 5.0 end end if (IsKeyPressed(KEY.SPACE)) then if (blending == BlendMode.ALPHA) then blending = BlendMode.ADDITIVE else blending = BlendMode.ALPHA end end --------------------------------------------------------------------------------------- -- Draw --------------------------------------------------------------------------------------- BeginDrawing() ClearBackground(DARKGRAY) BeginBlendMode(blending) -- Draw active particles for i = 1, MAX_PARTICLES do if (mouseTail[i].active) then DrawTexturePro(smoke, Rectangle(0, 0, smoke.width, smoke.height), Rectangle(mouseTail[i].position.x, mouseTail[i].position.y, smoke.width*mouseTail[i].size//1, smoke.height*mouseTail[i].size//1), Vector2(smoke.width*mouseTail[i].size/2, smoke.height*mouseTail[i].size/2), mouseTail[i].rotation, Fade(mouseTail[i].color, mouseTail[i].alpha)) end end EndBlendMode() DrawText("PRESS SPACE to CHANGE BLENDING MODE", 180, 20, 20, BLACK) if (blending == BlendMode.ALPHA) then DrawText("ALPHA BLENDING", 290, screenHeight - 40, 20, BLACK) else DrawText("ADDITIVE BLENDING", 280, screenHeight - 40, 20, RAYWHITE) end EndDrawing() --------------------------------------------------------------------------------------- end -- De-Initialization ------------------------------------------------------------------------------------------- UnloadTexture(smoke) CloseWindow() -- Close window and OpenGL context -------------------------------------------------------------------------------------------