もうちょっと遊んでみる

マウスをクリックしたところへ、青い円が飛んでいく:

#lang frtime
(require
 frtime/animation)

(define phase (wave 100))

(define clicked-time
  (hold (left-clicks . ==> . (lambda (_) (snapshot (phase) phase)))
        (snapshot (phase) phase)))

(define target-pos
  (hold (left-clicks . ==> . (lambda (_) (snapshot (mouse-pos) mouse-pos)))
        (make-posn 10 10)))

(define source-pos
  (hold (left-clicks . ==> . (lambda (_) (snapshot (circle-pos) circle-pos)))
        (make-posn 10 10)))

(define distance
  (let ([ax (posn-x target-pos)]
        [ay (posn-y target-pos)]
        [bx (posn-x source-pos)]
        [by (posn-y source-pos)])
    (sqrt (+ (sqr (- ax bx)) (sqr (- ay by))))))

(define circle-t
  (let ([t (- phase clicked-time)])
    (if (< t distance) (/ t distance) 1)))

(define circle-pos
  (if (= distance 0)
      target-pos
      (posn+ (posn* source-pos (- 1 circle-t))
             (posn* target-pos circle-t))))

(display-shapes
 (list
  (make-circle circle-pos 10 "blue")
  (make-ring target-pos 15 "green")))

おそらくGCのためだが、ときどき動きが固まる。うーん…