# Asset Loading System ReiLua includes a built-in asset loading system with a loading screen UI that shows progress while assets are being loaded. ## Features - Automatic Progress Tracking - Tracks how many assets have been loaded - Loading UI with: - Animated "Loading..." text with dots - Smooth progress bar with shimmer effect - Progress percentage (e.g., "3 / 10") - Current asset name being loaded - Easy to Use - Just 3 functions to show loading progress - Works in development and release builds ## API Functions ### RL.BeginAssetLoading(totalAssets) Initialize asset loading progress tracking and show the loading screen. Parameters: - `totalAssets` (integer) - Total number of assets to load Example: ```lua RL.BeginAssetLoading(10) -- We're loading 10 assets ``` --- ### RL.UpdateAssetLoading(assetName) Update the loading progress and display current asset being loaded. Parameters: - `assetName` (string) - Name of the asset currently being loaded Example: ```lua RL.UpdateAssetLoading("player.png") ``` Call this **after** each asset is loaded to update the progress bar. --- ### RL.EndAssetLoading() Finish asset loading and hide the loading screen. Example: ```lua RL.EndAssetLoading() ``` ## Quick Example ```lua function RL.init() -- List of assets to load local assetsToLoad = { "assets/player.png", "assets/enemy.png", "assets/background.png", "assets/music.wav", } -- Begin loading RL.BeginAssetLoading(#assetsToLoad) -- Load each asset for i, path in ipairs(assetsToLoad) do RL.UpdateAssetLoading(path) -- Update progress -- Load the actual asset if path:match("%.png$") or path:match("%.jpg$") then textures[i] = RL.LoadTexture(path) elseif path:match("%.wav$") or path:match("%.ogg$") then sounds[i] = RL.LoadSound(path) end end -- Done! RL.EndAssetLoading() end ``` ## Complete Example ```lua local assets = {} local assetsToLoad = { {type="texture", name="player", path="assets/player.png"}, {type="texture", name="enemy", path="assets/enemy.png"}, {type="texture", name="background", path="assets/background.png"}, {type="sound", name="music", path="assets/music.wav"}, {type="sound", name="shoot", path="assets/shoot.wav"}, {type="font", name="title", path="assets/title.ttf"}, } function RL.init() RL.SetWindowTitle("My Game") -- Start loading with progress RL.BeginAssetLoading(#assetsToLoad) -- Load all assets for i, asset in ipairs(assetsToLoad) do -- Show current asset name on loading screen RL.UpdateAssetLoading(asset.name) -- Load based on type if asset.type == "texture" then assets[asset.name] = RL.LoadTexture(asset.path) elseif asset.type == "sound" then assets[asset.name] = RL.LoadSound(asset.path) elseif asset.type == "font" then assets[asset.name] = RL.LoadFont(asset.path) end end -- Loading complete! RL.EndAssetLoading() print("Game ready!") end function RL.update(delta) -- Your game logic end function RL.draw() RL.ClearBackground(RL.RAYWHITE) -- Use loaded assets if assets.background then RL.DrawTexture(assets.background, {0, 0}, RL.WHITE) end if assets.player then RL.DrawTexture(assets.player, {100, 100}, RL.WHITE) end end ``` ## Loading Screen Appearance The loading screen features a clean 1-bit pixel art style: Design: - Pure black and white aesthetic - Retro pixel art styling - Minimal and clean design Elements: - **Title**: "LOADING" in bold white pixel text - **Animated Dots**: White pixelated dots (4x4 squares) that cycle - **Progress Bar**: - 200px wide, 16px tall - Thick 2px white border (pixel art style) - White fill with black dithering pattern - Retro/Classic terminal aesthetic - **Progress Text**: "3/10" in white pixel font style - **Asset Name**: Current loading asset in small white text - **Corner Decorations**: White pixel art L-shaped corners in all 4 corners Background: - Pure black background (#000000) - High contrast for maximum clarity Color Palette: - White text and UI (#FFFFFF) - Black background (#000000) - Pure 1-bit aesthetic (inverted terminal style) Style Inspiration: - Classic terminal / console aesthetic - MS-DOS loading screens - 1-bit dithering patterns - Chunky pixel borders - Retro computing / CRT monitor style ## Customization If you want to customize the loading screen appearance, you can modify the colors and sizes in `src/lua_core.c` in the `drawLoadingScreen()` function. ## Performance Tips 1. **Call UpdateAssetLoading AFTER loading** - This ensures the progress updates at the right time 2. **Load assets in order of importance** - Load critical assets first 3. **Group similar assets** - Load all textures, then sounds, etc. 4. **Use descriptive names** - Shows better feedback to users ## Example Asset Loading Patterns ### Pattern 1: Simple List ```lua local files = {"player.png", "enemy.png", "music.wav"} RL.BeginAssetLoading(#files) for i, file in ipairs(files) do RL.UpdateAssetLoading(file) -- load file end RL.EndAssetLoading() ``` ### Pattern 2: With Types ```lua local assets = { textures = {"player.png", "enemy.png"}, sounds = {"music.wav", "shoot.wav"}, } local total = #assets.textures + #assets.sounds RL.BeginAssetLoading(total) for _, file in ipairs(assets.textures) do RL.UpdateAssetLoading(file) -- load texture end for _, file in ipairs(assets.sounds) do RL.UpdateAssetLoading(file) -- load sound end RL.EndAssetLoading() ``` ### Pattern 3: Error Handling ```lua RL.BeginAssetLoading(#files) for i, file in ipairs(files) do RL.UpdateAssetLoading(file) if RL.FileExists(file) then -- load file else print("Warning: " .. file .. " not found") end end RL.EndAssetLoading() ``` ## When to Use Use the loading system when: - You have more than 5-10 assets to load - Assets are large (images, sounds, fonts) - Loading might take more than 1 second - You want polished loading feedback You can skip it when: - You have very few, small assets - Loading is nearly instant - You prefer immediate game start ## ✨ Benefits - Polished user experience - User knows the game is loading, not frozen - Shows progress for large asset sets - Works with embedded assets - Minimal code required - Beautiful default UI The loading system makes your game feel polished with just a few lines of code!