Using CreateTimer is one method. You may combine this with tweening. Personally I'd rather suggest to use a simple and proper Delta timing.
Delta works like this: It doesn't matter how fast the monitor refreshes, all moves, animations etc. are multiplied by a "elapsed-time" factor. So the higher the monitor rate, the smaller the factor.
You would use a hypothetic rate of 60Hz for a factor of 1.0. with 30 Hz it would then be 2.0, at 85 Hz it's: (60/85)...
The factor can be calculated easily.
sample:
mystep#= 0.7
t=millisecs()-17
while not keydown(1) ; mainloop
; determine elapsed ms / 16.667 ( is 1.0 at 60hz)
old_t=t
t=millisecs()
delta#=float(t-old_t)/16.667
; controls, eg:
if keydown(200) then moveentity player,0,0,mystep# * delta#
; ...
updateword(delta#)
renderworld()
flip
wend
The good thing is you don't have to alter the animation speed of animated meshes, Updateworld allows to use delta directly.
There is one exception where you don't have to use delta, that's when you're already working with realtime related values, returnd (example given) by MouseXSpeed etc.