From 763e737e92f2581aa2e9c77b2c3ec68614c0ae9f Mon Sep 17 00:00:00 2001 From: TatriX Date: Tue, 13 Jul 2021 23:41:21 +0200 Subject: [PATCH 01/30] Rename files to have a bit more readable structure --- 1/main.lisp => 01/tutorial-01.lisp | 0 {2 => 02}/hello_world.bmp | Bin 2/main.lisp => 02/tutorial-02.lisp | 0 {3 => 03}/exit.bmp | Bin 3/main.lisp => 03/tutorial-03.lisp | 0 {4 => 04}/down.bmp | Bin {4 => 04}/left.bmp | Bin {4 => 04}/press.bmp | Bin {4 => 04}/right.bmp | Bin 4/main.lisp => 04/tutorial-04.lisp | 0 {4 => 04}/up.bmp | Bin {5 => 05}/stretch.bmp | Bin 5/main.lisp => 05/tutorial-05.lisp | 0 {6 => 06}/loaded.png | Bin 6/main.lisp => 06/tutorial-06.lisp | 0 {7 => 07}/texture.png | Bin 7/main.lisp => 07/tutorial-07.lisp | 0 8/main.lisp => 08/tutorial-08.lisp | 0 {9 => 09}/texture.png | Bin 9/main.lisp => 09/tutorial-09.lisp | 0 10/{main.lisp => tutorial-10.lisp} | 0 11/{main.lisp => tutorial-11.lisp} | 0 12/{main.lisp => tutorial-12.lisp} | 0 13/{main.lisp => tutorial-13.lisp} | 0 14/{main.lisp => tutorial-14.lisp} | 0 15/{main.lisp => tutorial-15.lisp} | 0 16/{main.lisp => tutorial-16.lisp} | 0 README.md | 21 ++++++++++++----- repl.sh | 4 ---- sdl2-tutorial.asd | 35 ++++++++++++++--------------- sdl2-tutorial.lisp | 11 --------- 31 files changed, 32 insertions(+), 39 deletions(-) rename 1/main.lisp => 01/tutorial-01.lisp (100%) rename {2 => 02}/hello_world.bmp (100%) rename 2/main.lisp => 02/tutorial-02.lisp (100%) rename {3 => 03}/exit.bmp (100%) rename 3/main.lisp => 03/tutorial-03.lisp (100%) rename {4 => 04}/down.bmp (100%) rename {4 => 04}/left.bmp (100%) rename {4 => 04}/press.bmp (100%) rename {4 => 04}/right.bmp (100%) rename 4/main.lisp => 04/tutorial-04.lisp (100%) rename {4 => 04}/up.bmp (100%) rename {5 => 05}/stretch.bmp (100%) rename 5/main.lisp => 05/tutorial-05.lisp (100%) rename {6 => 06}/loaded.png (100%) rename 6/main.lisp => 06/tutorial-06.lisp (100%) rename {7 => 07}/texture.png (100%) rename 7/main.lisp => 07/tutorial-07.lisp (100%) rename 8/main.lisp => 08/tutorial-08.lisp (100%) rename {9 => 09}/texture.png (100%) rename 9/main.lisp => 09/tutorial-09.lisp (100%) rename 10/{main.lisp => tutorial-10.lisp} (100%) rename 11/{main.lisp => tutorial-11.lisp} (100%) rename 12/{main.lisp => tutorial-12.lisp} (100%) rename 13/{main.lisp => tutorial-13.lisp} (100%) rename 14/{main.lisp => tutorial-14.lisp} (100%) rename 15/{main.lisp => tutorial-15.lisp} (100%) rename 16/{main.lisp => tutorial-16.lisp} (100%) delete mode 100755 repl.sh delete mode 100644 sdl2-tutorial.lisp diff --git a/1/main.lisp b/01/tutorial-01.lisp similarity index 100% rename from 1/main.lisp rename to 01/tutorial-01.lisp diff --git a/2/hello_world.bmp b/02/hello_world.bmp similarity index 100% rename from 2/hello_world.bmp rename to 02/hello_world.bmp diff --git a/2/main.lisp b/02/tutorial-02.lisp similarity index 100% rename from 2/main.lisp rename to 02/tutorial-02.lisp diff --git a/3/exit.bmp b/03/exit.bmp similarity index 100% rename from 3/exit.bmp rename to 03/exit.bmp diff --git a/3/main.lisp b/03/tutorial-03.lisp similarity index 100% rename from 3/main.lisp rename to 03/tutorial-03.lisp diff --git a/4/down.bmp b/04/down.bmp similarity index 100% rename from 4/down.bmp rename to 04/down.bmp diff --git a/4/left.bmp b/04/left.bmp similarity index 100% rename from 4/left.bmp rename to 04/left.bmp diff --git a/4/press.bmp b/04/press.bmp similarity index 100% rename from 4/press.bmp rename to 04/press.bmp diff --git a/4/right.bmp b/04/right.bmp similarity index 100% rename from 4/right.bmp rename to 04/right.bmp diff --git a/4/main.lisp b/04/tutorial-04.lisp similarity index 100% rename from 4/main.lisp rename to 04/tutorial-04.lisp diff --git a/4/up.bmp b/04/up.bmp similarity index 100% rename from 4/up.bmp rename to 04/up.bmp diff --git a/5/stretch.bmp b/05/stretch.bmp similarity index 100% rename from 5/stretch.bmp rename to 05/stretch.bmp diff --git a/5/main.lisp b/05/tutorial-05.lisp similarity index 100% rename from 5/main.lisp rename to 05/tutorial-05.lisp diff --git a/6/loaded.png b/06/loaded.png similarity index 100% rename from 6/loaded.png rename to 06/loaded.png diff --git a/6/main.lisp b/06/tutorial-06.lisp similarity index 100% rename from 6/main.lisp rename to 06/tutorial-06.lisp diff --git a/7/texture.png b/07/texture.png similarity index 100% rename from 7/texture.png rename to 07/texture.png diff --git a/7/main.lisp b/07/tutorial-07.lisp similarity index 100% rename from 7/main.lisp rename to 07/tutorial-07.lisp diff --git a/8/main.lisp b/08/tutorial-08.lisp similarity index 100% rename from 8/main.lisp rename to 08/tutorial-08.lisp diff --git a/9/texture.png b/09/texture.png similarity index 100% rename from 9/texture.png rename to 09/texture.png diff --git a/9/main.lisp b/09/tutorial-09.lisp similarity index 100% rename from 9/main.lisp rename to 09/tutorial-09.lisp diff --git a/10/main.lisp b/10/tutorial-10.lisp similarity index 100% rename from 10/main.lisp rename to 10/tutorial-10.lisp diff --git a/11/main.lisp b/11/tutorial-11.lisp similarity index 100% rename from 11/main.lisp rename to 11/tutorial-11.lisp diff --git a/12/main.lisp b/12/tutorial-12.lisp similarity index 100% rename from 12/main.lisp rename to 12/tutorial-12.lisp diff --git a/13/main.lisp b/13/tutorial-13.lisp similarity index 100% rename from 13/main.lisp rename to 13/tutorial-13.lisp diff --git a/14/main.lisp b/14/tutorial-14.lisp similarity index 100% rename from 14/main.lisp rename to 14/tutorial-14.lisp diff --git a/15/main.lisp b/15/tutorial-15.lisp similarity index 100% rename from 15/main.lisp rename to 15/tutorial-15.lisp diff --git a/16/main.lisp b/16/tutorial-16.lisp similarity index 100% rename from 16/main.lisp rename to 16/tutorial-16.lisp diff --git a/README.md b/README.md index 62a10c1..758fb13 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # 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 @@ -45,10 +44,20 @@ below. apt install libsdl2-2.0 libsdl2-image-2.0 libsdl2-ttf-2.0 -## Running the Examples +## Installation + +Using [quicklisp](https://www.quicklisp.org/beta/): +``` +git clone https://github.com/TatriX/cl-sdl2-tutorial/ ~/quicklisp/local-projects +``` -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. +```lisp +> (ql:quickload :sdl2-tutorial) +``` + + +## Running the Examples - 1. ./repl.sh - 2. (sdl2-tutorial:main #'sdl2-tutorial-1:main) +```lisp +(sdl2-tutorial-01:run) +``` 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..84dbb7f 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -2,21 +2,20 @@ :description "SDL2 Tutorial based upon http://lazyfoo.net/tutorials/SDL" :version "0.0.1" :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 "01/tutorial-01") + (:file "02/tutorial-02") + (:file "03/tutorial-03") + (:file "04/tutorial-04") + (:file "05/tutorial-05") + (:file "06/tutorial-06") + (:file "07/tutorial-07") + (:file "08/tutorial-08") + (:file "09/tutorial-09") + (:file "10/tutorial-10") + (:file "11/tutorial-11") + (:file "12/tutorial-12") + (:file "13/tutorial-13") + (:file "14/tutorial-14") + (:file "15/tutorial-15") + (:file "16/tutorial-16"))) 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)) From 5ee5706332a6ae59166f8dccc108e7153ca3284d Mon Sep 17 00:00:00 2001 From: TatriX Date: Tue, 13 Jul 2021 23:43:35 +0200 Subject: [PATCH 02/30] Refactor tutorial 01 --- 01/tutorial-01.lisp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/01/tutorial-01.lisp b/01/tutorial-01.lisp index 7be644b..2c68adc 100644 --- a/01/tutorial-01.lisp +++ b/01/tutorial-01.lisp @@ -1,21 +1,21 @@ -(defpackage #:sdl2-tutorial-1 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-01 + (:use :cl) + (:export :run)) -(in-package :sdl2-tutorial-1) +(in-package :sdl2-tutorial-01) (defparameter *screen-width* 640) (defparameter *screen-height* 480) -(defun main(&key (delay 2000)) +(defun run() (sdl2:with-init (:video) - (sdl2:with-window (window :title "SDL2 Window" :w *screen-width* :h *screen-height*) + (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:with-event-loop (:method :poll) - (:quit () t) - (:idle () - (sdl2:delay delay))))))) + (sdl2:delay 2000))))) From 289f917ecc83ee7bee5416ef07fdd6a3ae48645c Mon Sep 17 00:00:00 2001 From: TatriX Date: Wed, 14 Jul 2021 00:37:34 +0200 Subject: [PATCH 03/30] Refactor tutorial 02 --- 02/tutorial-02.lisp | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/02/tutorial-02.lisp b/02/tutorial-02.lisp index 411891f..6bfe19b 100644 --- a/02/tutorial-02.lisp +++ b/02/tutorial-02.lisp @@ -1,8 +1,8 @@ -(defpackage #:sdl2-tutorial-2 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-02 + (:use :cl) + (:export :run)) -(in-package :sdl2-tutorial-2) +(in-package :sdl2-tutorial-02) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -17,14 +17,18 @@ (let ((,surface (sdl2:get-window-surface ,window))) ,@body)))) -(defun main(&key (delay 2000)) +(defun load-image (pathname) + (let* ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial))) + (image (sdl2:load-bmp fullpath))) + (if (autowrap:wrapper-null-p image) + (error "cannot load image ~a (check that file exists)" fullpath) + image))) + +(defun run() (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))))) + (let ((image (load-image #p"./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)))) From 1cec5d81f07ac64a17beb976928cf415ee09ff3d Mon Sep 17 00:00:00 2001 From: TatriX Date: Fri, 16 Jul 2021 22:44:21 +0200 Subject: [PATCH 04/30] Refactor tutorial 03 --- 03/tutorial-03.lisp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/03/tutorial-03.lisp b/03/tutorial-03.lisp index 17d6354..b7a7c2e 100644 --- a/03/tutorial-03.lisp +++ b/03/tutorial-03.lisp @@ -1,8 +1,8 @@ -(defpackage #:sdl2-tutorial-3 +(defpackage #:sdl2-tutorial-03 (:use :common-lisp) (:export :main)) -(in-package :sdl2-tutorial-3) +(in-package :sdl2-tutorial-03) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -17,12 +17,20 @@ (let ((,surface (sdl2:get-window-surface ,window))) ,@body)))) -(defun main() +(defun load-image (pathname) + (let* ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial))) + (image (sdl2:load-bmp fullpath))) + (if (autowrap:wrapper-null-p image) + (error "cannot load image ~a (check that file exists)" fullpath) + image))) + +(defun run () (with-window-surface (window screen-surface) - (let ((image (sdl2:load-bmp "3/exit.bmp"))) + (let ((image (load-image "./03/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 + ;; reduce cpu usage + (sdl2:delay 100)))))) From 1cbd6d696fa571748bab5e991c60f8b94ff44957 Mon Sep 17 00:00:00 2001 From: TatriX Date: Fri, 16 Jul 2021 22:51:22 +0200 Subject: [PATCH 05/30] Use flat file hierarchy --- 01/tutorial-01.lisp => 01-hello-sdl.lisp | 4 ++-- ...2.lisp => 02-getting-an-image-on-the-screen.lisp | 8 ++++---- ...rial-03.lisp => 03-event-driven-programming.lisp | 8 ++++---- {02 => assets/02}/hello_world.bmp | Bin {03 => assets/03}/exit.bmp | Bin sdl2-tutorial.asd | 6 +++--- 6 files changed, 13 insertions(+), 13 deletions(-) rename 01/tutorial-01.lisp => 01-hello-sdl.lisp (88%) rename 02/tutorial-02.lisp => 02-getting-an-image-on-the-screen.lisp (80%) rename 03/tutorial-03.lisp => 03-event-driven-programming.lisp (82%) rename {02 => assets/02}/hello_world.bmp (100%) rename {03 => assets/03}/exit.bmp (100%) diff --git a/01/tutorial-01.lisp b/01-hello-sdl.lisp similarity index 88% rename from 01/tutorial-01.lisp rename to 01-hello-sdl.lisp index 2c68adc..2d1a366 100644 --- a/01/tutorial-01.lisp +++ b/01-hello-sdl.lisp @@ -1,8 +1,8 @@ -(defpackage #:sdl2-tutorial-01 +(defpackage #:sdl2-tutorial-01-hello-sdl (:use :cl) (:export :run)) -(in-package :sdl2-tutorial-01) +(in-package :sdl2-tutorial-01-hello-sdl) (defparameter *screen-width* 640) (defparameter *screen-height* 480) diff --git a/02/tutorial-02.lisp b/02-getting-an-image-on-the-screen.lisp similarity index 80% rename from 02/tutorial-02.lisp rename to 02-getting-an-image-on-the-screen.lisp index 6bfe19b..9630171 100644 --- a/02/tutorial-02.lisp +++ b/02-getting-an-image-on-the-screen.lisp @@ -1,8 +1,8 @@ -(defpackage #:sdl2-tutorial-02 +(defpackage #:sdl2-tutorial-02-getting-an-image-on-the-screen (:use :cl) (:export :run)) -(in-package :sdl2-tutorial-02) +(in-package :sdl2-tutorial-02-getting-an-image-on-the-screen) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -10,7 +10,7 @@ (defmacro with-window-surface ((window surface) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 02" :w *screen-width* :h *screen-height* :flags '(:shown)) @@ -26,7 +26,7 @@ (defun run() (with-window-surface (window screen-surface) - (let ((image (load-image #p"./02/hello_world.bmp"))) + (let ((image (load-image #p"./assets/02/hello_world.bmp"))) (sdl2:blit-surface image nil screen-surface nil) (sdl2:update-window window) (sdl2:delay 2000) diff --git a/03/tutorial-03.lisp b/03-event-driven-programming.lisp similarity index 82% rename from 03/tutorial-03.lisp rename to 03-event-driven-programming.lisp index b7a7c2e..92414c3 100644 --- a/03/tutorial-03.lisp +++ b/03-event-driven-programming.lisp @@ -1,8 +1,8 @@ -(defpackage #:sdl2-tutorial-03 +(defpackage #:sdl2-tutorial-03-event-driven-programming (:use :common-lisp) (:export :main)) -(in-package :sdl2-tutorial-03) +(in-package :sdl2-tutorial-03-event-driven-programming) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -10,7 +10,7 @@ (defmacro with-window-surface ((window surface) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 03" :w *screen-width* :h *screen-height* :flags '(:shown)) @@ -26,7 +26,7 @@ (defun run () (with-window-surface (window screen-surface) - (let ((image (load-image "./03/exit.bmp"))) + (let ((image (load-image "./assets/03/exit.bmp"))) (sdl2:with-event-loop (:method :poll) (:quit () t) (:idle () diff --git a/02/hello_world.bmp b/assets/02/hello_world.bmp similarity index 100% rename from 02/hello_world.bmp rename to assets/02/hello_world.bmp diff --git a/03/exit.bmp b/assets/03/exit.bmp similarity index 100% rename from 03/exit.bmp rename to assets/03/exit.bmp diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index 84dbb7f..344ad94 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -3,9 +3,9 @@ :version "0.0.1" :licence "Public Domain" :depends-on ("bordeaux-threads" "sdl2" "sdl2-image" "sdl2-ttf") - :components ((:file "01/tutorial-01") - (:file "02/tutorial-02") - (:file "03/tutorial-03") + :components ((:file "01-hello-sdl") + (:file "02-getting-an-image-on-the-screen") + (:file "03-event-driven-programming") (:file "04/tutorial-04") (:file "05/tutorial-05") (:file "06/tutorial-06") From c9d3bd2ce2102826be633f934917a781af429f3a Mon Sep 17 00:00:00 2001 From: TatriX Date: Fri, 16 Jul 2021 22:54:15 +0200 Subject: [PATCH 06/30] Fix export in tutorial 03 --- 03-event-driven-programming.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/03-event-driven-programming.lisp b/03-event-driven-programming.lisp index 92414c3..fe2f771 100644 --- a/03-event-driven-programming.lisp +++ b/03-event-driven-programming.lisp @@ -1,6 +1,6 @@ (defpackage #:sdl2-tutorial-03-event-driven-programming - (:use :common-lisp) - (:export :main)) + (:use :cl) + (:export :run)) (in-package :sdl2-tutorial-03-event-driven-programming) From 2f55a4eec4716fa15c398826da85d6fde62028a9 Mon Sep 17 00:00:00 2001 From: TatriX Date: Fri, 16 Jul 2021 22:59:29 +0200 Subject: [PATCH 07/30] Refactor tutorial 04 --- 04-key-presses.lisp | 51 ++++++++++++++++++++++++++++++++++++ 04/tutorial-04.lisp | 43 ------------------------------ {04 => assets/04}/down.bmp | Bin {04 => assets/04}/left.bmp | Bin {04 => assets/04}/press.bmp | Bin {04 => assets/04}/right.bmp | Bin {04 => assets/04}/up.bmp | Bin sdl2-tutorial.asd | 2 +- 8 files changed, 52 insertions(+), 44 deletions(-) create mode 100644 04-key-presses.lisp delete mode 100644 04/tutorial-04.lisp rename {04 => assets/04}/down.bmp (100%) rename {04 => assets/04}/left.bmp (100%) rename {04 => assets/04}/press.bmp (100%) rename {04 => assets/04}/right.bmp (100%) rename {04 => assets/04}/up.bmp (100%) diff --git a/04-key-presses.lisp b/04-key-presses.lisp new file mode 100644 index 0000000..74f2fe4 --- /dev/null +++ b/04-key-presses.lisp @@ -0,0 +1,51 @@ +(defpackage #:sdl2-tutorial-04-key-presses + (:use :cl) + (:export :run)) + +(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* ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial))) + (image (sdl2:load-bmp fullpath))) + (if (autowrap:wrapper-null-p image) + (error "cannot load image ~a (check that file exists)" fullpath) + image))) + +(defun load-media () + (list :default (load-image "assets/04/press.bmp") + :up (load-image "assets/04/up.bmp") + :down (load-image "assets/04/down.bmp") + :left (load-image "assets/04/left.bmp") + :right (load-image "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)))))) diff --git a/04/tutorial-04.lisp b/04/tutorial-04.lisp deleted file mode 100644 index 8ca43c2..0000000 --- a/04/tutorial-04.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/04/down.bmp b/assets/04/down.bmp similarity index 100% rename from 04/down.bmp rename to assets/04/down.bmp diff --git a/04/left.bmp b/assets/04/left.bmp similarity index 100% rename from 04/left.bmp rename to assets/04/left.bmp diff --git a/04/press.bmp b/assets/04/press.bmp similarity index 100% rename from 04/press.bmp rename to assets/04/press.bmp diff --git a/04/right.bmp b/assets/04/right.bmp similarity index 100% rename from 04/right.bmp rename to assets/04/right.bmp diff --git a/04/up.bmp b/assets/04/up.bmp similarity index 100% rename from 04/up.bmp rename to assets/04/up.bmp diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index 344ad94..0581754 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -6,7 +6,7 @@ :components ((:file "01-hello-sdl") (:file "02-getting-an-image-on-the-screen") (:file "03-event-driven-programming") - (:file "04/tutorial-04") + (:file "04-key-presses") (:file "05/tutorial-05") (:file "06/tutorial-06") (:file "07/tutorial-07") From 94a48d06c513f96418d46d7886551005b5f33996 Mon Sep 17 00:00:00 2001 From: TatriX Date: Fri, 16 Jul 2021 23:18:56 +0200 Subject: [PATCH 08/30] Add cleanup in tutorials 03 and 04 --- 03-event-driven-programming.lisp | 4 +++- 04-key-presses.lisp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/03-event-driven-programming.lisp b/03-event-driven-programming.lisp index fe2f771..aed0ce1 100644 --- a/03-event-driven-programming.lisp +++ b/03-event-driven-programming.lisp @@ -33,4 +33,6 @@ (sdl2:blit-surface image nil screen-surface nil) (sdl2:update-window window) ;; reduce cpu usage - (sdl2:delay 100)))))) + (sdl2:delay 100))) + ;; clean up + (sdl2:free-surface image)))) diff --git a/04-key-presses.lisp b/04-key-presses.lisp index 74f2fe4..f9a0336 100644 --- a/04-key-presses.lisp +++ b/04-key-presses.lisp @@ -48,4 +48,6 @@ (sdl2:blit-surface image nil screen-surface nil) (sdl2:update-window window) ;; reduce cpu usage - (sdl2:delay 100)))))) + (sdl2:delay 100))) + ;; clean up + (mapc #'sdl2:free-surface (remove-if #'symbolp images))))) From 15c80effd6e437bf78b9c086a1878cd864ec8db3 Mon Sep 17 00:00:00 2001 From: TatriX Date: Sun, 18 Jul 2021 20:35:53 +0200 Subject: [PATCH 09/30] Refactor tutorial 05 --- ...d-surface-loading-and-soft-stretching.lisp | 22 +++++++++++------- {05 => assets/05}/stretch.bmp | Bin 360138 -> 230456 bytes sdl2-tutorial.asd | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) rename 05/tutorial-05.lisp => 05-optimized-surface-loading-and-soft-stretching.lisp (53%) rename {05 => assets/05}/stretch.bmp (50%) diff --git a/05/tutorial-05.lisp b/05-optimized-surface-loading-and-soft-stretching.lisp similarity index 53% rename from 05/tutorial-05.lisp rename to 05-optimized-surface-loading-and-soft-stretching.lisp index 34fd608..53ec49e 100644 --- a/05/tutorial-05.lisp +++ b/05-optimized-surface-loading-and-soft-stretching.lisp @@ -1,8 +1,8 @@ -(defpackage #:sdl2-tutorial-5 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-05-optimized-surface-loading-and-soft-stretching + (:use :cl) + (:export :run)) -(in-package :sdl2-tutorial-5) +(in-package :sdl2-tutorial-05-optimized-surface-loading-and-soft-stretching) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -10,19 +10,23 @@ (defmacro with-window-surface ((window surface) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 05" :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 load-surface (pathname pixel-format) + (let* ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial))) + (image (sdl2:load-bmp fullpath))) + (if (autowrap:wrapper-null-p image) + (error "cannot load image ~a (check that file exists)" fullpath) + (sdl2:convert-surface-format image pixel-format)))) -(defun main() +(defun run () (with-window-surface (window screen-surface) - (let ((image-surface (load-surface "5/stretch.bmp" (sdl2:surface-format-format screen-surface))) + (let ((image-surface (load-surface "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) diff --git a/05/stretch.bmp b/assets/05/stretch.bmp similarity index 50% rename from 05/stretch.bmp rename to assets/05/stretch.bmp index 3d3b153b78c9305ad49fa26e6dbb745979d55a51..8457f1917ab795c4566000b8d72bfacc0e61cc40 100644 GIT binary patch literal 230456 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 DEL%I{ literal 360138 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

*fPmcuRGOrVv)ez|0|5{K0ZBloO{z3m4j~AD z00`JkK&45#IJ^CWJrDo^5Re3P+N4U8oxfB*>CO+ckdx;VT2gFO%c0T7S`blRj!ljRVC00@A9-2_ycq>HoLKiC5S5C8#5 zK&MTrG+7QI2!H?x*iAsCNxC?@{ewLa009t?1a#V@N|WUff&d7BfZYUCnxu=f+dtR? z0T2KINkFGfsx(;+Aqao~2-r*fPmcuRGOrV zv)ez|0|5{K0ZBloO{z3m4j~AD00`JkK&45#IJ^CWJrDo^5Re3P+N4U8oxfB*>CO+ckdx;VT2gFO%c0T7S`blRj!ljRVC z00@A9-2_ycq>HoLKiC5S5C8#5K&MTrG+7QI2!H?x*iAsCNxC?@{ewLa009t?1a#V@ zN|WUff&d7BfZYUCnxu=f+dtR?0T2KINkFGfsx(;+Aqao~2-r*fPmcuRGOrVv)ez|0|5{K0ZBloO{z3m4j~AD00`JkK&45#IJ^CW zJrDo^5Re3P+N4U8oxfB*>CO+ckd zx;VT2gFO%c0T7S`blRj!ljRVC00@A9-2_ycq>HoLKiC5S5C8#5K&MTrG+7QI2!H?x z*iAsCNxC?@{ewLa009t?1a#V@N|WUff&d7BfZYUCnxu=f+dtR?0T2KINkFGfsx(;+ zAqao~2-r*fPmcuRGOrVv)ez|0|5{K0ZBlo zO{z3m4j~AD00`JkK&45#IJ^CWJrDo^5Re3P+N4U8oxfB*>CO+ckdx;VT2gFO%c0T7S`blRj!ljRVC00@A9-2_ycq>HoL zKiC5S5C8#5K&MTrG+7QI2!H?x*iAsCNxC?@{ewLa009t?1a#V@N|WUff&d7BfZYUC znxu=f+dtR?0T2KINkFGfsx(;+Aqao~2-r* zfPmcuRGOrVv)ez|0|5{K0ZBloO{z3m4j~AD00`JkK&45#IJ^CWJrDo^5Re3P+N4U8 zoxfB*>CO+ckdx;VT2gFO%c0T7S` zblRj!ljRVC00@A9-2_ycq>HoLKiC5S5C8#5K&MTrG+7QI2!H?x*iAsCNxC?@{ewLa z009t?1a#V@N|WUff&d7BfZYUCnxu=f+dtR?0T2KINkFGfsx(;+Aqao~2-r*fPmcuRGOrVv)ez|0|5{K0ZBloO{z3m4j~AD00`Jk zK&45#IJ^CWJrDo^5Re3P+N4U8ox zfB*>CO+ckdx;VT2gFO%c0T7S`blRj!ljRVC00@A9-2_ycq>HoLKiC5S5C8#5K&MTr zG+7QI2!H?x*iAsCNxC?@{ewLa009t?1a#V@N|WUff&d7BfZYUCnxu=f+dtR?0T2KI zNkFGfsx(;+Aqao~2-r*fPmcuRGOrVv)ez| z0|5{K0ZBloO{z3m4j~AD00`JkK&45#IJ^CWJrDo^5Re3P+N4U8oxfB*>CO+ckdx;VT2gFO%c0T7S`blQZpjsyl^fI5IW zfI5IWfI5IWfI5IWfI5IWfI5IWfI5IWfI5IWfI5IWfI5IWfI5IWfI5IW@CT>^{~x#V BWflMc diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index 0581754..a62b50d 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -7,7 +7,7 @@ (:file "02-getting-an-image-on-the-screen") (:file "03-event-driven-programming") (:file "04-key-presses") - (:file "05/tutorial-05") + (:file "05-optimized-surface-loading-and-soft-stretching") (:file "06/tutorial-06") (:file "07/tutorial-07") (:file "08/tutorial-08") From 87170a2f05b54891629040b69aa1c2387e112962 Mon Sep 17 00:00:00 2001 From: TatriX Date: Sun, 18 Jul 2021 20:47:21 +0200 Subject: [PATCH 10/30] Refactor tutorial 06 --- ...aries-and-loading-other-image-formats.lisp | 24 ++++++++++-------- 06/loaded.png | Bin 7654 -> 0 bytes assets/06/loaded.png | Bin 0 -> 15451 bytes sdl2-tutorial.asd | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) rename 06/tutorial-06.lisp => 06-extension-libraries-and-loading-other-image-formats.lisp (54%) delete mode 100644 06/loaded.png create mode 100644 assets/06/loaded.png diff --git a/06/tutorial-06.lisp b/06-extension-libraries-and-loading-other-image-formats.lisp similarity index 54% rename from 06/tutorial-06.lisp rename to 06-extension-libraries-and-loading-other-image-formats.lisp index d19a729..226e48c 100644 --- a/06/tutorial-06.lisp +++ b/06-extension-libraries-and-loading-other-image-formats.lisp @@ -1,8 +1,8 @@ -(defpackage #:sdl2-tutorial-6 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-06-extension-libraries-and-loading-other-image-formats + (:use :cl) + (:export :run)) -(in-package :sdl2-tutorial-6) +(in-package :sdl2-tutorial-06-extension-libraries-and-loading-other-image-formats) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -10,20 +10,22 @@ (defmacro with-window-surface ((window surface) &body body) `(sdl2:with-init (:video) (sdl2:with-window (,window - :title "SDL2 Tutorial" + :title "SDL2 Tutorial 06" :w *screen-width* :h *screen-height* :flags '(:shown)) (let ((,surface (sdl2:get-window-surface ,window))) - ,@body)))) + (sdl2-image:init '(:png)) + ,@body + (sdl2-image:quit))))) -(defun load-surface (filename &optional pixel-format) - (sdl2:convert-surface-format (sdl2-image:load-image filename) pixel-format)) +(defun load-surface (pathname pixel-format) + (let ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial)))) + (sdl2:convert-surface-format (sdl2-image:load-image fullpath) pixel-format))) -(defun main() +(defun run () (with-window-surface (window screen-surface) - (sdl2-image:init '(:png)) - (let ((image-surface (load-surface "6/loaded.png" (sdl2:surface-format-format screen-surface))) + (let ((image-surface (load-surface "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) diff --git a/06/loaded.png b/06/loaded.png deleted file mode 100644 index 66ee6c6bc70db7139eadc29920d59bac061f38c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7654 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 diff --git a/assets/06/loaded.png b/assets/06/loaded.png new file mode 100644 index 0000000000000000000000000000000000000000..06187174cc6d1c033b3e8d48e58fbef30b0d52f6 GIT binary patch literal 15451 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 s2zV!$>Hj9W|L;8fKf4&O(oZM(?-2CHj?=l}o! literal 0 HcmV?d00001 diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index a62b50d..14c45e0 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -8,7 +8,7 @@ (:file "03-event-driven-programming") (:file "04-key-presses") (:file "05-optimized-surface-loading-and-soft-stretching") - (:file "06/tutorial-06") + (:file "06-extension-libraries-and-loading-other-image-formats.lisp ") (:file "07/tutorial-07") (:file "08/tutorial-08") (:file "09/tutorial-09") From 8efaa281657343ec166f645bd861577be1dd8237 Mon Sep 17 00:00:00 2001 From: TatriX Date: Mon, 19 Jul 2021 23:42:54 +0200 Subject: [PATCH 11/30] Refactor tutorial 07 --- ...p => 07-texture-loading-and-rendering.lisp | 21 +++++++++--------- {07 => assets/07}/texture.png | Bin sdl2-tutorial.asd | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-) rename 07/tutorial-07.lisp => 07-texture-loading-and-rendering.lisp (59%) rename {07 => assets/07}/texture.png (100%) diff --git a/07/tutorial-07.lisp b/07-texture-loading-and-rendering.lisp similarity index 59% rename from 07/tutorial-07.lisp rename to 07-texture-loading-and-rendering.lisp index 833491c..cd761ee 100644 --- a/07/tutorial-07.lisp +++ b/07-texture-loading-and-rendering.lisp @@ -1,8 +1,8 @@ -(defpackage #:sdl2-tutorial-7 - (:use :common-lisp) - (:export :main)) +(defpackage #:sdl2-tutorial-07-texture-loading-and-rendering + (:use :cl) + (:export :run)) -(in-package :sdl2-tutorial-7) +(in-package :sdl2-tutorial-07-texture-loading-and-rendering) (defparameter *screen-width* 640) (defparameter *screen-height* 480) @@ -10,21 +10,22 @@ (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 load-texture (renderer pathname) + (let ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial)))) + (sdl2:create-texture-from-surface renderer (sdl2-image:load-image fullpath)))) -(defun main() +(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 "assets/07/texture.png"))) (sdl2:with-event-loop (:method :poll) (:quit () t) (:idle () diff --git a/07/texture.png b/assets/07/texture.png similarity index 100% rename from 07/texture.png rename to assets/07/texture.png diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index 14c45e0..f89bcd8 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -8,8 +8,8 @@ (: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.lisp ") - (:file "07/tutorial-07") + (:file "06-extension-libraries-and-loading-other-image-formats.lisp") + (:file "07-texture-loading-and-rendering.lisp") (:file "08/tutorial-08") (:file "09/tutorial-09") (:file "10/tutorial-10") From 2808a8974e2847211522c79f90782d5e66291624 Mon Sep 17 00:00:00 2001 From: TatriX Date: Thu, 29 Jul 2021 20:40:41 +0200 Subject: [PATCH 12/30] Refactor tutorial 08 --- 08-geometry-rendering.lisp | 60 ++++++++++++++++++++++++++++++++++++++ 08/tutorial-08.lisp | 52 --------------------------------- sdl2-tutorial.asd | 2 +- 3 files changed, 61 insertions(+), 53 deletions(-) create mode 100644 08-geometry-rendering.lisp delete mode 100644 08/tutorial-08.lisp 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/08/tutorial-08.lisp b/08/tutorial-08.lisp deleted file mode 100644 index 47e4596..0000000 --- a/08/tutorial-08.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/sdl2-tutorial.asd b/sdl2-tutorial.asd index f89bcd8..58d54c8 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -10,7 +10,7 @@ (:file "05-optimized-surface-loading-and-soft-stretching") (:file "06-extension-libraries-and-loading-other-image-formats.lisp") (:file "07-texture-loading-and-rendering.lisp") - (:file "08/tutorial-08") + (:file "08-geometry-rendering") (:file "09/tutorial-09") (:file "10/tutorial-10") (:file "11/tutorial-11") From 3bee302b05f47962153e5829d73e678c507b5c73 Mon Sep 17 00:00:00 2001 From: TatriX Date: Thu, 29 Jul 2021 20:47:47 +0200 Subject: [PATCH 13/30] Refactor tutorial 09 --- 09-the-viewport.lisp | 58 ++++++++++++++++++++++++++++++++++ 09/tutorial-09.lisp | 55 -------------------------------- {09 => assets/09}/texture.png | Bin sdl2-tutorial.asd | 2 +- 4 files changed, 59 insertions(+), 56 deletions(-) create mode 100644 09-the-viewport.lisp delete mode 100644 09/tutorial-09.lisp rename {09 => assets/09}/texture.png (100%) diff --git a/09-the-viewport.lisp b/09-the-viewport.lisp new file mode 100644 index 0000000..b19e712 --- /dev/null +++ b/09-the-viewport.lisp @@ -0,0 +1,58 @@ +(defpackage #:sdl2-tutorial-09-the-viewport + (:use :cl) + (:export :run)) + +(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 ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial)))) + (sdl2:create-texture-from-surface renderer (sdl2-image:load-image fullpath)))) + +(defun run () + (with-window-renderer (window renderer) + (sdl2-image:init '(:png)) + + (let ((texture (load-texture renderer "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)))))) diff --git a/09/tutorial-09.lisp b/09/tutorial-09.lisp deleted file mode 100644 index c640ac7..0000000 --- a/09/tutorial-09.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/09/texture.png b/assets/09/texture.png similarity index 100% rename from 09/texture.png rename to assets/09/texture.png diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index 58d54c8..a74addb 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -11,7 +11,7 @@ (:file "06-extension-libraries-and-loading-other-image-formats.lisp") (:file "07-texture-loading-and-rendering.lisp") (:file "08-geometry-rendering") - (:file "09/tutorial-09") + (:file "09-the-viewport") (:file "10/tutorial-10") (:file "11/tutorial-11") (:file "12/tutorial-12") From fc6fafac646870e978969b32832320f848c26bb9 Mon Sep 17 00:00:00 2001 From: TatriX Date: Thu, 29 Jul 2021 21:35:35 +0200 Subject: [PATCH 14/30] Update README --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 758fb13..3759671 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,18 @@ git clone https://github.com/TatriX/cl-sdl2-tutorial/ ~/quicklisp/local-projects ## Running the Examples +Tutorial packages are named as `sdl2-tutorial-XX-DESC` +where `XX` is a number starting from `01`. + ```lisp -(sdl2-tutorial-01:run) +(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! From 9d1dc7e357875efafe8f2269f189a7700f8fd2bf Mon Sep 17 00:00:00 2001 From: TatriX Date: Thu, 29 Jul 2021 21:35:56 +0200 Subject: [PATCH 15/30] Fix asd components --- sdl2-tutorial.asd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index a74addb..1767e50 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -8,11 +8,11 @@ (: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.lisp") - (:file "07-texture-loading-and-rendering.lisp") + (: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/tutorial-10") + (:file "10-color-keying") (:file "11/tutorial-11") (:file "12/tutorial-12") (:file "13/tutorial-13") From eedf7c7deae8d3df34341b68d0d267f5ae87a7b1 Mon Sep 17 00:00:00 2001 From: TatriX Date: Thu, 29 Jul 2021 22:20:52 +0200 Subject: [PATCH 16/30] Add utils package with `asset-pathname` function --- 02-getting-an-image-on-the-screen.lisp | 12 +++++------ 03-event-driven-programming.lisp | 10 ++++----- 04-key-presses.lisp | 18 ++++++++-------- ...d-surface-loading-and-soft-stretching.lisp | 15 +++++++------ ...aries-and-loading-other-image-formats.lisp | 21 +++++++++++-------- 07-texture-loading-and-rendering.lisp | 18 ++++++++++------ 09-the-viewport.lisp | 14 ++++++++----- sdl2-tutorial.asd | 3 ++- utils.lisp | 13 ++++++++++++ 9 files changed, 77 insertions(+), 47 deletions(-) create mode 100644 utils.lisp diff --git a/02-getting-an-image-on-the-screen.lisp b/02-getting-an-image-on-the-screen.lisp index 9630171..bca48a0 100644 --- a/02-getting-an-image-on-the-screen.lisp +++ b/02-getting-an-image-on-the-screen.lisp @@ -1,6 +1,7 @@ (defpackage #:sdl2-tutorial-02-getting-an-image-on-the-screen (:use :cl) - (:export :run)) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) (in-package :sdl2-tutorial-02-getting-an-image-on-the-screen) @@ -17,16 +18,15 @@ (let ((,surface (sdl2:get-window-surface ,window))) ,@body)))) -(defun load-image (pathname) - (let* ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial))) - (image (sdl2:load-bmp fullpath))) +(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)" fullpath) + (error "cannot load image ~a (check that file exists)" filename) image))) (defun run() (with-window-surface (window screen-surface) - (let ((image (load-image #p"./assets/02/hello_world.bmp"))) + (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) diff --git a/03-event-driven-programming.lisp b/03-event-driven-programming.lisp index aed0ce1..07565c9 100644 --- a/03-event-driven-programming.lisp +++ b/03-event-driven-programming.lisp @@ -1,6 +1,7 @@ (defpackage #:sdl2-tutorial-03-event-driven-programming (:use :cl) - (:export :run)) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) (in-package :sdl2-tutorial-03-event-driven-programming) @@ -18,15 +19,14 @@ ,@body)))) (defun load-image (pathname) - (let* ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial))) - (image (sdl2:load-bmp fullpath))) + (let ((image (sdl2:load-bmp pathname))) (if (autowrap:wrapper-null-p image) - (error "cannot load image ~a (check that file exists)" fullpath) + (error "cannot load image ~a (check that file exists)" pathname) image))) (defun run () (with-window-surface (window screen-surface) - (let ((image (load-image "./assets/03/exit.bmp"))) + (let ((image (load-image (asset-pathname #P"./assets/03/exit.bmp")))) (sdl2:with-event-loop (:method :poll) (:quit () t) (:idle () diff --git a/04-key-presses.lisp b/04-key-presses.lisp index f9a0336..ce8e38a 100644 --- a/04-key-presses.lisp +++ b/04-key-presses.lisp @@ -1,6 +1,7 @@ (defpackage #:sdl2-tutorial-04-key-presses (:use :cl) - (:export :run)) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) (in-package :sdl2-tutorial-04-key-presses) @@ -18,18 +19,17 @@ ,@body)))) (defun load-image (pathname) - (let* ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial))) - (image (sdl2:load-bmp fullpath))) + (let ((image (sdl2:load-bmp pathname))) (if (autowrap:wrapper-null-p image) - (error "cannot load image ~a (check that file exists)" fullpath) + (error "cannot load image ~a (check that file exists)" pathname) image))) (defun load-media () - (list :default (load-image "assets/04/press.bmp") - :up (load-image "assets/04/up.bmp") - :down (load-image "assets/04/down.bmp") - :left (load-image "assets/04/left.bmp") - :right (load-image "assets/04/right.bmp"))) + (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) diff --git a/05-optimized-surface-loading-and-soft-stretching.lisp b/05-optimized-surface-loading-and-soft-stretching.lisp index 53ec49e..e285037 100644 --- a/05-optimized-surface-loading-and-soft-stretching.lisp +++ b/05-optimized-surface-loading-and-soft-stretching.lisp @@ -1,6 +1,7 @@ (defpackage #:sdl2-tutorial-05-optimized-surface-loading-and-soft-stretching (:use :cl) - (:export :run)) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) (in-package :sdl2-tutorial-05-optimized-surface-loading-and-soft-stretching) @@ -18,15 +19,15 @@ ,@body)))) (defun load-surface (pathname pixel-format) - (let* ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial))) - (image (sdl2:load-bmp fullpath))) + (let ((image (sdl2:load-bmp pathname))) (if (autowrap:wrapper-null-p image) - (error "cannot load image ~a (check that file exists)" fullpath) + (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 "assets/05/stretch.bmp" (sdl2:surface-format-format 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) @@ -35,4 +36,6 @@ nil screen-surface rect) - (sdl2:update-window window)))))) + (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 index 226e48c..ce40cc6 100644 --- a/06-extension-libraries-and-loading-other-image-formats.lisp +++ b/06-extension-libraries-and-loading-other-image-formats.lisp @@ -1,6 +1,7 @@ (defpackage #:sdl2-tutorial-06-extension-libraries-and-loading-other-image-formats (:use :cl) - (:export :run)) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) (in-package :sdl2-tutorial-06-extension-libraries-and-loading-other-image-formats) @@ -20,18 +21,20 @@ (sdl2-image:quit))))) (defun load-surface (pathname pixel-format) - (let ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial)))) - (sdl2:convert-surface-format (sdl2-image:load-image fullpath) 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 "assets/06/loaded.png" (sdl2:surface-format-format 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)))))) + (sdl2:blit-scaled image-surface nil screen-surface rect) + (sdl2:update-window window))) + + ;; cleanup + (sdl2:free-surface image-surface)))) diff --git a/07-texture-loading-and-rendering.lisp b/07-texture-loading-and-rendering.lisp index cd761ee..eded968 100644 --- a/07-texture-loading-and-rendering.lisp +++ b/07-texture-loading-and-rendering.lisp @@ -1,6 +1,7 @@ (defpackage #:sdl2-tutorial-07-texture-loading-and-rendering (:use :cl) - (:export :run)) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) (in-package :sdl2-tutorial-07-texture-loading-and-rendering) @@ -17,18 +18,23 @@ (sdl2:with-renderer (,renderer ,window :index -1 :flags '(:accelerated)) ,@body)))) + (defun load-texture (renderer pathname) - (let ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial)))) - (sdl2:create-texture-from-surface renderer (sdl2-image:load-image fullpath)))) + (let ((surface (sdl2-image:load-image pathname))) + (prog1 (sdl2:create-texture-from-surface renderer surface) + (sdl2:free-surface surface)))) -(defun run() +(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 "assets/07/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/09-the-viewport.lisp b/09-the-viewport.lisp index b19e712..e05484e 100644 --- a/09-the-viewport.lisp +++ b/09-the-viewport.lisp @@ -1,6 +1,7 @@ (defpackage #:sdl2-tutorial-09-the-viewport (:use :cl) - (:export :run)) + (:export :run) + (:import-from :sdl2-tutorial-utils :asset-pathname)) (in-package :sdl2-tutorial-09-the-viewport) @@ -18,14 +19,15 @@ ,@body)))) (defun load-texture (renderer pathname) - (let ((fullpath (merge-pathnames pathname (asdf:system-source-directory :sdl2-tutorial)))) - (sdl2:create-texture-from-surface renderer (sdl2-image:load-image fullpath)))) + (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 "assets/09/texture.png"))) + (let ((texture (load-texture renderer (asset-pathname #P"assets/09/texture.png")))) (sdl2:with-event-loop (:method :poll) (:quit () t) (:idle () @@ -55,4 +57,6 @@ (sdl2:render-set-viewport renderer bottom-viewport) (sdl2:render-copy renderer texture)) - (sdl2:render-present renderer)))))) + (sdl2:render-present renderer))) + ;; cleanup + (sdl2:destroy-texture texture)))) diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index 1767e50..9d52855 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -3,7 +3,8 @@ :version "0.0.1" :licence "Public Domain" :depends-on ("bordeaux-threads" "sdl2" "sdl2-image" "sdl2-ttf") - :components ((:file "01-hello-sdl") + :components ((:file "utils") + (:file "01-hello-sdl") (:file "02-getting-an-image-on-the-screen") (:file "03-event-driven-programming") (:file "04-key-presses") 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))) From ae593ad31e46905a1734e7936e7c9438ed977f2e Mon Sep 17 00:00:00 2001 From: TatriX Date: Thu, 29 Jul 2021 22:21:38 +0200 Subject: [PATCH 17/30] Refactor tutorial 10 --- 10/tutorial-10.lisp => 10-color-keying.lisp | 53 +++++++++++--------- {10 => assets/10}/background.png | Bin {10 => assets/10}/player.png | Bin 3 files changed, 29 insertions(+), 24 deletions(-) rename 10/tutorial-10.lisp => 10-color-keying.lisp (54%) rename {10 => assets/10}/background.png (100%) rename {10 => assets/10}/player.png (100%) diff --git a/10/tutorial-10.lisp b/10-color-keying.lisp similarity index 54% rename from 10/tutorial-10.lisp rename to 10-color-keying.lisp index 4c9d341..dac4510 100644 --- a/10/tutorial-10.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/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 From 701ef6ebd60105526e785b83ebcfb90b13ce8939 Mon Sep 17 00:00:00 2001 From: TatriX Date: Thu, 29 Jul 2021 22:34:05 +0200 Subject: [PATCH 18/30] Move sdl2 installation docs to separate files --- README.md | 47 ++++++++++------------------------------------- README_LINUX.md | 12 ++++++++++++ README_MACOS.md | 29 +++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 37 deletions(-) create mode 100644 README_LINUX.md create mode 100644 README_MACOS.md diff --git a/README.md b/README.md index 3759671..de6f6b4 100644 --- a/README.md +++ b/README.md @@ -6,42 +6,7 @@ Adapted from http://lazyfoo.net/tutorials/SDL/ 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: - -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. - -### 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 + See instructions for [Linux](README_LINUX.md) and [macOS](README_MACOS.md) respectively. ## Installation @@ -52,9 +17,17 @@ git clone https://github.com/TatriX/cl-sdl2-tutorial/ ~/quicklisp/local-projects ``` ```lisp -> (ql:quickload :sdl2-tutorial) +(ql:quickload :sdl2-tutorial) +``` + +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 diff --git a/README_LINUX.md b/README_LINUX.md new file mode 100644 index 0000000..b252c57 --- /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-2.0 libsdl2-image-2.0 libsdl2-ttf-2.0 + +## 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. From 3722e3562fb9e965edcd46cb1abf44f9be14b018 Mon Sep 17 00:00:00 2001 From: TatriX Date: Wed, 4 Aug 2021 10:33:30 +0200 Subject: [PATCH 19/30] Bump version --- sdl2-tutorial.asd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdl2-tutorial.asd b/sdl2-tutorial.asd index 9d52855..bb38823 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -1,6 +1,7 @@ (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") :components ((:file "utils") From 4bda7d91886081fc3ec46e652378dbc4f736f86e Mon Sep 17 00:00:00 2001 From: TatriX Date: Wed, 4 Aug 2021 10:33:41 +0200 Subject: [PATCH 20/30] Add CI using github actions --- .github/workflows/ci.yml | 29 +++++++++++++++++++++++++++++ sdl2-tutorial.asd | 9 ++++++++- tests/test.ros | 17 +++++++++++++++++ tests/tests.lisp | 7 +++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ci.yml create mode 100755 tests/test.ros create mode 100644 tests/tests.lisp 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/sdl2-tutorial.asd b/sdl2-tutorial.asd index bb38823..7f6e217 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -20,4 +20,11 @@ (:file "13/tutorial-13") (:file "14/tutorial-14") (:file "15/tutorial-15") - (:file "16/tutorial-16"))) + (:file "16/tutorial-16")) + :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/tests/test.ros b/tests/test.ros new file mode 100755 index 0000000..d47c6c2 --- /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)) + (asdf:test-system :sdl2-tutorial)) +;;; 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)) From 1e6836c6228694a6494dc43a98ba3c5b32eebf2c Mon Sep 17 00:00:00 2001 From: TatriX Date: Wed, 4 Aug 2021 12:18:50 +0200 Subject: [PATCH 21/30] Add CI badge to readme --- README.md | 2 ++ README_LINUX.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index de6f6b4..ea28450 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![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/ diff --git a/README_LINUX.md b/README_LINUX.md index b252c57..704be81 100644 --- a/README_LINUX.md +++ b/README_LINUX.md @@ -5,7 +5,7 @@ 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 + apt install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev ## Arch From 7f9bb53afbe65e8256278497aad3c8d3a54ac777 Mon Sep 17 00:00:00 2001 From: TatriX Date: Wed, 4 Aug 2021 13:20:44 +0200 Subject: [PATCH 22/30] Ensure CI job fails if any test fails --- tests/test.ros | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test.ros b/tests/test.ros index d47c6c2..9410a3e 100755 --- a/tests/test.ros +++ b/tests/test.ros @@ -13,5 +13,5 @@ exec ros -Q -- $0 "$@" (defun main (&rest argv) (declare (ignorable argv)) - (asdf:test-system :sdl2-tutorial)) + (parachute:test-toplevel :sdl2-tutorial-tests)) ;;; vim: set ft=lisp lisp: From 401c62df482719dbac565fcd627ebba2a45e58e1 Mon Sep 17 00:00:00 2001 From: TatriX Date: Wed, 25 Aug 2021 22:20:54 +0200 Subject: [PATCH 23/30] Refactor tutorial 11 --- ...> 11-clip-rendering-and-sprite-sheets.lisp | 63 +++++++++--------- {11 => assets/11}/spritesheet.png | Bin sdl2-tutorial.asd | 2 +- 3 files changed, 33 insertions(+), 32 deletions(-) rename 11/tutorial-11.lisp => 11-clip-rendering-and-sprite-sheets.lisp (55%) rename {11 => assets/11}/spritesheet.png (100%) diff --git a/11/tutorial-11.lisp b/11-clip-rendering-and-sprite-sheets.lisp similarity index 55% rename from 11/tutorial-11.lisp rename to 11-clip-rendering-and-sprite-sheets.lisp index d4ff3f8..79e4d43 100644 --- a/11/tutorial-11.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/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/sdl2-tutorial.asd b/sdl2-tutorial.asd index 7f6e217..ccf7e90 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -15,7 +15,7 @@ (:file "08-geometry-rendering") (:file "09-the-viewport") (:file "10-color-keying") - (:file "11/tutorial-11") + (:file "11-clip-rendering-and-sprite-sheets") (:file "12/tutorial-12") (:file "13/tutorial-13") (:file "14/tutorial-14") From 8041d52f572a16b13936ac0051360361333694d1 Mon Sep 17 00:00:00 2001 From: TatriX Date: Sun, 19 Sep 2021 11:07:32 +0200 Subject: [PATCH 24/30] Refactor tutorial 12 --- 12/tutorial-12.lisp => 12-color-modulation.lisp | 15 ++++++++------- {12 => assets/12}/texture.png | Bin sdl2-tutorial.asd | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) rename 12/tutorial-12.lisp => 12-color-modulation.lisp (89%) rename {12 => assets/12}/texture.png (100%) diff --git a/12/tutorial-12.lisp b/12-color-modulation.lisp similarity index 89% rename from 12/tutorial-12.lisp rename to 12-color-modulation.lisp index d6c803f..bcfa908 100644 --- a/12/tutorial-12.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/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/sdl2-tutorial.asd b/sdl2-tutorial.asd index ccf7e90..ec6a897 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -16,7 +16,7 @@ (:file "09-the-viewport") (:file "10-color-keying") (:file "11-clip-rendering-and-sprite-sheets") - (:file "12/tutorial-12") + (:file "12-color-modulation") (:file "13/tutorial-13") (:file "14/tutorial-14") (:file "15/tutorial-15") From 865902dbe1fc50b34f08bbac40c7f06c133208fa Mon Sep 17 00:00:00 2001 From: TatriX Date: Mon, 20 Sep 2021 17:17:59 +0200 Subject: [PATCH 25/30] Refactor tutorial 13 --- 13/tutorial-13.lisp => 13-alpha-blending.lisp | 17 +++++++++-------- {13 => assets/13}/fadein.png | Bin {13 => assets/13}/fadeout.png | Bin sdl2-tutorial.asd | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) rename 13/tutorial-13.lisp => 13-alpha-blending.lisp (86%) rename {13 => assets/13}/fadein.png (100%) rename {13 => assets/13}/fadeout.png (100%) diff --git a/13/tutorial-13.lisp b/13-alpha-blending.lisp similarity index 86% rename from 13/tutorial-13.lisp rename to 13-alpha-blending.lisp index 0f62a18..2b74747 100644 --- a/13/tutorial-13.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/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/sdl2-tutorial.asd b/sdl2-tutorial.asd index ec6a897..eecee57 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -17,7 +17,7 @@ (:file "10-color-keying") (:file "11-clip-rendering-and-sprite-sheets") (:file "12-color-modulation") - (:file "13/tutorial-13") + (:file "13-alpha-blending") (:file "14/tutorial-14") (:file "15/tutorial-15") (:file "16/tutorial-16")) From 2bf5b6c741c51d5224429d58c27d41d66ec7dcfd Mon Sep 17 00:00:00 2001 From: Yan Date: Sat, 8 Jan 2022 01:56:38 +0100 Subject: [PATCH 26/30] Refactor tutorial 14 --- ...14.lisp => 14-animated-sprites-and-vsync.lisp | 15 ++++++++------- {14 => assets/14}/character.png | Bin sdl2-tutorial.asd | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) rename 14/tutorial-14.lisp => 14-animated-sprites-and-vsync.lisp (89%) rename {14 => assets/14}/character.png (100%) diff --git a/14/tutorial-14.lisp b/14-animated-sprites-and-vsync.lisp similarity index 89% rename from 14/tutorial-14.lisp rename to 14-animated-sprites-and-vsync.lisp index 05def6b..428617a 100644 --- a/14/tutorial-14.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/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/sdl2-tutorial.asd b/sdl2-tutorial.asd index eecee57..70f1883 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -18,7 +18,7 @@ (:file "11-clip-rendering-and-sprite-sheets") (:file "12-color-modulation") (:file "13-alpha-blending") - (:file "14/tutorial-14") + (:file "14-animated-sprites-and-vsync") (:file "15/tutorial-15") (:file "16/tutorial-16")) :in-order-to ((test-op (test-op "sdl2-tutorial/tests")))) From cfec61dc402d162ae679a8f8563dc1525251a722 Mon Sep 17 00:00:00 2001 From: Yan Date: Sat, 8 Jan 2022 02:02:29 +0100 Subject: [PATCH 27/30] Refactor tutorial 15 --- ...rial-15.lisp => 15-rotation-and-flipping.lisp | 15 ++++++++------- {15 => assets/15}/arrow.png | Bin sdl2-tutorial.asd | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) rename 15/tutorial-15.lisp => 15-rotation-and-flipping.lisp (89%) rename {15 => assets/15}/arrow.png (100%) diff --git a/15/tutorial-15.lisp b/15-rotation-and-flipping.lisp similarity index 89% rename from 15/tutorial-15.lisp rename to 15-rotation-and-flipping.lisp index 99699a0..9d980e8 100644 --- a/15/tutorial-15.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/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/sdl2-tutorial.asd b/sdl2-tutorial.asd index 70f1883..baea08f 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -19,7 +19,7 @@ (:file "12-color-modulation") (:file "13-alpha-blending") (:file "14-animated-sprites-and-vsync") - (:file "15/tutorial-15") + (:file "15-rotation-and-flipping") (:file "16/tutorial-16")) :in-order-to ((test-op (test-op "sdl2-tutorial/tests")))) From 33bba60a9b83e97d31761dc0b893db7f1808bb1f Mon Sep 17 00:00:00 2001 From: Yan Date: Sat, 8 Jan 2022 02:15:42 +0100 Subject: [PATCH 28/30] Refactor tutorial 16 --- ...utorial-16.lisp => 16-true-type-fonts.lisp | 22 +++++++++++------- {16 => assets/16}/Pacifico.ttf | Bin sdl2-tutorial.asd | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) rename 16/tutorial-16.lisp => 16-true-type-fonts.lisp (86%) rename {16 => assets/16}/Pacifico.ttf (100%) diff --git a/16/tutorial-16.lisp b/16-true-type-fonts.lisp similarity index 86% rename from 16/tutorial-16.lisp rename to 16-true-type-fonts.lisp index 367933f..05b8c41 100644 --- a/16/tutorial-16.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 @@ -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,7 @@ (render texture (round (/ (- *screen-width* (tex-width texture)) 2)) (round (/ (- *screen-height* (tex-height texture)) 2))) - (sdl2:render-present renderer)))) + (sdl2:render-present renderer))) + (free-tex texture)) (sdl2-ttf:quit) (sdl2-image:quit))) 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/sdl2-tutorial.asd b/sdl2-tutorial.asd index baea08f..7350e3a 100644 --- a/sdl2-tutorial.asd +++ b/sdl2-tutorial.asd @@ -20,7 +20,7 @@ (:file "13-alpha-blending") (:file "14-animated-sprites-and-vsync") (:file "15-rotation-and-flipping") - (:file "16/tutorial-16")) + (:file "16-true-type-fonts")) :in-order-to ((test-op (test-op "sdl2-tutorial/tests")))) From ea0d2fef50c0408f76f04d6b0713f82ccfee08b7 Mon Sep 17 00:00:00 2001 From: Yan Date: Sat, 8 Jan 2022 02:17:55 +0100 Subject: [PATCH 29/30] Get rid of warning in tutorial 16 by setting default flip to :none WARNING: Unknown mask symbol NIL, treated as 0; expected one of: (:HORIZONTAL :NONE :VERTICAL) --- 16-true-type-fonts.lisp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/16-true-type-fonts.lisp b/16-true-type-fonts.lisp index 05b8c41..dd28629 100644 --- a/16-true-type-fonts.lisp +++ b/16-true-type-fonts.lisp @@ -51,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 From bfa61c4cb671f1a7373363c31e3ebfad268aa378 Mon Sep 17 00:00:00 2001 From: Yan Date: Sat, 8 Jan 2022 02:56:57 +0100 Subject: [PATCH 30/30] Add clean up comment to tutorial 16 Consistency... --- 16-true-type-fonts.lisp | 1 + 1 file changed, 1 insertion(+) diff --git a/16-true-type-fonts.lisp b/16-true-type-fonts.lisp index dd28629..82d328d 100644 --- a/16-true-type-fonts.lisp +++ b/16-true-type-fonts.lisp @@ -89,6 +89,7 @@ (round (/ (- *screen-width* (tex-width texture)) 2)) (round (/ (- *screen-height* (tex-height texture)) 2))) (sdl2:render-present renderer))) + ;; clean up (free-tex texture)) (sdl2-ttf:quit) (sdl2-image:quit)))