Ball n starts at position n at time y = 0.
The position of the n’th ball at time  is

f[x_] := -Tanh[x/2];

xMaxPlot = 10;
yMax =5;
xMaxBalls =xMaxPlot + yMax;

ball[n_, y_]:= n  + f[n] y
solutionSurface = ContourPlot3D[ z == f[x - z y], {x, -xMaxPlot, xMaxPlot}, {y, 0, yMax}, {z, -1, 1}, AxesLabel ->{x,y,z}, BoxRatios ->{3,3,1}]
frame[y_] := Graphics[Table[Disk[{ball[n,y],f[n]}, .3], {n, -xMaxBalls, xMaxBalls,1}], PlotRange ->{{-xMaxPlot, xMaxPlot}, {-2,2}}, Frame -> True , FrameTicks -> {Automatic, Automatic} ]
animation = Table[frame[y], {y, 0, yMax, .2}];
ListAnimate[animation]

f[x_] := Tanh[x/2];

xMaxPlot = 10;
yMax =5;
xMaxBalls =xMaxPlot;

ball[n_, y_]:= n  + f[n] y
solutionSurface = ContourPlot3D[ z == f[x - z y], {x, -xMaxPlot, xMaxPlot}, {y, 0, yMax}, {z, -1, 1}, AxesLabel ->{x,y,z}, BoxRatios ->{3,3,1}]
frame[y_] := Graphics[Table[Disk[{ball[n,y],f[n]}, .3], {n, -xMaxBalls, xMaxBalls,1}], PlotRange ->{{-xMaxPlot, xMaxPlot}, {-2,2}}, Frame -> True , FrameTicks -> {Automatic, Automatic} ]
animation = Table[frame[y], {y, 0, yMax, .2}];
ListAnimate[animation]

f[x_] := -x/10;

xMaxPlot = 10;
yMax =15;
xMaxBalls =xMaxPlot+ 1.5*yMax;

ball[n_, y_]:= n  + f[n] y
solutionSurface = ContourPlot3D[ z == f[x - z y], {x, -xMaxPlot, xMaxPlot}, {y, 0, yMax}, {z, -1, 1}, AxesLabel ->{x,y,z}, BoxRatios ->{3,3,1}]
frame[y_] := Graphics[Table[Disk[{ball[n,y],f[n]}, .3], {n, -xMaxBalls, xMaxBalls,1}], PlotRange ->{{-xMaxPlot, xMaxPlot}, {-3,3}}, Frame -> True , FrameTicks -> {Automatic, Automatic} ]
animation = Table[frame[y], {y, 0, yMax, .2}];
ListAnimate[animation]