I avoided posting the animation method, because my method might not be that great but here's one (probably poor) idea.
You need to have the tilt move in small increments to it' maximum tilt. But you only want it to move 1 increment per loop so, you could have a count of how many frames it needs to move as well as a logic to ignore other keys during that time.
Ok, so create a variable like animcycle.
animcycle=1 means that tilt frames still need to complete
animcycle=0 means that tilt frames complete process another key
move=0
Then add it to your code like this:
Sorry that it's messy and ugly brute force. I had to keep playing with it. It really needs to be streamlined better. And the if's cna be simplified, but I think it will give you the idea that I meant. If I looked at it longer i could clean it up a bit.
hide mouse
sync on
sync rate 0
dx#=45
animcycle=0
count=0
rem load character and rotate
make object cube 1, .5: xrotate object 1, dx#
rem BEGIN MAIN LOOP
do
rem key controls
rem up key
if upkey()=1 and animcycle=0
dx#=60
endif
rem down key
if downkey()=1
dx#=30
endif
rem left key
if leftkey()=1 and animcycle=0
orz#=orz#-2
move=1
animcycle=1
endif
rem right key
if rightkey()=1 and animcycle=0
orz#=orz#+2
move=2
animcycle=1
endif
rotate object 1, dx#,ory#,orz#
sync
rem reset variables
if move=1 and animcycle=1
if count<20
orz#=orz#-2
inc count
endif
endif
if move=2 and animcycle=1
if count<20
orz#=orz#+2
inc count
endif
endif
dx#=45
if count=20 and move=2 and rightkey()=0
count=0
animcycle=0
endif
if count=20 and move=1 and leftkey()=0
count=0
animcycle=0
endif
if animcycle=0 and rightkey()=0
orz#=0
endif
if animcycle=0 and leftkey()=0
orz#=0
endif
loop
You may want to move it back to the original 0 position in increments as well, but i'll leave it up to you. Plus my code was off the cuff and a pretty ugly method.