Log In  

Hey everyone,

I wanted to share a standalone function I've been using in my recent PICO-8 projects called loopi (LoopIndex).

It's designed to loop an index across a specified range based on the elapsed time, making it really handy for animations or any time-sensitive indexing. The function also includes an optional 'invert' feature, which creates a smooth back-and-forth motion.

Here's the snippet (46 tokens):

function loopi(range, delay, invert)
    local idx = flr((time() / delay) % (invert and 2 * (range - 1) or range))
    if invert and idx >= range then
        idx = 2 * (range - 1) - idx
    end
    return idx    
end

Minified (42 tokens):

function loopi(r,d,i)local x=flr(time()/d)%(i and 2*(r-1)or r)return i and min(x,2*(r-1)-x)or x end

Note: If you don't want to tie the timings to the time() output, you can replace it with something else or by adding a new argument - Otherwise, it works nicely as a standalone function :)

Example Usage:

Let's say you want to cycle through sprites at positions 5 to 8 based on time. You can use loopi to calculate the appropriate sprite index:

function _update()
    -- Loop through sprite indexes 5 to 8 every 0.5 seconds without inversion
    sprite_index = 5 + loopi(4, 0.5, false)
end

This setup will continuously loop the sprite index from 5 to 8, changing every 0.5 seconds. If you want the sprites to animate forward and then backward (like a ping-pong effect), just set the invert parameter to true.

Demo:

Cart #loopidemo-0 | 2024-04-18 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
2

I'm not sure if there's something similar already out there, but this has been very useful in my latest experiences with PICO-8. I hope you find it helpful too! Feel free to tweak it and share any improvements or uses you come up with.

P#146768 2024-04-16 15:53 ( Edited 2024-04-18 14:16)


[Please log in to post a comment]