Next: Naming Conventions, Up: Introduction [Contents][Index]
To whet your appetite, and hopefully get you excited about the ease and flexibility of programming with Guile-SDL, we begin with a simple example. The following program is a simple image browser. You can cycle through images by using space, n or right to go forward, backspace, p or left to go backwards, and escape or q to quit.
;; load the SDL module and some useful SRFIs (use-modules ((sdl sdl) #:prefix SDL:) (srfi srfi-1) (srfi srfi-2)) ;; initialize the video subsystem (SDL:init 'video) ;; directory to search for images in (define image-dir "/usr/share/pixmaps/") ;; utility to test if a path is a directory (define (file? f) (let* ((stats (stat f)) (type (stat:type stats))) (eq? type 'regular))) ;; build a ring of image file names (define image-ring (let ((dir (opendir image-dir))) (letrec ((D (lambda (ls) (let ((file (readdir dir))) (if (eof-object? file) (begin (closedir dir) ls) (D (cons (string-append image-dir file) ls))))))) (apply circular-list (reverse (filter file? (D '()))))))) ;; functions to cycle through the ring (define (next-image) (let ((next (car image-ring))) (set! image-ring (cdr image-ring)) next)) (define (prev-image) (let ((orig image-ring)) (while (not (eq? (cddr image-ring) orig)) (set! image-ring (cdr image-ring))) (let ((image (car image-ring))) (set! image-ring (cdr image-ring)) image))) ;; display an image given a filename (define (show file) (and-let* ((image (SDL:load-image file))) (SDL:set-video-mode (SDL:surface:w image) (SDL:surface:h image) 24) (SDL:blit-surface image) (SDL:flip))) ;; show the first image (show (next-image)) ;; event handler (let handle ((e (SDL:make-event))) (and (SDL:wait-event e) (case (SDL:event:type e) ((key-down) (case (SDL:event:key:keysym:sym e) ((left backspace) (show (prev-image))) ((right space) (show (next-image))) ((escape q) (SDL:quit) (quit)))))) (handle e))