Here's my version:
DynamicModule[{l0 = 500, h = 30, d = 30, x0 = 100, y0 = 400, v = 1,
u = -2},
(* INIT *)
t = 0;
x = x0 + v*t;
y = y0 + u*t;
(* DISPLAY *)
Panel[
Column[{
Graphics[Dynamic@{
Rectangle[{0, -10}, {l0, 0}],
Green, Rectangle[{x - d, -0}, {x, h}],
Blue, Rectangle[{y, 0}, {y + d, h}]}
],
Row@{
Slider[ (* update x, y whenever t changes *)
Dynamic[t, (t = #; x = x0 + v*t; y = y0 + u*t) &],
{0, 200, 1}], " ", Dynamic@t},
Dynamic@{y <= x, " ", If[y <= x, "Collision", "Separated"]}}]
]
]
Code like x = Dynamic[x0 + v*t] is a bit odd to see. The "value" of x is literally Dynamic[x0 + v*t]. Whatever the numerical values of x0, v, and t happen to be, x is never equal to the numerical value of x0 + v*t. It is always equal to the symbolic expression Dynamic[x0 + v*t]. When a Dynamic[expr] is displayed by the Front End, the Front End shows the current value of expr. So when x is displayed, you see the numerical value of x0 + v*t. But x does not equal that value; it never does, as I have said.
The variables x,y, t were global, and I left them that way. If this was not intentional, then I suggest they be added to the list of variables for the DynamicModule[]. Otherwise, they might create bugs in any open notebook.