Add interframe time delta to frame-events
This commit is contained in:
parent
8083ddf890
commit
71bd34ac5b
|
@ -34,7 +34,7 @@
|
||||||
(struct window (width height) #:transparent)
|
(struct window (width height) #:transparent)
|
||||||
|
|
||||||
;; Message sent by world. Describes frame about to be rendered.
|
;; Message sent by world. Describes frame about to be rendered.
|
||||||
(struct frame-event (counter timestamp target-frame-rate) #:transparent)
|
(struct frame-event (counter timestamp elapsed-ms target-frame-rate) #:transparent)
|
||||||
|
|
||||||
;; Message sent by world. Describes a key event. Key is a sealed
|
;; Message sent by world. Describes a key event. Key is a sealed
|
||||||
;; key-event%. `press?` is #t when the key is pressed (or
|
;; key-event%. `press?` is #t when the key is pressed (or
|
||||||
|
@ -223,6 +223,7 @@
|
||||||
|
|
||||||
(define counter 0)
|
(define counter 0)
|
||||||
(define start-time (current-inexact-milliseconds))
|
(define start-time (current-inexact-milliseconds))
|
||||||
|
(define prev-frame-time start-time)
|
||||||
(define/public (sim-time)
|
(define/public (sim-time)
|
||||||
(- (current-inexact-milliseconds) start-time))
|
(- (current-inexact-milliseconds) start-time))
|
||||||
|
|
||||||
|
@ -239,18 +240,16 @@
|
||||||
(define world (make-world boot-actions))
|
(define world (make-world boot-actions))
|
||||||
(define event-queue (make-queue))
|
(define event-queue (make-queue))
|
||||||
|
|
||||||
(define target-frame-rate 30)
|
(define target-frame-rate 60)
|
||||||
(define frame-count 0)
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(define (sleep-and-refresh)
|
(define (sleep-and-refresh)
|
||||||
(define target-sim-time (* frame-count (/ target-frame-rate)))
|
(define target-sim-time (* counter (/ target-frame-rate)))
|
||||||
(define sleep-time (- target-sim-time (/ (sim-time) 1000.0)))
|
(define sleep-time (- target-sim-time (/ (sim-time) 1000.0)))
|
||||||
(when (positive? sleep-time)
|
(when (positive? sleep-time)
|
||||||
(sleep/yield sleep-time))
|
(sleep/yield sleep-time))
|
||||||
(refresh)
|
(refresh))
|
||||||
(set! frame-count (+ frame-count 1)))
|
|
||||||
|
|
||||||
(define/public (set-target-frame-rate! r)
|
(define/public (set-target-frame-rate! r)
|
||||||
(set! target-frame-rate r))
|
(set! target-frame-rate r))
|
||||||
|
@ -320,8 +319,13 @@
|
||||||
(define/override (on-paint)
|
(define/override (on-paint)
|
||||||
(with-gl-context
|
(with-gl-context
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(inject-event! (message (frame-event counter (sim-time) target-frame-rate)))
|
(let ((this-frame-time (sim-time)))
|
||||||
(set! counter (+ counter 1))
|
(inject-event! (message (frame-event counter
|
||||||
|
this-frame-time
|
||||||
|
(- this-frame-time prev-frame-time)
|
||||||
|
target-frame-rate)))
|
||||||
|
(set! counter (+ counter 1))
|
||||||
|
(set! prev-frame-time this-frame-time))
|
||||||
(quiesce!)
|
(quiesce!)
|
||||||
(unless initialised?
|
(unless initialised?
|
||||||
(glBlendFunc GL_ONE GL_ONE_MINUS_SRC_ALPHA) ;; premultiplied
|
(glBlendFunc GL_ONE GL_ONE_MINUS_SRC_ALPHA) ;; premultiplied
|
||||||
|
|
|
@ -45,35 +45,35 @@
|
||||||
(patch-project/set/single p key-pressed-projection))
|
(patch-project/set/single p key-pressed-projection))
|
||||||
(define new-keys-down (set-subtract (set-union keys-down added) removed))
|
(define new-keys-down (set-subtract (set-union keys-down added) removed))
|
||||||
(transition (list x y new-keys-down) '())]
|
(transition (list x y new-keys-down) '())]
|
||||||
[(message (at-meta (frame-event _ _ target-frame-rate)))
|
[(message (at-meta (frame-event _ _ elapsed-ms _)))
|
||||||
(define-values (old-x old-y) (values x y))
|
(define-values (old-x old-y) (values x y))
|
||||||
(define speed (/ 360.0 target-frame-rate))
|
(define distance (* 0.360 elapsed-ms))
|
||||||
(let* ((x (if (set-member? keys-down 'left) (- x speed) x))
|
(let* ((x (if (set-member? keys-down 'left) (- x distance) x))
|
||||||
(x (if (set-member? keys-down 'right) (+ x speed) x))
|
(x (if (set-member? keys-down 'right) (+ x distance) x))
|
||||||
(y (if (set-member? keys-down 'up) (- y speed) y))
|
(y (if (set-member? keys-down 'up) (- y distance) y))
|
||||||
(y (if (set-member? keys-down 'down) (+ y speed) y)))
|
(y (if (set-member? keys-down 'down) (+ y distance) y)))
|
||||||
(and (not (and (= x old-x) (= y old-y)))
|
(and (not (and (= x old-x) (= y old-y)))
|
||||||
(move-to x y keys-down)))]
|
(move-to x y keys-down)))]
|
||||||
[_ #f]))
|
[_ #f]))
|
||||||
(list 100 100 (set))
|
(list 100 100 (set))
|
||||||
(update-sprites
|
(update-sprites
|
||||||
(simple-sprite -0.5 100 100 (image-width CC) (image-height CC) CC))
|
(simple-sprite -0.5 100 100 (image-width CC) (image-height CC) CC))
|
||||||
(sub (frame-event ? ? ?) #:meta-level 1)
|
(sub (frame-event ? ? ? ?) #:meta-level 1)
|
||||||
(sub (key-pressed ?))))
|
(sub (key-pressed ?))))
|
||||||
|
|
||||||
(define (spawn-frame-counter)
|
(define (spawn-frame-counter)
|
||||||
(spawn (lambda (e s)
|
(spawn (lambda (e s)
|
||||||
(match e
|
(match e
|
||||||
[(message (at-meta (frame-event counter elapsed-ms _)))
|
[(message (at-meta (frame-event counter sim-time-ms _ _)))
|
||||||
(and (> elapsed-ms 0)
|
(and (> sim-time-ms 0)
|
||||||
(let ((i (text (format "~a fps" (/ counter (/ elapsed-ms 1000.0))) 22 "black")))
|
(let ((i (text (format "~a fps" (/ counter (/ sim-time-ms 1000.0))) 22 "black")))
|
||||||
(transition s (update-sprites (simple-sprite -10 300 10
|
(transition s (update-sprites (simple-sprite -10 300 10
|
||||||
(image-width i)
|
(image-width i)
|
||||||
(image-height i)
|
(image-height i)
|
||||||
i)))))]
|
i)))))]
|
||||||
[_ #f]))
|
[_ #f]))
|
||||||
(void)
|
(void)
|
||||||
(sub (frame-event ? ? ?) #:meta-level 1)))
|
(sub (frame-event ? ? ? ?) #:meta-level 1)))
|
||||||
|
|
||||||
(2d-world (spawn-keyboard-integrator)
|
(2d-world (spawn-keyboard-integrator)
|
||||||
(spawn-background)
|
(spawn-background)
|
||||||
|
|
Loading…
Reference in New Issue