summaryrefslogtreecommitdiff
path: root/2d/game.scm
diff options
context:
space:
mode:
Diffstat (limited to '2d/game.scm')
-rw-r--r--2d/game.scm109
1 files changed, 0 insertions, 109 deletions
diff --git a/2d/game.scm b/2d/game.scm
deleted file mode 100644
index d6a0345..0000000
--- a/2d/game.scm
+++ /dev/null
@@ -1,109 +0,0 @@
-;;; guile-2d
-;;; Copyright (C) 2013, 2014 David Thompson <dthompson2@worcester.edu>
-;;;
-;;; This program is free software: you can redistribute it and/or
-;;; modify it under the terms of the GNU General Public License as
-;;; published by the Free Software Foundation, either version 3 of the
-;;; License, or (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with this program. If not, see
-;;; <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-;;
-;; The game loop.
-;;
-;;; Code:
-
-(define-module (2d game)
- #:use-module (srfi srfi-9)
- #:use-module ((sdl sdl) #:prefix SDL:)
- #:use-module (gl)
- #:use-module (2d agenda)
- #:use-module (2d event)
- #:use-module (2d math)
- #:use-module (2d signal)
- #:use-module (2d window)
- #:export (tick-interval
- max-ticks-per-frame
- draw-hook
- start-game-loop
- stop-game-loop))
-
-;;;
-;;; Game Loop
-;;;
-
-;; Update 60 times per second by default.
-(define tick-interval (floor (/ 1000 60)))
-;; The maximum number of times the game loop will update game state in
-;; a single frame. When this upper bound is reached due to poor
-;; performance, the game will start to slow down instead of becoming
-;; completely unresponsive and possibly crashing.
-(define max-ticks-per-frame 4)
-(define draw-hook (make-hook 2))
-
-(define (draw dt alpha)
- "Render a frame."
- (let ((width (signal-ref window-width))
- (height (signal-ref window-height)))
- (gl-viewport 0 0 width height))
- (gl-clear (clear-buffer-mask color-buffer depth-buffer))
- (run-hook draw-hook dt alpha)
- (SDL:gl-swap-buffers))
-
-(define (update lag)
- "Call the update callback. The update callback will be called as
-many times as tick-interval can divide LAG. The return value
-is the unused accumulator time."
- (define (iter lag ticks)
- (cond ((>= ticks max-ticks-per-frame)
- lag)
- ((>= lag tick-interval)
- (tick-agenda!)
- (iter (- lag tick-interval) (1+ ticks)))
- (else
- lag)))
- (iter lag 0))
-
-(define (alpha lag)
- "Calculate interpolation factor in the range [0, 1] for the
-leftover frame time LAG."
- (clamp 0 1 (/ lag tick-interval)))
-
-(define (frame-sleep time)
- "Sleep for the remainder of the frame that started at TIME."
- (let ((t (- (+ time tick-interval)
- (SDL:get-ticks))))
- (usleep (max 0 (* t 1000)))))
-
-(define (game-loop previous-time lag)
- "Update game state, and render. PREVIOUS-TIME is the time in
-milliseconds of the last iteration of the game loop."
- (let* ((current-time (SDL:get-ticks))
- (dt (- current-time previous-time)))
- (process-events)
- (let ((lag (update (+ lag dt))))
- (draw dt (alpha lag))
- (frame-sleep current-time)
- (game-loop current-time lag))))
-
-(define (start-game-loop)
- "Start the game loop."
- (call-with-prompt
- 'game-loop-prompt
- (lambda ()
- (game-loop (SDL:get-ticks) 0))
- (lambda (cont callback)
- (when (procedure? callback)
- (callback cont)))))
-
-(define (stop-game-loop)
- "Abort the game loop."
- (abort-to-prompt 'game-loop-prompt #f))