球拍中更平滑的抛射运动



我玩了一点球拍大爆炸机制,但我不能得到既平稳又快速的抛射。有那么多丑陋的闪烁。下面是我的代码:

(require 2htdp/universe
         2htdp/image)
(define gx 0)
(define gy 0.35)
(struct ballstate (x y vx vy) #:transparent)
(define startstate (ballstate 10 590 7 -20))
(define (make-new-state old)
  (define newvx (+ (ballstate-vx old) gx))
  (define newvy (+ (ballstate-vy old) gy))
  (ballstate (+ (ballstate-x old) newvx)
             (+ (ballstate-y old) newvy)
             newvx
             newvy))

(define (main)
  (big-bang startstate
            [on-tick make-new-state]
            [to-draw place-ball-at]
            [on-key reset]))
(define (place-ball-at s)
  (place-image (circle 10 "solid" "red")
               (ballstate-x s)
               (ballstate-y s)
               (empty-scene 800 600)))
(define (reset s ke)
  startstate)
(main)

问题是:如何使它更好,更快,更流畅和无闪烁?

这里有两件事可能会有所帮助:

  1. on-tick子句接受一个可选参数,用于确定两个刻度之间的时间。默认值是1/28,所以如果你降低这个值,你会得到更多帧,从而产生更平滑的动画。

  2. 如果您的程序产生图像所需的时间超过每个刻度之间的时间,您将看到口吃。预先计算一切可以预先计算的东西是一件好事。例如,没有理由每次都生成一个新的空场景,所以下面我只是将其存储在一个变量中。

(define (main)
  (big-bang startstate
            [on-tick make-new-state 1/50]
            [to-draw place-ball-at]
            [on-key reset]))
(define background (empty-scene 800 600))
(define (place-ball-at s)
  (place-image (circle 10 "solid" "red")
               (ballstate-x s)
               (ballstate-y s)
               background))

最新更新