X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=gacela%2Fgame.scm;h=fe5f0b3a1cfdc993d413ee9371f29c02b04a7fc0;hb=b463d97fdd8afd06f987f5f13ab73b9502e2421b;hp=0b0981dec6ed25eff1565991e78c6e4727644392;hpb=e07174ebbc0c612e7b88ae75e261e14a52b686fd;p=gacela.git diff --git a/gacela/game.scm b/gacela/game.scm index 0b0981d..fe5f0b3 100644 --- a/gacela/game.scm +++ b/gacela/game.scm @@ -17,13 +17,16 @@ (define-module (gacela game) #:use-module (gacela math) + #:use-module (gacela event) #:use-module ((sdl2) #:prefix sdl2:) #:use-module ((sdl2 render) #:prefix sdl2:) #:use-module ((sdl2 surface) #:prefix sdl2:) #:use-module ((sdl2 video) #:prefix sdl2:) #:use-module (gl) #:use-module (srfi srfi-11) - #:export (run-game-loop)) + #:export (start-game + stop-game + %sdl-renderer)) ;;; Based on Sly code. Thank you so much!! @@ -36,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 @@ -71,11 +75,14 @@ unused accumulator time." (cond ((>= ticks max-ticks-per-frame) lag) ((>= lag tick-interval) - ;(process-events) + (process-events) + (if (and (quit-event?) (procedure? when-quit)) + (when-quit)) ;(agenda-tick!) (iter (- lag tick-interval) (1+ ticks))) (else lag))) + (clear-events) (iter lag 0)) (define (alpha lag) @@ -117,8 +124,6 @@ milliseconds of the last iteration of the game loop." (lambda (signum) (stop-game-loop))) (set! %root-scene scene) - (init-window) - (open-window) (game-loop (sdl2:sdl-ticks) 0)) (lambda (cont callback) (when (procedure? callback) @@ -129,11 +134,13 @@ milliseconds of the last iteration of the game loop." (abort-to-prompt 'game-loop-prompt #f)) (define %sdl-window #f) +(define %sdl-renderer #f) (define %gl-context #f) (define (init-window) (sdl2:sdl-init) (set! %sdl-window (sdl2:make-window #:opengl? #t #:show? #t)) + (set! %sdl-renderer (sdl2:make-renderer %sdl-window)) (sdl2:set-gl-attribute! 'context-major-version 3) (sdl2:set-gl-attribute! 'context-minor-version 2) (sdl2:set-gl-attribute! 'double-buffer 1) @@ -141,8 +148,25 @@ 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?) (sdl2:show-window! %sdl-window)) + +(define (close-window) + (sdl2:hide-window! %sdl-window) + (sdl2:sdl-quit)) + +(define* (start-game scene #:key + (title "Untitled") + (resolution '(640 480)) + (fullscreen? #f) + (when-quit (lambda () (stop-game)))) + (init-window) + (open-window title resolution fullscreen?) + (run-game-loop scene #:when-quit when-quit) + (close-window)) + +(define (stop-game) + (stop-game-loop))