]> git.jsancho.org Git - gacela.git/commitdiff
Customizing quit event behaviour
authorJavier Sancho <jsf@jsancho.org>
Tue, 14 Feb 2017 19:10:33 +0000 (20:10 +0100)
committerJavier Sancho <jsf@jsancho.org>
Tue, 14 Feb 2017 19:10:33 +0000 (20:10 +0100)
examples/02-event-driven-programming/02-event-driven-programming.scm
gacela.scm
gacela/game.scm
gacela/scene.scm

index 505f4b052a2b59f32e8278a1696a2608eb106def..b15123368cbafcdf90ae2a4f47761976a673db88 100644 (file)
 
 (use-modules (gacela))
 
+(define counter-quit #f)
+(let ((n 0))
+  (set! counter-quit
+    (lambda ()
+      (set! n (+ n 1))
+      (format #t "Quit clicked ~a times !!~%" n)
+      (if (> n 2)
+         (stop-game)))))
+
 (display-scene
  (window ((resolution '(640 480))
-         (when-quit (lambda () (format #t "Quit clicked!!~%"))))
+         (when-quit counter-quit))
    (bitmap "x.bmp")))
index d49cbfae27fe17630d438a3b3ee398687be73414..90840bf9e02d435b37d5e3c189bcebe31fde2b4a 100644 (file)
@@ -23,6 +23,7 @@
   (begin
     (define %public-modules
       '((gacela image)
+       (gacela game)
        (gacela math)
        (gacela scene)
        (gacela window)))
index 86136cd9a08fdf0070554dcf6a975efff108ff1d..48bf1297b2fce045905db6d40030fa10165fe81e 100644 (file)
@@ -24,7 +24,8 @@
   #:use-module ((sdl2 video) #:prefix sdl2:)
   #:use-module (gl)
   #:use-module (srfi srfi-11)
-  #:export (play-game
+  #:export (start-game
+           stop-game
            %sdl-renderer))
 
 
@@ -38,7 +39,8 @@
 (define* (run-game-loop scene #:key
                         (frame-rate 60)
                         (tick-rate 60)
-                        (max-ticks-per-frame 4))
+                        (max-ticks-per-frame 4)
+                       (when-quit #f))
   "Run the game loop.  SCENE is a signal which contains the current
 scene renderer procedure.  FRAME-RATE specifies the optimal number of
 frames to draw SCENE per second.  TICK-RATE specifies the optimal game
@@ -74,6 +76,8 @@ unused accumulator time."
               lag)
              ((>= lag tick-interval)
               (process-events)
+              (if (and (quit?) (procedure? when-quit))
+                  (when-quit))
                                        ;(agenda-tick!)
               (iter (- lag tick-interval) (1+ ticks)))
              (else
@@ -143,7 +147,7 @@ milliseconds of the last iteration of the game loop."
   (set! %gl-context (sdl2:make-gl-context %sdl-window))
   (sdl2:set-gl-swap-interval! 'vsync))
 
-(define* (open-window #:key (title "Untitled") (resolution '(640 480)) (fullscreen? #f))
+(define (open-window title resolution fullscreen?)
   (sdl2:set-window-title! %sdl-window title)
   (sdl2:set-window-size! %sdl-window resolution)
   (sdl2:set-window-fullscreen! %sdl-window fullscreen?)
@@ -153,8 +157,15 @@ milliseconds of the last iteration of the game loop."
   (sdl2:hide-window! %sdl-window)
   (sdl2:sdl-quit))
 
-(define (play-game scene . args)
+(define* (start-game scene #:key
+                   (title "Untitled")
+                   (resolution '(640 480))
+                   (fullscreen? #f)
+                   (when-quit (lambda () (stop-game))))
   (init-window)
-  (apply open-window args)
-  (run-game-loop scene)
+  (open-window title resolution fullscreen?)
+  (run-game-loop scene #:when-quit when-quit)
   (close-window))
+
+(define (stop-game)
+  (stop-game-loop))
index e969432c3314b2e05435d7f23a009408422f1a0d..ccdc23e9c47d9e536859360fa2962efe99aa1b19 100644 (file)
@@ -43,5 +43,5 @@
   (apply (scene-procedure scene) args))
 
 (define (run-scene scene . args)
-  (apply play-game
+  (apply start-game
         (cons (scene-procedure scene) args)))