link graphics record Point(x, y) $define X 200 # center $define Y 200 $define Delay 30 # frame delay $define Message "Awake!" $define Radius 40 # radius of blinker $define Ring 44 # radius of ring $define Modulus 12 # blinker delta $define Orad 120 # orbit radius procedure main() local new_point, old_point, count WOpen("size=" || (2 * X) || "," || (2 * Y), "bg=light gray", "drawop=reverse", "font=Helvetica,42") | stop("*** cannot open window") # Create background for blinker. FillCircle(X, Y, Ring) # Animate the display. count := 0 until WQuit() do { every new_point := circle(X, Y, Orad) do { CenterString((\old_point).x, old_point.y, Message) CenterString(new_point.x, new_point.y, Message) count +:= 1 if count % Modulus = 0 then FillCircle(X, Y, Radius) WDelay(Delay) old_point := new_point } } end procedure circle(x, y, r) local theta every theta := 1 to 360 do suspend Point( x + r * cos(dtor(theta)), y + r * sin(dtor(theta)) ) end