#| (defpackage #:sisyphus (:use #:common-lisp) (:export #:start)) (in-package #:sisyphus) |# (defvar *surface* nil) (defvar *current-frame* -1) (defun init-sdl () (sdl:init (logior sdl:+init-video+ sdl:+init-noparachute+)) (sdl:wm-set-caption "Sisyphus" nil)) (defun create-filename (name number) (concatenate 'string name (format nil "~10,3,'0R" number) ".ppm")) (defun load-buffers (name frames) (let ((buffers (make-array (list frames)))) (dotimes (i frames) (format t "loading ~A~%" (create-filename name i)) (setf (aref buffers i) (img:load (create-filename name i)))) ; Initialize the main surface (setf *surface* (sdl:set-video-mode (sdl:surface-w (aref buffers 0)) (sdl:surface-h (aref buffers 0)) 24 (logior sdl:+doublebuf+ sdl:+swsurface+))) (when (sgum:null-pointer-p *surface*) (error "Unable to set video mode")) buffers)) (defun update-surface (buffers total-frames) (if (= *current-frame* (- total-frames 1)) (setf *current-frame* -1)) (sdl:blit-surface (aref buffers (incf *current-frame*)) nil *surface* nil) (sdl:flip *surface*) (sdl:delay 75)) (defun run-sdl-event-loop (buffers frames) (sdl:event-loop (:key-down (scan-code key mod unicode) (if (= key (char-code #\q)) (return))) (:quit () (return)) (:idle () (update-surface buffers frames)))) (defun start (name frames) (init-sdl) (unwind-protect (progn (let ((buffers (load-buffers name frames))) (run-sdl-event-loop buffers frames))) (sdl:quit)))