async void RotateBackground()
{
while (true)
{
// calculate positions using Law of sines
var x = BackgroundScale * (float)Math.Sin(MathHelper.DegreesToRadians(90 - BackgroundRotationX));
var y = BackgroundScale * (float)Math.Sin(MathHelper.DegreesToRadians(BackgroundRotationX)) + FlightHeight;
var moveTo = x + 1f; //a small adjusment to hide that gap between two tiles
var h = (float)Math.Tan(MathHelper.DegreesToRadians(BackgroundRotationX)) * moveTo;
await Task.WhenAll(frontTile.RunActionsAsync(new MoveBy(1 / BackgroundSpeed, new Vector3(0, -moveTo, -h))),
rearTile.RunActionsAsync(new MoveBy(1 / BackgroundSpeed, new Vector3(0, -moveTo, -h))));
//switch tiles
var tmp = frontTile;
frontTile = rearTile;
rearTile = tmp;
rearTile.Position = new Vector3(0, x, y);
}
}