在Racket中更平滑的抛射物运动?

时间:2014-06-29 14:57:11

标签: racket game-physics

我正在使用Racket大爆炸机制,但我不能同时获得平稳和快速的射弹。有那么多丑陋的闪烁。这是我的代码:

(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 个答案:

答案 0 :(得分:2)

以下两件事可能有所帮助:

  1. on-tick子句采用可选参数来确定两个滴答之间的时间。默认值为1/28,因此如果降低此值,您将获得更多帧,从而产生更流畅的动画。

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

  3. (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))