Log In  


The Issue

In the relatively short amount of time that I've spent creating in PICO-8 and viewing other PICO-8 developers' creations, I've realized that jittery diagonal movement seems to be one of the most common issues in PICO-8 projects. Through online searches, I've seen a few different methods of preventing this problem, but so far I haven't seen anything that also accounts for accelerating/decelerating velocity. The cart and code below showcases the solution (heavily inspired by the code from two of @Krystman's Lazy Devs videos: https://www.youtube.com/watch?v=oBjZ1W50brM and https://www.youtube.com/watch?v=stoDWgR-kF8) that I'm currently using in a WIP game. I'm wondering what other solutions users have found, and would greatly appreciate feedback on how my current method can be improved.

Notes: the code below is not the same code I am using in my WIP game, so recommendations on how to save tokens or make my code cleaner may not be applicable. Additionally, I am not actually following @Krystman's tutorial series, I only used the aforementioned videos for ideas on this specific issue, so if the code was improved on later in the series, I have not seen it.

Cart

Cart #smoothdiagonalmovement-0 | 2024-09-01 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA


Arrow keys to move, (O) to toggle between normal and smooth movement.

Code

function _init()
    x=60
    y=60
    xv=0
    yv=0
    speed=2
    accel=0.3
    olddir=0
    destutter=false
    toggle="normal"

    function smooth(x1,x2,x3)
        return (x1-x2)*x3
    end
end

function _update()
    if btnp(🅾️) then
        if toggle=="normal" then
            toggle="smooth"
            pal(8,12,1)
        else
            toggle="normal"
            pal(8,8,1)
        end
    end

    local input=btn()&0xf
    local inputarr={1,2,0,3,5,6,3,4,8,7,4,0,1,2,0}
    local dir=inputarr[input] or 0
    local dxarr={-1,1,0,0,-0.71,0.71,0.71,-0.71}
    local dyarr={0,0,-1,1,-0.71,-0.71,0.71,0.71}
    local dx=dxarr[dir] or 0
    local dy=dyarr[dir] or 0

    xv+=smooth(dx*speed,xv,accel)
    yv+=smooth(dy*speed,yv,accel)

    if dir>=5 and toggle=="smooth" then
        local xspeed=abs(xv)
        local yspeed=abs(yv)

        if dir!=olddir or toggle!=oldtoggle then
            destutter=false
        elseif abs(xspeed-yspeed)<0.1 and not destutter then
            x=flr(x+0.5)
            y=flr(y+0.5)

            local newspeed=(xspeed+yspeed)/2

            xv=dx*newspeed
            yv=dy*newspeed

            destutter=true
        end
    end

    oldtoggle=toggle

    olddir=dir

    x+=xv
    y+=yv
end

function _draw()
    cls()
    spr(1,x,y)
    print(toggle,1,1,8)
end



[Please log in to post a comment]