diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4231d4d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI + +on: [push] + +jobs: + test: + name: ${{ matrix.lisp }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + lisp: [sbcl-bin] + os: [ubuntu-latest] # , macOS-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install SDL2 + run: | + sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev + + - name: Install Roswell + env: + LISP: ${{ matrix.lisp }} + run: | + curl -L https://raw.githubusercontent.com/roswell/roswell/master/scripts/install-for-ci.sh | sh + + - name: Run tests + run: | + ./tests/test.ros diff --git a/01-hello-sdl.lisp b/01-hello-sdl.lisp new file mode 100644 index 0000000..2d1a366 --- /dev/null +++ b/01-hello-sdl.lisp @@ -0,0 +1,21 @@ +(defpackage #:sdl2-tutorial-01-hello-sdl + (:use :cl) + (:export :run)) + +(in-package :sdl2-tutorial-01-hello-sdl) + +(defparameter *screen-width* 640) +(defparameter *screen-height* 480) + +(defun run() + (sdl2:with-init (:video) + (sdl2:with-window (window :title "SDL2 Tutorial 01" + :w *screen-width* + :h *screen-height* + :flags '(:shown)) + (let ((screen-surface (sdl2:get-window-surface window))) + (sdl2:fill-rect screen-surface + nil + (sdl2:map-rgb (sdl2:surface-format screen-surface) 255 255 255)) + (sdl2:update-window window) + (sdl2:delay 2000))))) diff --git a/02-getting-an-image-on-the-screen.lisp b/02-getting-an-image-on-the-screen.lisp new file mode 100644 index 0000000..bca48a0 --- /dev/null +++ b/02-getting-an-image-on-the-screen.lisp @@ -0,0 +1,34 @@ +(defpackage #:sdl2-tutorial-02-getting-an-image-on-the-screen + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) + +(in-package :sdl2-tutorial-02-getting-an-image-on-the-screen) + +(defparameter *screen-width* 640) +(defparameter *screen-height* 480) + +(defmacro with-window-surface ((window surface) &body body) + `(sdl2:with-init (:video) + (sdl2:with-window (,window + :title "SDL2 Tutorial 02" + :w *screen-width* + :h *screen-height* + :flags '(:shown)) + (let ((,surface (sdl2:get-window-surface ,window))) + ,@body)))) + +(defun load-image (filename) + (let ((image (sdl2:load-bmp filename))) + (if (autowrap:wrapper-null-p image) + (error "cannot load image ~a (check that file exists)" filename) + image))) + +(defun run() + (with-window-surface (window screen-surface) + (let ((image (load-image (asset-pathname #P"./assets/02/hello_world.bmp")))) + (sdl2:blit-surface image nil screen-surface nil) + (sdl2:update-window window) + (sdl2:delay 2000) + ;; clean up + (sdl2:free-surface image)))) diff --git a/03-event-driven-programming.lisp b/03-event-driven-programming.lisp new file mode 100644 index 0000000..07565c9 --- /dev/null +++ b/03-event-driven-programming.lisp @@ -0,0 +1,38 @@ +(defpackage #:sdl2-tutorial-03-event-driven-programming + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) + +(in-package :sdl2-tutorial-03-event-driven-programming) + +(defparameter *screen-width* 640) +(defparameter *screen-height* 480) + +(defmacro with-window-surface ((window surface) &body body) + `(sdl2:with-init (:video) + (sdl2:with-window (,window + :title "SDL2 Tutorial 03" + :w *screen-width* + :h *screen-height* + :flags '(:shown)) + (let ((,surface (sdl2:get-window-surface ,window))) + ,@body)))) + +(defun load-image (pathname) + (let ((image (sdl2:load-bmp pathname))) + (if (autowrap:wrapper-null-p image) + (error "cannot load image ~a (check that file exists)" pathname) + image))) + +(defun run () + (with-window-surface (window screen-surface) + (let ((image (load-image (asset-pathname #P"./assets/03/exit.bmp")))) + (sdl2:with-event-loop (:method :poll) + (:quit () t) + (:idle () + (sdl2:blit-surface image nil screen-surface nil) + (sdl2:update-window window) + ;; reduce cpu usage + (sdl2:delay 100))) + ;; clean up + (sdl2:free-surface image)))) diff --git a/04-key-presses.lisp b/04-key-presses.lisp new file mode 100644 index 0000000..ce8e38a --- /dev/null +++ b/04-key-presses.lisp @@ -0,0 +1,53 @@ +(defpackage #:sdl2-tutorial-04-key-presses + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) + +(in-package :sdl2-tutorial-04-key-presses) + +(defparameter *screen-width* 640) +(defparameter *screen-height* 480) + +(defmacro with-window-surface ((window surface) &body body) + `(sdl2:with-init (:video) + (sdl2:with-window (,window + :title "SDL2 Tutorial 04" + :w *screen-width* + :h *screen-height* + :flags '(:shown)) + (let ((,surface (sdl2:get-window-surface ,window))) + ,@body)))) + +(defun load-image (pathname) + (let ((image (sdl2:load-bmp pathname))) + (if (autowrap:wrapper-null-p image) + (error "cannot load image ~a (check that file exists)" pathname) + image))) + +(defun load-media () + (list :default (load-image (asset-Pathname #P"./assets/04/press.bmp")) + :up (load-image (asset-pathname #P"./assets/04/up.bmp")) + :down (load-image (asset-pathname #P"./assets/04/down.bmp")) + :left (load-image (asset-pathname #P"./assets/04/left.bmp")) + :right (load-image (asset-pathname #P"./assets/04/right.bmp")))) + +(defun run () + (with-window-surface (window screen-surface) + (let* ((images (load-media)) + (image (getf images :default))) + (sdl2:with-event-loop (:method :poll) + (:quit () t) + (:keydown (:keysym keysym) + (setf image (getf images (case (sdl2:scancode keysym) + (:scancode-up :up) + (:scancode-down :down) + (:scancode-left :left) + (:scancode-right :right) + (t :default))))) + (:idle () + (sdl2:blit-surface image nil screen-surface nil) + (sdl2:update-window window) + ;; reduce cpu usage + (sdl2:delay 100))) + ;; clean up + (mapc #'sdl2:free-surface (remove-if #'symbolp images))))) diff --git a/05-optimized-surface-loading-and-soft-stretching.lisp b/05-optimized-surface-loading-and-soft-stretching.lisp new file mode 100644 index 0000000..e285037 --- /dev/null +++ b/05-optimized-surface-loading-and-soft-stretching.lisp @@ -0,0 +1,41 @@ +(defpackage #:sdl2-tutorial-05-optimized-surface-loading-and-soft-stretching + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) + +(in-package :sdl2-tutorial-05-optimized-surface-loading-and-soft-stretching) + +(defparameter *screen-width* 640) +(defparameter *screen-height* 480) + +(defmacro with-window-surface ((window surface) &body body) + `(sdl2:with-init (:video) + (sdl2:with-window (,window + :title "SDL2 Tutorial 05" + :w *screen-width* + :h *screen-height* + :flags '(:shown)) + (let ((,surface (sdl2:get-window-surface ,window))) + ,@body)))) + +(defun load-surface (pathname pixel-format) + (let ((image (sdl2:load-bmp pathname))) + (if (autowrap:wrapper-null-p image) + (error "cannot load image ~a (check that file exists)" pathname) + (sdl2:convert-surface-format image pixel-format)))) + +(defun run () + (with-window-surface (window screen-surface) + (let ((image-surface (load-surface (asset-pathname #P"./assets/05/stretch.bmp") + (sdl2:surface-format-format screen-surface))) + (rect (sdl2:make-rect 0 0 *screen-width* *screen-height*))) + (sdl2:with-event-loop (:method :poll) + (:quit () t) + (:idle () + (sdl2:blit-scaled image-surface + nil + screen-surface + rect) + (sdl2:update-window window))) + ;; clean up + (sdl2:free-surface image-surface)))) diff --git a/06-extension-libraries-and-loading-other-image-formats.lisp b/06-extension-libraries-and-loading-other-image-formats.lisp new file mode 100644 index 0000000..ce40cc6 --- /dev/null +++ b/06-extension-libraries-and-loading-other-image-formats.lisp @@ -0,0 +1,40 @@ +(defpackage #:sdl2-tutorial-06-extension-libraries-and-loading-other-image-formats + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) + +(in-package :sdl2-tutorial-06-extension-libraries-and-loading-other-image-formats) + +(defparameter *screen-width* 640) +(defparameter *screen-height* 480) + +(defmacro with-window-surface ((window surface) &body body) + `(sdl2:with-init (:video) + (sdl2:with-window (,window + :title "SDL2 Tutorial 06" + :w *screen-width* + :h *screen-height* + :flags '(:shown)) + (let ((,surface (sdl2:get-window-surface ,window))) + (sdl2-image:init '(:png)) + ,@body + (sdl2-image:quit))))) + +(defun load-surface (pathname pixel-format) + (let ((surface (sdl2-image:load-image pathname))) + (prog1 (sdl2:convert-surface-format surface pixel-format) + (sdl2:free-surface surface)))) + +(defun run () + (with-window-surface (window screen-surface) + (let ((image-surface (load-surface (asset-pathname #P"assets/06/loaded.png") + (sdl2:surface-format-format screen-surface))) + (rect (sdl2:make-rect 0 0 *screen-width* *screen-height*))) + (sdl2:with-event-loop (:method :poll) + (:quit () t) + (:idle () + (sdl2:blit-scaled image-surface nil screen-surface rect) + (sdl2:update-window window))) + + ;; cleanup + (sdl2:free-surface image-surface)))) diff --git a/7/main.lisp b/07-texture-loading-and-rendering.lisp similarity index 51% rename from 7/main.lisp rename to 07-texture-loading-and-rendering.lisp index 833491c..eded968 100644 --- a/7/main.lisp +++ b/07-texture-loading-and-rendering.lisp @@ -1,8 +1,9 @@ -(defpackage #:sdl2-tutorial-7 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-07-texture-loading-and-rendering + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) -(in-package :sdl2-tutorial-7) +(in-package :sdl2-tutorial-07-texture-loading-and-rendering) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -10,24 +11,30 @@ (defmacro with-window-renderer ((window renderer) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 07" :w *screen-width* :h *screen-height* :flags '(:shown)) (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) - ,@body)))) + ,@body)))) -(defun load-texture (renderer filename) - (sdl2:create-texture-from-surface renderer (sdl2-image:load-image filename))) -(defun main() +(defun load-texture (renderer pathname) + (let ((surface (sdl2-image:load-image pathname))) + (prog1 (sdl2:create-texture-from-surface renderer surface) + (sdl2:free-surface surface)))) + +(defun run () (with-window-renderer (window renderer) (sdl2-image:init '(:png)) (sdl2:set-render-draw-color renderer #xFF #xFF #xFF #xFF) - (let ((texture (load-texture renderer "7/texture.png"))) + (let ((texture (load-texture renderer (asset-pathname #P"./assets/07/texture.png")))) (sdl2:with-event-loop (:method :poll) (:quit () t) (:idle () (sdl2:render-clear renderer) (sdl2:render-copy renderer texture) - (sdl2:render-present renderer)))))) + (sdl2:render-present renderer))) + + ;; clean up + (sdl2:destroy-texture texture)))) diff --git a/08-geometry-rendering.lisp b/08-geometry-rendering.lisp new file mode 100644 index 0000000..976b6bc --- /dev/null +++ b/08-geometry-rendering.lisp @@ -0,0 +1,60 @@ +(defpackage #:sdl2-tutorial-08-geometry-rendering + (:use :cl) + (:export :run)) + +(in-package :sdl2-tutorial-08-geometry-rendering) + +(defparameter *screen-width* 640) +(defparameter *screen-height* 480) + +(defmacro with-window-renderer ((window renderer) &body body) + `(sdl2:with-init (:video) + (sdl2:with-window (,window + :title "SDL2 Tutorial 08" + :w *screen-width* + :h *screen-height* + :flags '(:shown)) + (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) + ,@body)))) + +(defun run () + (with-window-renderer (window renderer) + (sdl2-image:init '(:png)) + (sdl2:with-event-loop (:method :poll) + (:quit () t) + (:idle () + ;; Clear screen + (sdl2:set-render-draw-color renderer #xFF #xFF #xFF #xFF) + (sdl2:render-clear renderer) + + ;; Render red filled quad + (sdl2:with-rects ((fill-rect (/ *screen-width* 4) + (/ *screen-height* 4) + (/ *screen-width* 2) + (/ *screen-height* 2))) + (sdl2:set-render-draw-color renderer #xFF #x00 #x00 #xFF) + (sdl2:render-fill-rect renderer fill-rect)) + + ;; Render green outlined quad + (sdl2:with-rects ((outline-rect (round (/ *screen-width* 6)) + (round (/ *screen-height* 8)) + (round (* 2/3 *screen-width*)) + (round (* 2/3 *screen-height*)))) + (sdl2:set-render-draw-color renderer #x00 #xFF #x00 #xFF) + (sdl2:render-draw-rect renderer outline-rect)) + + ;; Draw blue horizontal line + (sdl2:set-render-draw-color renderer #x00 #x00 #xFF #xFF) + (sdl2:render-draw-line renderer + 0 + (/ *screen-height* 2) + *screen-width* + (/ *screen-height* 2)) + + ;; Draw vertical line of yellow dots + (sdl2:set-render-draw-color renderer #xFF #xFF #x00 #xFF) + (loop for i from 0 below *screen-height* by 4 + do (sdl2::render-draw-point renderer (/ *screen-width* 2) i)) + + ;; Update screen + (sdl2:render-present renderer))))) diff --git a/09-the-viewport.lisp b/09-the-viewport.lisp new file mode 100644 index 0000000..e05484e --- /dev/null +++ b/09-the-viewport.lisp @@ -0,0 +1,62 @@ +(defpackage #:sdl2-tutorial-09-the-viewport + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) + +(in-package :sdl2-tutorial-09-the-viewport) + +(defparameter *screen-width* 640) +(defparameter *screen-height* 480) + +(defmacro with-window-renderer ((window renderer) &body body) + `(sdl2:with-init (:video) + (sdl2:with-window (,window + :title "SDL2 Tutorial 09" + :w *screen-width* + :h *screen-height* + :flags '(:shown)) + (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) + ,@body)))) + +(defun load-texture (renderer pathname) + (let ((surface (sdl2-image:load-image pathname))) + (prog1 (sdl2:create-texture-from-surface renderer surface) + (sdl2:free-surface surface)))) + +(defun run () + (with-window-renderer (window renderer) + (sdl2-image:init '(:png)) + + (let ((texture (load-texture renderer (asset-pathname #P"assets/09/texture.png")))) + (sdl2:with-event-loop (:method :poll) + (:quit () t) + (:idle () + ;; Clear screen + (sdl2:set-render-draw-color renderer #xFF #xFF #xFF #xFF) + (sdl2:render-clear renderer) + + ;; Top left corner viewport + (sdl2:with-rects ((top-left-viewport 0 + 0 + (/ *screen-width* 2) + (/ *screen-height* 2)) + (top-right-viewport (/ *screen-width* 2) + 0 + (/ *screen-width* 2) + (/ *screen-height* 2)) + (bottom-viewport 0 + (/ *screen-height* 2) + *screen-width* + (/ *screen-height* 2))) + (sdl2:render-set-viewport renderer top-left-viewport) + (sdl2:render-copy renderer texture) ; Render texture to screen + + (sdl2:render-set-viewport renderer top-right-viewport) + (sdl2:render-copy renderer texture) + + (sdl2:render-set-viewport renderer bottom-viewport) + (sdl2:render-copy renderer texture)) + + (sdl2:render-present renderer))) + ;; cleanup + (sdl2:destroy-texture texture)))) diff --git a/1/main.lisp b/1/main.lisp deleted file mode 100644 index 7be644b..0000000 --- a/1/main.lisp +++ /dev/null @@ -1,21 +0,0 @@ -(defpackage #:sdl2-tutorial-1 - (:use :common-lisp) - (:export :main)) - -(in-package :sdl2-tutorial-1) - -(defparameter *screen-width* 640) -(defparameter *screen-height* 480) - -(defun main(&key (delay 2000)) - (sdl2:with-init (:video) - (sdl2:with-window (window :title "SDL2 Window" :w *screen-width* :h *screen-height*) - (let ((screen-surface (sdl2:get-window-surface window))) - (sdl2:fill-rect screen-surface - nil - (sdl2:map-rgb (sdl2:surface-format screen-surface) 255 255 255)) - (sdl2:update-window window) - (sdl2:with-event-loop (:method :poll) - (:quit () t) - (:idle () - (sdl2:delay delay))))))) diff --git a/10/main.lisp b/10-color-keying.lisp similarity index 54% rename from 10/main.lisp rename to 10-color-keying.lisp index 4c9d341..dac4510 100644 --- a/10/main.lisp +++ b/10-color-keying.lisp @@ -1,8 +1,9 @@ -(defpackage #:sdl2-tutorial-10 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-10-color-keying + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) -(in-package :sdl2-tutorial-10) +(in-package :sdl2-tutorial-10-color-keying) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -18,18 +19,22 @@ :accessor tex-height :initform 0) (texture - :accessor tex-texture :initform nil))) -(defun load-texture-from-file (renderer filename) +(defun free-tex (tex) + (with-slots (texture) tex + (sdl2:destroy-texture texture))) + +(defun load-texture-from-file (renderer pathname) (let ((tex (make-instance 'tex :renderer renderer))) (with-slots (renderer texture width height) tex - (let ((surface (sdl2-image:load-image filename))) + (let ((surface (sdl2-image:load-image pathname))) (setf width (sdl2:surface-width surface)) (setf height (sdl2:surface-height surface)) (sdl2:set-color-key surface :true (sdl2:map-rgb (sdl2:surface-format surface) 0 #xFF #xFF)) - (setf texture (sdl2:create-texture-from-surface renderer surface)))) + (setf texture (sdl2:create-texture-from-surface renderer surface)) + (sdl2:free-surface surface))) tex)) (defun render (tex x y) @@ -39,28 +44,28 @@ (defmacro with-window-renderer ((window renderer) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 10" :w *screen-width* :h *screen-height* :flags '(:shown)) (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) - ,@body)))) - -(defun load-texture (renderer filename) - (sdl2:create-texture-from-surface renderer (sdl2-image:load-image filename))) + ,@body)))) -(defun main() +(defun run() (with-window-renderer (window renderer) (sdl2-image:init '(:png)) - (let ((background-tex (load-texture-from-file renderer "10/background.png")) - (player-tex (load-texture-from-file renderer "10/player.png"))) - (sdl2:with-event-loop (:method :poll) - (:quit () t) - (:idle () - (sdl2:set-render-draw-color renderer #xFF #xFF #xFF #xFF) - (sdl2:render-clear renderer) + (let ((background-tex (load-texture-from-file renderer (asset-pathname #P"assets/10/background.png"))) + (player-tex (load-texture-from-file renderer (asset-pathname #P"assets/10/player.png")))) + (sdl2:with-event-loop () + (:quit () t) + (:idle () + (sdl2:set-render-draw-color renderer #xFF #xFF #xFF #xFF) + (sdl2:render-clear renderer) - (render background-tex 0 0) - (render player-tex 240 190) + (render background-tex 0 0) + (render player-tex 240 190) - (sdl2:render-present renderer)))))) + (sdl2:render-present renderer))) + ;; clean up + (free-tex background-tex) + (free-tex player-tex)))) diff --git a/11/main.lisp b/11-clip-rendering-and-sprite-sheets.lisp similarity index 55% rename from 11/main.lisp rename to 11-clip-rendering-and-sprite-sheets.lisp index d4ff3f8..79e4d43 100644 --- a/11/main.lisp +++ b/11-clip-rendering-and-sprite-sheets.lisp @@ -1,8 +1,9 @@ -(defpackage #:sdl2-tutorial-11 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-11-clip-rendering-and-sprite-sheets + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) -(in-package :sdl2-tutorial-11) +(in-package :sdl2-tutorial-11-clip-rendering-and-sprite-sheets) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -21,15 +22,16 @@ :accessor tex-texture :initform nil))) -(defun load-texture-from-file (renderer filename) +(defun load-texture-from-file (renderer pathname) (let ((tex (make-instance 'tex :renderer renderer))) (with-slots (renderer texture width height) tex - (let ((surface (sdl2-image:load-image filename))) + (let ((surface (sdl2-image:load-image pathname))) (setf width (sdl2:surface-width surface)) (setf height (sdl2:surface-height surface)) (sdl2:set-color-key surface :true (sdl2:map-rgb (sdl2:surface-format surface) 0 #xFF #xFF)) - (setf texture (sdl2:create-texture-from-surface renderer surface)))) + (setf texture (sdl2:create-texture-from-surface renderer surface)) + (sdl2:free-surface surface))) tex)) (defun render (tex x y &key clip) @@ -45,46 +47,45 @@ (defmacro with-window-renderer ((window renderer) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 11" :w *screen-width* :h *screen-height* :flags '(:shown)) (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) ,@body)))) -(defun main() +(defun run () (with-window-renderer (window renderer) (sdl2-image:init '(:png)) - (let ((spritesheet-tex (load-texture-from-file renderer "11/spritesheet.png")) - (sprite-clips '(:top-left (0 0 100 100) - :top-right (100 0 100 100) - :bottom-left (0 100 100 100) - :bottom-right (100 100 100 100)))) + (let ((spritesheet-tex (load-texture-from-file renderer (asset-pathname #P"assets/11/spritesheet.png"))) + (top-left (sdl2:make-rect 0 0 100 100)) + (top-right (sdl2:make-rect 100 0 100 100)) + (bottom-left (sdl2:make-rect 0 100 100 100)) + (bottom-right (sdl2:make-rect 100 100 100 100))) (sdl2:with-event-loop (:method :poll) (:quit () t) (:idle () (sdl2:set-render-draw-color renderer #xFF #xFF #xFF #xFF) (sdl2:render-clear renderer) - (let ((rect (apply #'sdl2::make-rect (getf sprite-clips :top-left)))) - (render spritesheet-tex 0 0 :clip rect)) + (render spritesheet-tex + 0 + 0 + :clip top-left) - (let ((rect (apply #'sdl2::make-rect (getf sprite-clips :top-right)))) - (render spritesheet-tex - (- *screen-width* (sdl2:rect-width rect)) - 0 - :clip rect)) + (render spritesheet-tex + (- *screen-width* (sdl2:rect-width top-right)) + 0 + :clip top-right) - (let ((rect (apply #'sdl2::make-rect (getf sprite-clips :bottom-left)))) - (render spritesheet-tex - 0 - (- *screen-height* (sdl2:rect-height rect)) - :clip rect)) + (render spritesheet-tex + 0 + (- *screen-height* (sdl2:rect-height bottom-left)) + :clip bottom-left) - (let ((rect (apply #'sdl2::make-rect (getf sprite-clips :bottom-right)))) - (render spritesheet-tex - (- *screen-width* (sdl2:rect-width rect)) - (- *screen-height* (sdl2:rect-height rect)) - :clip rect)) + (render spritesheet-tex + (- *screen-width* (sdl2:rect-width bottom-right)) + (- *screen-height* (sdl2:rect-height bottom-right)) + :clip bottom-right) (sdl2:render-present renderer)))))) diff --git a/12/main.lisp b/12-color-modulation.lisp similarity index 89% rename from 12/main.lisp rename to 12-color-modulation.lisp index d6c803f..bcfa908 100644 --- a/12/main.lisp +++ b/12-color-modulation.lisp @@ -1,8 +1,9 @@ -(defpackage #:sdl2-tutorial-12 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-12-color-modulation + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) -(in-package :sdl2-tutorial-12) +(in-package #:sdl2-tutorial-12-color-modulation) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -48,7 +49,7 @@ (defmacro with-window-renderer ((window renderer) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 12" :w *screen-width* :h *screen-height* :flags '(:shown)) @@ -64,10 +65,10 @@ (defmacro clamp-decf (x delta) `(setf ,x (clamp (- ,x ,delta)))) -(defun main() +(defun run () (with-window-renderer (window renderer) (sdl2-image:init '(:png)) - (let ((texture (load-texture-from-file renderer "12/texture.png")) + (let ((texture (load-texture-from-file renderer (asset-pathname #P"assets/12/texture.png"))) (r 255) (g 255) (b 255) diff --git a/13/main.lisp b/13-alpha-blending.lisp similarity index 86% rename from 13/main.lisp rename to 13-alpha-blending.lisp index 0f62a18..2b74747 100644 --- a/13/main.lisp +++ b/13-alpha-blending.lisp @@ -1,8 +1,9 @@ -(defpackage #:sdl2-tutorial-13 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-13-alpha-blending + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) -(in-package :sdl2-tutorial-13) +(in-package #:sdl2-tutorial-13-alpha-blending) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -54,7 +55,7 @@ (defmacro with-window-renderer ((window renderer) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 13" :w *screen-width* :h *screen-height* :flags '(:shown)) @@ -70,11 +71,11 @@ (defmacro clamp-decf (x delta) `(setf ,x (clamp (- ,x ,delta)))) -(defun main() +(defun run () (with-window-renderer (window renderer) (sdl2-image:init '(:png)) - (let ((bg-texture (load-texture-from-file renderer "13/fadein.png")) - (modulated-texture (load-texture-from-file renderer "13/fadeout.png")) + (let ((bg-texture (load-texture-from-file renderer (asset-pathname "assets/13/fadein.png"))) + (modulated-texture (load-texture-from-file renderer (asset-pathname "assets/13/fadeout.png"))) (alpha 255) (delta 32)) (set-blend-mode modulated-texture :blend) diff --git a/14/main.lisp b/14-animated-sprites-and-vsync.lisp similarity index 89% rename from 14/main.lisp rename to 14-animated-sprites-and-vsync.lisp index 05def6b..428617a 100644 --- a/14/main.lisp +++ b/14-animated-sprites-and-vsync.lisp @@ -1,8 +1,9 @@ -(defpackage #:sdl2-tutorial-14 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-14-animated-sprites-and-vsync + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) -(in-package :sdl2-tutorial-14) +(in-package #:sdl2-tutorial-14-animated-sprites-and-vsync) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -54,7 +55,7 @@ (defmacro with-window-renderer ((window renderer) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 14" :w *screen-width* :h *screen-height* :flags '(:shown)) @@ -70,10 +71,10 @@ (defmacro clamp-decf (x delta) `(setf ,x (clamp (- ,x ,delta)))) -(defun main() +(defun run () (with-window-renderer (window renderer) (sdl2-image:init '(:png)) - (let ((spritesheet-tex (load-texture-from-file renderer "14/character.png")) + (let ((spritesheet-tex (load-texture-from-file renderer (asset-pathname "assets/14/character.png"))) (clip (sdl2:make-rect 0 0 64 96)) (sprite-frames 4) (current-sprite-frame 0) diff --git a/15/main.lisp b/15-rotation-and-flipping.lisp similarity index 89% rename from 15/main.lisp rename to 15-rotation-and-flipping.lisp index 99699a0..9d980e8 100644 --- a/15/main.lisp +++ b/15-rotation-and-flipping.lisp @@ -1,8 +1,9 @@ -(defpackage #:sdl2-tutorial-15 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-15-rotation-and-flipping + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) -(in-package :sdl2-tutorial-15) +(in-package #:sdl2-tutorial-15-rotation-and-flipping) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -51,17 +52,17 @@ (defmacro with-window-renderer ((window renderer) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 15" :w *screen-width* :h *screen-height* :flags '(:shown)) (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) ,@body)))) -(defun main() +(defun run () (with-window-renderer (window renderer) (sdl2-image:init '(:png)) - (let ((texture (load-texture-from-file renderer "15/arrow.png")) + (let ((texture (load-texture-from-file renderer (asset-pathname "assets/15/arrow.png"))) (flip :none) (degrees 0) (delta 60)) diff --git a/16/main.lisp b/16-true-type-fonts.lisp similarity index 83% rename from 16/main.lisp rename to 16-true-type-fonts.lisp index 367933f..82d328d 100644 --- a/16/main.lisp +++ b/16-true-type-fonts.lisp @@ -1,8 +1,9 @@ -(defpackage #:sdl2-tutorial-16 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-16-true-type-fonts + (:use :cl) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) -(in-package :sdl2-tutorial-16) +(in-package #:sdl2-tutorial-16-true-type-fonts) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -23,6 +24,10 @@ :accessor tex-texture :initform nil))) +(defun free-tex (tex) + (with-slots (texture) tex + (sdl2:destroy-texture texture))) + (defun load-texture-from-file (renderer filename) (let ((tex (make-instance 'tex :renderer renderer))) (with-slots (renderer texture width height) tex @@ -46,7 +51,7 @@ (defun set-color (tex r g b) (sdl2:set-texture-color-mod (tex-texture tex) r g b)) -(defun render (tex x y &key clip angle center flip) +(defun render (tex x y &key clip angle center (flip :none)) (with-slots (renderer texture width height) tex (sdl2:render-copy-ex renderer texture @@ -62,18 +67,18 @@ (defmacro with-window-renderer ((window renderer) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 16" :w *screen-width* :h *screen-height* :flags '(:shown)) (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) ,@body)))) -(defun main() +(defun run () (with-window-renderer (window renderer) (sdl2-image:init '(:png)) (sdl2-ttf:init) - (setf *font* (sdl2-ttf:open-font "16/Pacifico.ttf" 28)) + (setf *font* (sdl2-ttf:open-font (asset-pathname "assets/16/Pacifico.ttf") 28)) (let ((texture (load-texture-from-text renderer "The quick brown fox jumps over the lazy dog"))) (sdl2:with-event-loop (:method :poll) (:quit () t) @@ -83,6 +88,8 @@ (render texture (round (/ (- *screen-width* (tex-width texture)) 2)) (round (/ (- *screen-height* (tex-height texture)) 2))) - (sdl2:render-present renderer)))) + (sdl2:render-present renderer))) + ;; clean up + (free-tex texture)) (sdl2-ttf:quit) (sdl2-image:quit))) diff --git a/2/main.lisp b/2/main.lisp deleted file mode 100644 index 411891f..0000000 --- a/2/main.lisp +++ /dev/null @@ -1,30 +0,0 @@ -(defpackage #:sdl2-tutorial-2 - (:use :common-lisp) - (:export :main)) - -(in-package :sdl2-tutorial-2) - -(defparameter *screen-width* 640) -(defparameter *screen-height* 480) - -(defmacro with-window-surface ((window surface) &body body) - `(sdl2:with-init (:video) - (sdl2:with-window (,window - :title "SDL2 Tutorial" - :w *screen-width* - :h *screen-height* - :flags '(:shown)) - (let ((,surface (sdl2:get-window-surface ,window))) - ,@body)))) - -(defun main(&key (delay 2000)) - (with-window-surface (window screen-surface) - (sdl2:blit-surface (sdl2:load-bmp "2/hello_world.bmp") - nil - screen-surface - nil) - (sdl2:update-window window) - (sdl2:with-event-loop (:method :poll) - (:quit () t) - (:idle () - (sdl2:delay delay))))) diff --git a/3/main.lisp b/3/main.lisp deleted file mode 100644 index 17d6354..0000000 --- a/3/main.lisp +++ /dev/null @@ -1,28 +0,0 @@ -(defpackage #:sdl2-tutorial-3 - (:use :common-lisp) - (:export :main)) - -(in-package :sdl2-tutorial-3) - -(defparameter *screen-width* 640) -(defparameter *screen-height* 480) - -(defmacro with-window-surface ((window surface) &body body) - `(sdl2:with-init (:video) - (sdl2:with-window (,window - :title "SDL2 Tutorial" - :w *screen-width* - :h *screen-height* - :flags '(:shown)) - (let ((,surface (sdl2:get-window-surface ,window))) - ,@body)))) - -(defun main() - (with-window-surface (window screen-surface) - (let ((image (sdl2:load-bmp "3/exit.bmp"))) - (sdl2:with-event-loop (:method :poll) - (:quit () t) - (:idle () - (sdl2:blit-surface image nil screen-surface nil) - (sdl2:update-window window) - (sdl2:delay 100)))))) ;reduce cpu usage diff --git a/4/main.lisp b/4/main.lisp deleted file mode 100644 index 8ca43c2..0000000 --- a/4/main.lisp +++ /dev/null @@ -1,43 +0,0 @@ -(defpackage #:sdl2-tutorial-4 - (:use :common-lisp) - (:export :main)) - -(in-package :sdl2-tutorial-4) - -(defparameter *screen-width* 640) -(defparameter *screen-height* 480) - -(defmacro with-window-surface ((window surface) &body body) - `(sdl2:with-init (:video) - (sdl2:with-window (,window - :title "SDL2 Tutorial" - :w *screen-width* - :h *screen-height* - :flags '(:shown)) - (let ((,surface (sdl2:get-window-surface ,window))) - ,@body)))) - -(defun load-media () - (list :default (sdl2:load-bmp "4/press.bmp") - :up (sdl2:load-bmp "4/up.bmp") - :down (sdl2:load-bmp "4/down.bmp") - :left (sdl2:load-bmp "4/left.bmp") - :right (sdl2:load-bmp "4/right.bmp"))) - -(defun main() - (with-window-surface (window screen-surface) - (let* ((images (load-media)) - (image (getf images :default))) - (sdl2:with-event-loop (:method :poll) - (:quit () t) - (:keydown (:keysym keysym) - (case (sdl2:scancode keysym) - (:scancode-up (setf image (getf images :up))) - (:scancode-down (setf image (getf images :down))) - (:scancode-left (setf image (getf images :left))) - (:scancode-right (setf image (getf images :right))) - (t (setf image (getf images :default))))) - (:idle () - (sdl2:blit-surface image nil screen-surface nil) - (sdl2:update-window window) - (sdl2:delay 100)))))) ;reduce cpu usage diff --git a/5/main.lisp b/5/main.lisp deleted file mode 100644 index 34fd608..0000000 --- a/5/main.lisp +++ /dev/null @@ -1,34 +0,0 @@ -(defpackage #:sdl2-tutorial-5 - (:use :common-lisp) - (:export :main)) - -(in-package :sdl2-tutorial-5) - -(defparameter *screen-width* 640) -(defparameter *screen-height* 480) - -(defmacro with-window-surface ((window surface) &body body) - `(sdl2:with-init (:video) - (sdl2:with-window (,window - :title "SDL2 Tutorial" - :w *screen-width* - :h *screen-height* - :flags '(:shown)) - (let ((,surface (sdl2:get-window-surface ,window))) - ,@body)))) - -(defun load-surface (filename &optional pixel-format) - (sdl2:convert-surface-format (sdl2:load-bmp filename) pixel-format)) - -(defun main() - (with-window-surface (window screen-surface) - (let ((image-surface (load-surface "5/stretch.bmp" (sdl2:surface-format-format screen-surface))) - (rect (sdl2:make-rect 0 0 *screen-width* *screen-height*))) - (sdl2:with-event-loop (:method :poll) - (:quit () t) - (:idle () - (sdl2:blit-scaled image-surface - nil - screen-surface - rect) - (sdl2:update-window window)))))) diff --git a/6/loaded.png b/6/loaded.png deleted file mode 100644 index 66ee6c6..0000000 Binary files a/6/loaded.png and /dev/null differ diff --git a/6/main.lisp b/6/main.lisp deleted file mode 100644 index d19a729..0000000 --- a/6/main.lisp +++ /dev/null @@ -1,35 +0,0 @@ -(defpackage #:sdl2-tutorial-6 - (:use :common-lisp) - (:export :main)) - -(in-package :sdl2-tutorial-6) - -(defparameter *screen-width* 640) -(defparameter *screen-height* 480) - -(defmacro with-window-surface ((window surface) &body body) - `(sdl2:with-init (:video) - (sdl2:with-window (,window - :title "SDL2 Tutorial" - :w *screen-width* - :h *screen-height* - :flags '(:shown)) - (let ((,surface (sdl2:get-window-surface ,window))) - ,@body)))) - -(defun load-surface (filename &optional pixel-format) - (sdl2:convert-surface-format (sdl2-image:load-image filename) pixel-format)) - -(defun main() - (with-window-surface (window screen-surface) - (sdl2-image:init '(:png)) - (let ((image-surface (load-surface "6/loaded.png" (sdl2:surface-format-format screen-surface))) - (rect (sdl2:make-rect 0 0 *screen-width* *screen-height*))) - (sdl2:with-event-loop (:method :poll) - (:quit () t) - (:idle () - (sdl2:blit-scaled image-surface - nil - screen-surface - rect) - (sdl2:update-window window)))))) diff --git a/8/main.lisp b/8/main.lisp deleted file mode 100644 index 47e4596..0000000 --- a/8/main.lisp +++ /dev/null @@ -1,52 +0,0 @@ -(defpackage #:sdl2-tutorial-8 - (:use :common-lisp) - (:export :main)) - -(in-package :sdl2-tutorial-8) - -(defparameter *screen-width* 640) -(defparameter *screen-height* 480) - -(defmacro with-window-renderer ((window renderer) &body body) - `(sdl2:with-init (:video) - (sdl2:with-window (,window - :title "SDL2 Tutorial" - :w *screen-width* - :h *screen-height* - :flags '(:shown)) - (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) - ,@body)))) - -(defun load-texture (renderer filename) - (sdl2:create-texture-from-surface renderer (sdl2-image:load-image filename))) - -(defun main() - (with-window-renderer (window renderer) - (sdl2-image:init '(:png)) - (sdl2:with-event-loop (:method :poll) - (:quit () t) - (:idle () - (sdl2:set-render-draw-color renderer #xFF #xFF #xFF #xFF) - (sdl2:render-clear renderer) - (sdl2:set-render-draw-color renderer #xFF #x00 #x00 #xFF) - (sdl2:render-fill-rect renderer - (sdl2:make-rect (/ *screen-width* 4) - (/ *screen-height* 4) - (/ *screen-width* 2) - (/ *screen-height* 2))) - (sdl2:set-render-draw-color renderer #x00 #xFF #x00 #xFF) - (sdl2:render-draw-rect renderer - (sdl2:make-rect (round (/ *screen-width* 6)) - (round (/ *screen-height* 8)) - (round (* 2/3 *screen-width*)) - (round (* 2/3 *screen-height*)))) - (sdl2:set-render-draw-color renderer #x00 #x00 #xFF #xFF) - (sdl2:render-draw-line renderer - 0 - (/ *screen-height* 2) - *screen-width* - (/ *screen-height* 2)) - (sdl2:set-render-draw-color renderer #xFF #xFF #x00 #xFF) - (loop for i from 0 below *screen-height* by 4 - do (sdl2::render-draw-point renderer (/ *screen-width* 2) i)) - (sdl2:render-present renderer))))) diff --git a/9/main.lisp b/9/main.lisp deleted file mode 100644 index c640ac7..0000000 --- a/9/main.lisp +++ /dev/null @@ -1,55 +0,0 @@ -(defpackage #:sdl2-tutorial-9 - (:use :common-lisp) - (:export :main)) - -(in-package :sdl2-tutorial-9) - -(defparameter *screen-width* 640) -(defparameter *screen-height* 480) - -(defmacro with-window-renderer ((window renderer) &body body) - `(sdl2:with-init (:video) - (sdl2:with-window (,window - :title "SDL2 Tutorial" - :w *screen-width* - :h *screen-height* - :flags '(:shown)) - (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) - ,@body)))) - -(defun load-texture (renderer filename) - (sdl2:create-texture-from-surface renderer (sdl2-image:load-image filename))) - -(defun main() - (with-window-renderer (window renderer) - (sdl2-image:init '(:png)) - - (let ((texture (load-texture renderer "9/texture.png"))) - (sdl2:with-event-loop (:method :poll) - (:quit () t) - (:idle () - (sdl2:set-render-draw-color renderer #xFF #xFF #xFF #xFF) - (sdl2:render-clear renderer) - - (sdl2:render-set-viewport renderer - (sdl2:make-rect 0 - 0 - (/ *screen-width* 2) - (/ *screen-height* 2))) - (sdl2:render-copy renderer texture) - - (sdl2:render-set-viewport renderer - (sdl2:make-rect (/ *screen-width* 2) - 0 - (/ *screen-width* 2) - (/ *screen-height* 2))) - (sdl2:render-copy renderer texture) - - (sdl2:render-set-viewport renderer - (sdl2:make-rect 0 - (/ *screen-height* 2) - *screen-width* - (/ *screen-height* 2))) - (sdl2:render-copy renderer texture) - - (sdl2:render-present renderer)))))) diff --git a/README.md b/README.md index 62a10c1..ea28450 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,50 @@ +![ci](https://github.com/TatriX/cl-sdl2-tutorial/actions/workflows/ci.yml/badge.svg) + # Common Lisp SDL2 tutorials Adapted from http://lazyfoo.net/tutorials/SDL/ - ## Installing the SDL2 Libraries The tutorial requires that SDL2, SDL2 Image, and SDL2 TTF are installed before running the examples. -### Mac OS X - -Mac OS X requires each library to be downloaded and copied to -$HOME/Library/Frameworks or /Library/Frameworks. - - Library Name | Download Link - ------------ | ------------- - SDL2 | https://www.libsdl.org/download-2.0.php - SDL2 Image | https://www.libsdl.org/projects/SDL_image - SDL2 TTF | https://www.libsdl.org/projects/SDL_ttf - -Running the tutorials will cause Catalina to report that the framework cannot be -opened because the developer cannot be verified. The workaround for this problem -is the following: + See instructions for [Linux](README_LINUX.md) and [macOS](README_MACOS.md) respectively. -1. Navigate to System Preferences -> Security & Privacy -> General on the Mac -2. Run repl.sh +## Installation -3. When the dialog appears about the developer not being verified, click the -"Cancel" button. +Using [quicklisp](https://www.quicklisp.org/beta/): +``` +git clone https://github.com/TatriX/cl-sdl2-tutorial/ ~/quicklisp/local-projects +``` -4. Examine the Security & Privacy screen for a button called "Allow Anyway" for -the framework. Click the "Allow Anyway" button with the identified framework. +```lisp +(ql:quickload :sdl2-tutorial) +``` -5. The verification dialog will now appear a second time, but there will be an -option to "Open" the framework. Click "Open". - -6. Repeat steps 3 through 5 for the different frameworks. - -### Linux - -The SDL2 libraries can be installed on a Debian based system with the command -below. - - apt install libsdl2-2.0 libsdl2-image-2.0 libsdl2-ttf-2.0 +or [asdf](https://common-lisp.net/project/asdf/) +``` +git clone https://github.com/TatriX/cl-sdl2-tutorial/ ~/common-lisp +``` +```lisp +(asdf:load-system "sdl2-tutorial") +``` ## Running the Examples -A repl.sh script is provided that loads SDL2-TUTORIAL with quicklisp and then -starts up a swank thread on port 4005 for repl connections. - - 1. ./repl.sh - 2. (sdl2-tutorial:main #'sdl2-tutorial-1:main) +Tutorial packages are named as `sdl2-tutorial-XX-DESC` +where `XX` is a number starting from `01`. + +```lisp +(sdl2-tutorial-01-hello-sdl:run) +;; +(sdl2-tutorial-04-key-presses:run) +``` + +## Notes +As far as I can tell `cl-sdl2` in most cases doesn't free created +objects. This means it's up to a user to do so. I've tried to free +allocated resources, but as with any manual memory management I could +miss something. If you notice anything, please create an issue or even +send a PR! diff --git a/README_LINUX.md b/README_LINUX.md new file mode 100644 index 0000000..704be81 --- /dev/null +++ b/README_LINUX.md @@ -0,0 +1,12 @@ +## Installing the SDL2 Libraries Linux + +## Debian + +The SDL2 libraries can be installed on a Debian based system with the command +below. + + apt install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev + +## Arch + + sudo pacman -S sdl2 sdl2_image sdl2_ttf diff --git a/README_MACOS.md b/README_MACOS.md new file mode 100644 index 0000000..a7a6dd1 --- /dev/null +++ b/README_MACOS.md @@ -0,0 +1,29 @@ +### Mac OS X + +Mac OS X requires each library to be downloaded and copied to +$HOME/Library/Frameworks or /Library/Frameworks. + + Library Name | Download Link + ------------ | ------------- + SDL2 | https://www.libsdl.org/download-2.0.php + SDL2 Image | https://www.libsdl.org/projects/SDL_image + SDL2 TTF | https://www.libsdl.org/projects/SDL_ttf + +Running the tutorials will cause Catalina to report that the framework cannot be +opened because the developer cannot be verified. The workaround for this problem +is the following: + +1. Navigate to System Preferences -> Security & Privacy -> General on the Mac + +2. Run repl.sh + +3. When the dialog appears about the developer not being verified, click the +"Cancel" button. + +4. Examine the Security & Privacy screen for a button called "Allow Anyway" for +the framework. Click the "Allow Anyway" button with the identified framework. + +5. The verification dialog will now appear a second time, but there will be an +option to "Open" the framework. Click "Open". + +6. Repeat steps 3 through 5 for the different frameworks. diff --git a/2/hello_world.bmp b/assets/02/hello_world.bmp similarity index 100% rename from 2/hello_world.bmp rename to assets/02/hello_world.bmp diff --git a/3/exit.bmp b/assets/03/exit.bmp similarity index 100% rename from 3/exit.bmp rename to assets/03/exit.bmp diff --git a/4/down.bmp b/assets/04/down.bmp similarity index 100% rename from 4/down.bmp rename to assets/04/down.bmp diff --git a/4/left.bmp b/assets/04/left.bmp similarity index 100% rename from 4/left.bmp rename to assets/04/left.bmp diff --git a/4/press.bmp b/assets/04/press.bmp similarity index 100% rename from 4/press.bmp rename to assets/04/press.bmp diff --git a/4/right.bmp b/assets/04/right.bmp similarity index 100% rename from 4/right.bmp rename to assets/04/right.bmp diff --git a/4/up.bmp b/assets/04/up.bmp similarity index 100% rename from 4/up.bmp rename to assets/04/up.bmp diff --git a/5/stretch.bmp b/assets/05/stretch.bmp similarity index 50% rename from 5/stretch.bmp rename to assets/05/stretch.bmp index 3d3b153..8457f19 100644 Binary files a/5/stretch.bmp and b/assets/05/stretch.bmp differ diff --git a/assets/06/loaded.png b/assets/06/loaded.png new file mode 100644 index 0000000..0618717 Binary files /dev/null and b/assets/06/loaded.png differ diff --git a/7/texture.png b/assets/07/texture.png similarity index 100% rename from 7/texture.png rename to assets/07/texture.png diff --git a/9/texture.png b/assets/09/texture.png similarity index 100% rename from 9/texture.png rename to assets/09/texture.png diff --git a/10/background.png b/assets/10/background.png similarity index 100% rename from 10/background.png rename to assets/10/background.png diff --git a/10/player.png b/assets/10/player.png similarity index 100% rename from 10/player.png rename to assets/10/player.png diff --git a/11/spritesheet.png b/assets/11/spritesheet.png similarity index 100% rename from 11/spritesheet.png rename to assets/11/spritesheet.png diff --git a/12/texture.png b/assets/12/texture.png similarity index 100% rename from 12/texture.png rename to assets/12/texture.png diff --git a/13/fadein.png b/assets/13/fadein.png similarity index 100% rename from 13/fadein.png rename to assets/13/fadein.png diff --git a/13/fadeout.png b/assets/13/fadeout.png similarity index 100% rename from 13/fadeout.png rename to assets/13/fadeout.png diff --git a/14/character.png b/assets/14/character.png similarity index 100% rename from 14/character.png rename to assets/14/character.png diff --git a/15/arrow.png b/assets/15/arrow.png similarity index 100% rename from 15/arrow.png rename to assets/15/arrow.png diff --git a/16/Pacifico.ttf b/assets/16/Pacifico.ttf similarity index 100% rename from 16/Pacifico.ttf rename to assets/16/Pacifico.ttf diff --git a/repl.sh b/repl.sh deleted file mode 100755 index 1293363..0000000 --- a/repl.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -sbcl --eval "(ql:quickload \"sdl2-tutorial\")" \ - --eval "(sdl2-tutorial:create-swank-server)" diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index f72be9c..7350e3a 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -1,22 +1,30 @@ (defsystem "sdl2-tutorial" :description "SDL2 Tutorial based upon http://lazyfoo.net/tutorials/SDL" - :version "0.0.1" + :version "0.2.0" + :author "TatriX " :licence "Public Domain" - :depends-on ("bordeaux-threads" "sdl2" "sdl2-image" "sdl2-ttf" "swank") - :components ((:file "1/main") - (:file "2/main") - (:file "3/main") - (:file "4/main") - (:file "5/main") - (:file "6/main") - (:file "7/main") - (:file "8/main") - (:file "9/main") - (:file "10/main") - (:file "11/main") - (:file "12/main") - (:file "13/main") - (:file "14/main") - (:file "15/main") - (:file "16/main") - (:file "sdl2-tutorial"))) + :depends-on ("bordeaux-threads" "sdl2" "sdl2-image" "sdl2-ttf") + :components ((:file "utils") + (:file "01-hello-sdl") + (:file "02-getting-an-image-on-the-screen") + (:file "03-event-driven-programming") + (:file "04-key-presses") + (:file "05-optimized-surface-loading-and-soft-stretching") + (:file "06-extension-libraries-and-loading-other-image-formats") + (:file "07-texture-loading-and-rendering") + (:file "08-geometry-rendering") + (:file "09-the-viewport") + (:file "10-color-keying") + (:file "11-clip-rendering-and-sprite-sheets") + (:file "12-color-modulation") + (:file "13-alpha-blending") + (:file "14-animated-sprites-and-vsync") + (:file "15-rotation-and-flipping") + (:file "16-true-type-fonts")) + :in-order-to ((test-op (test-op "sdl2-tutorial/tests")))) + + +(defsystem "sdl2-tutorial/tests" + :depends-on ("parachute") + :components ((:file "tests/tests")) + :perform (test-op (op c) (symbol-call :parachute :test :sdl2-tutorial-tests))) diff --git a/sdl2-tutorial.lisp b/sdl2-tutorial.lisp deleted file mode 100644 index 7346b9c..0000000 --- a/sdl2-tutorial.lisp +++ /dev/null @@ -1,11 +0,0 @@ -(defpackage :sdl2-tutorial - (:use cl bt) - (:export :main :create-swank-server)) - -(in-package :sdl2-tutorial) - -(defun create-swank-server() - (bt:make-thread (lambda () (swank:create-server :port 4005 :dont-close t)))) - -(defun main(fn) - (sdl2:make-this-thread-main fn)) diff --git a/tests/test.ros b/tests/test.ros new file mode 100755 index 0000000..9410a3e --- /dev/null +++ b/tests/test.ros @@ -0,0 +1,17 @@ +#!/bin/sh +#|-*- mode:lisp -*-|# +#| +exec ros -Q -- $0 "$@" +|# +(progn ;;init forms + (ros:ensure-asdf) + #+quicklisp(ql:quickload '(sdl2-tutorial sdl2-tutorial/tests) :silent t)) + +(defpackage :ros.script.test + (:use :cl)) +(in-package :ros.script.test) + +(defun main (&rest argv) + (declare (ignorable argv)) + (parachute:test-toplevel :sdl2-tutorial-tests)) +;;; vim: set ft=lisp lisp: diff --git a/tests/tests.lisp b/tests/tests.lisp new file mode 100644 index 0000000..f735303 --- /dev/null +++ b/tests/tests.lisp @@ -0,0 +1,7 @@ +(defpackage #:sdl2-tutorial-tests + (:use :cl :parachute)) + +(in-package #:sdl2-tutorial-tests) + +(define-test hello + (true t)) diff --git a/utils.lisp b/utils.lisp new file mode 100644 index 0000000..a1a74c4 --- /dev/null +++ b/utils.lisp @@ -0,0 +1,13 @@ +(defpackage #:sdl2-tutorial-utils + (:use :cl) + (:export :asset-path)) + +(in-package #:sdl2-tutorial-utils) + +(defun asset-pathname (pathname) + "Return an absolute filename for a given PATHNAME relative to +`:sdl2-tutorial' asdf system directory. + +This function doesn't prepend 'assets/' to the PATHNAME to not +interfere with your editor filename completion." + (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial)))