我玩了一点球拍大爆炸机制,但我不能得到既平稳又快速的抛射。有那么多丑陋的闪烁。下面是我的代码:
(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)
问题是:如何使它更好,更快,更流畅和无闪烁?
这里有两件事可能会有所帮助:
-
on-tick子句接受一个可选参数,用于确定两个刻度之间的时间。默认值是1/28,所以如果你降低这个值,你会得到更多帧,从而产生更平滑的动画。
-
如果您的程序产生图像所需的时间超过每个刻度之间的时间,您将看到口吃。预先计算一切可以预先计算的东西是一件好事。例如,没有理由每次都生成一个新的空场景,所以下面我只是将其存储在一个变量中。
(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))