Attached is a exact way to do a rounded path like the op.
* |* * * * * *| *
* | | *
* | o | *
* | | *
* | | *
* |* * * * * *| *
| |\ |
+-----+ +--------------+
radius space[/code:15y1qd5m]
You can think of each piece of the path like a lerp from one point to another.
left side:
x = center.x - space/2 + radius*cos(90+180*t)
y = center.y + radius*sin(90+180*t)
top:
x = center.x + 0.5*space*lerp(-1,1, t)
y = center.y - radius
right side:
x = center.x + space/2 + radius*cos(-90+180*t)
y = center.y + radius*sin(-90+180*t)
bottom:
x = center.x + 0.5*space*lerp(1,-1, t)
y = center.y + radius
where t is a number from 0 to 1.
Now all that needs to be done is depending on the distance traveled choose the correct equations and t value.
We first start with the distance traveled:
distance = speed * time
Next we need to know the lengths of the pieces.
The top and bottom are easy with a length of "space".
The left and right can be found with the following equation:
arc length = radius * (angle in radians)
Which ends up as pi*radius for each.
With the above the total length = 2*pi*radius+2*space
To choose the correct equations we compare the distance traveled,
0 to pi*radius is the left side.
pi*radius to pi*radius+space is the top.
pi*radius+space to 2*pi*radius+space is the right.
2*pi*radius+space to 2*pi*radius+2*space is the bottom.
Then we find a t (0..1) value for the side with:
If left then t = distance/pi*radius
If top then t = (distance-pi*radius)/space
If right then t = (distance-pi*radius+space)/(pi*radius)
If bottom then t = (distance-2*pi*radius+space)/space
As a final step we want it to loop so we can use the % operator with the total length to do that.
distance = (speed*time)%(2*pi*radius+2*space)
If speed is negative then we need to do effectively this:
((a%b)+b)%b
In the capx I used a function for that.