You can either base movement on a timer() or fps. Either of them will work if a user has a massivly faster comp than you, thats the easy bit. The problem is with slow comps.
If you use a timer() then it might not be able to execute the code fast enough so the movement will be slower.
If you use fps then as the fps drops your sprites will be moving more and more pixels at at time and can look jerky and may even jump right over other sprites you are testing for collision with.
The best way is just to run it on the slowest comp you want it to run on and see if it works. Then just warn users that if they don't meet the spec they may have problems.
I guess fps based movement is best as your users with fast comps get the smoothest possible movement where using a timer you would be holding them back to the same speed as your users with the slowest comps.
You can even mix and match controling some parts with a timer and others with the fps.
This code moves the top sprite with a timer and the bottom one based on fps, changing the sync rate isn't completly accurite but gives an idea what would happen on different speed comps.
box 0,0,32,32
get image 1,0,0,32,32,1
cls
sync on
sync rate 50
sprite 1,0,50,1
sprite 2,0,200,1
fps as integer
last_move as integer
last_move = timer()
intival as integer
move as float
s_x as float
repeat
cls
text 0,0,str$(screen fps())
text 0,15,"Waiting for fps to stabalise"
sync
until timer() - last_move > 5000
last_move = timer()
do
cls
fps = (screen fps()+fps)/2
`timer() movement
if timer() - last_move > 90
inteval = timer() - last_move
sprite 1,sprite x(1)+1,50,1
last_move = timer()
endif
`fps based movement
move = (10.0/fps)
inc s_x,move
sprite 2,s_x,200,1
text 0,0,"fps :"+str$(fps)
text 0,15,"inteval :"+str$(inteval)
text 0,30,"move :"+str$(move)
sync
loop