Update of /project/pal/cvsroot/pal/examples In directory clnet:/tmp/cvs-serv13905/examples
Modified Files: hares.lisp hello.lisp polygons.lisp swarm.lisp teddy.lisp Log Message: Rest of the api changes applied.
--- /project/pal/cvsroot/pal/examples/hares.lisp 2007/06/28 20:14:05 1.1 +++ /project/pal/cvsroot/pal/examples/hares.lisp 2007/07/13 21:30:58 1.2 @@ -32,8 +32,10 @@ (set-blend-color (r-of s) (g-of s) (b-of s) 255) (draw-image (image-of s) (pos-of s) - (angle-of s) - (scale-of s))) + :halign :middle + :valign :middle + :angle (angle-of s) + :scale (scale-of s)))
(defmethod act ((s sprite)) (setf (angle-of s) (mod (+ (angle-of s) 1f0) 360)) @@ -52,7 +54,7 @@
(defun example () - (with-pal (:width 800 :height 600 :fullscreenp nil :fps 6000) + (with-pal (:width 800 :height 600 :fullscreenp nil :fps 6000 :paths (merge-pathnames "examples/" pal::*pal-directory*)) (setf *sprites* nil) (set-cursor nil)
@@ -70,11 +72,11 @@ :angle (random 360f0)))
(event-loop () - (draw-image-from (tag 'bg) - (v 0 0) - (v 0 0) - (get-screen-width) - (get-screen-height)) + (draw-image* (tag 'bg) + (v 0 0) + (v 0 0) + (get-screen-width) + (get-screen-height)) (with-blend (:mode *blend-mode*) (dolist (i *sprites*) (draw i) --- /project/pal/cvsroot/pal/examples/hello.lisp 2007/07/03 18:42:33 1.4 +++ /project/pal/cvsroot/pal/examples/hello.lisp 2007/07/13 21:30:58 1.5 @@ -3,17 +3,22 @@
(defun hello-1 () - (pal:with-pal (:paths "/path/to/examples/") + (pal:with-pal (:title "Hello!" :paths (merge-pathnames "examples/" pal::*pal-directory*)) (let ((font (pal:load-font "georgia"))) - (pal:draw-text "Hello from PAL" - (pal:v-round - (pal:v (/ (- (pal:get-screen-width) - (pal:get-text-size "Hello from PAL" font)) - 2) - (/ (- (pal:get-screen-height) - (pal:get-font-height font)) - 2))) - font)) + (loop for y from 0 to 300 by 2 do + (pal:draw-line (pal:v 0 (* y 2)) (pal:v 800 (* y 2)) + 50 50 255 (truncate y 2))) + (let ((midpoint (pal:v-round + (pal:v (/ (- (pal:get-screen-width) + (pal:get-text-size "Hello from PAL" font)) + 2) + (/ (- (pal:get-screen-height) + (pal:get-font-height font)) + 2))))) + (pal:set-blend-color 0 0 0 255) + (pal:draw-text "Hello from PAL" (pal:v+ midpoint (pal:v 5 5)) font) + (pal:reset-blend-mode) + (pal:draw-text "Hello from PAL" midpoint font))) (pal:wait-keypress)))
;; (hello-1) --- /project/pal/cvsroot/pal/examples/polygons.lisp 2007/07/13 13:21:04 1.1 +++ /project/pal/cvsroot/pal/examples/polygons.lisp 2007/07/13 21:30:58 1.2 @@ -3,22 +3,34 @@ (in-package :poly-tests)
-(with-pal () +(with-pal (:paths (merge-pathnames "examples/" pal::*pal-directory*)) (let ((grid (load-image "bg2.png")) + (plane (load-image "lego-plane.png" t)) (slad (load-image "save_lisp.gif")) (teddy (load-image "yellow-teddy.png"))) (event-loop ()
- ;; DRAW-RECTANGLE just draws a filled or wireframe rectangle on screen - (draw-rectangle (v 0 0) 800 600 - 0 0 0 32 :filledp t) + 0 0 0 32) ;; Draw a black, transparent rectangle over the scene. + ;; (clear-screen 0 0 0) ;; Use this instead if the afterimages give you a headache. + + ;; DRAW-IMAGE draw the whole image at given position. Keyword arguments can be given to define the + ;; scale, angle and horizontal and vertical alignment ("hotspot") + + (draw-image plane + (v 700 500) + :halign :middle ;; Possible options are :left, :right and :middle. :left is the default. + :valign :bottom ;; -''- :top, :bottom, :middle. :top is the default. + :angle (v-angle (v-direction (v 700 500) (get-mouse-pos))) ;; angle in degrees + :scale (* (v-distance (v 700 500) (get-mouse-pos)) .01f0)) + + (draw-point (v 700 500) 255 0 0 255 :size 10f0) ;; Draw a red point at the hotspot of previous image.
;; DRAW-POLYGON draw a polygon which vertexes are given as a list of VECs. - ;; FILL is either nil, true or image that is used as a pattern. If fill is an image the rgba values are not used. + ;; FILL is either nil, t or image that is used as a pattern. If fill is an image the rgba values have no effect. ;; When ABSOLUTEP is T image patterns position is decided by screen coordinates. - + ;; Max value of SIZE depends on the OpenGL implementation, you probably shouldn't use values greater than 10f0
(with-transformation (:pos (v 100 100)) (draw-polygon (list (v -100 0) @@ -35,34 +47,39 @@ (v -50 100) ) 255 0 0 255 - :fill nil :size 5f0 + :fill nil :size 4f0 :absolutep nil))
- ;; Note: next one doesn't work like you might expect since the image size is rounded up - ;; to the nearest power of two and the extra is filled with blank. - - (with-blend (:color '(255 255 255 20)) - (draw-polygon (list (v+ (get-mouse-pos) (v -100 -100)) - (v+ (get-mouse-pos) (v 100 -100)) - (v+ (get-mouse-pos) (v 100 100)) - (v+ (get-mouse-pos) (v -100 100))) - 0 0 0 0 - :absolutep t - :fill slad))
- ;; DRAW-IMAGE-FROM draws a part of image, defined by a starting point, width and height. - ;; If width or height are larger than the source image the image is tiled + ;; DRAW-RECTANGLEs arguments are similar to DRAW-POLYGON + ;; Notice how the size of the actual SLAD image used is expanded up to the nearest power of two and the extra space is filled with blank, + ;; usually this happens transparently to the user (eg. image-width returns the original width of image) but in some cases + ;; it can cause some artifacts. In this case if the original image had width and height of power of two it would be seamlessly + ;; tiled across the screen. + ;; For example, image of size 65x30 will be expanded to the size 128x32, so it is a + ;; good idea to try and fit the image sizes inside the nearest power of two to save memory. + + (with-blend (:color '(255 255 255 128)) + (draw-rectangle (get-mouse-pos) + 100 100 + 0 0 0 0 + :absolutep t + :fill slad))
- (draw-image-from teddy (v 0 (get-mouse-y)) - (v (get-mouse-x) 0) - (truncate (image-width teddy) 2) - (get-screen-height)) - (draw-image-from teddy (v (truncate (image-width teddy) 2) (get-mouse-y) ) - (v (- (get-screen-width) (get-mouse-x)) 0) - (truncate (image-width teddy) 2) - (get-screen-height))
- ;; (draw-quad ...) to be done + ;; DRAW-IMAGE* draws a part of image, defined by a starting point, width and height. + ;; If width or height are larger than the source image the image is tiled + ;; Like with DRAW-POLYGON non-power-of-two image sizes can give unexpected results.
- ))) \ No newline at end of file + (let ((x (abs (- 400 (get-mouse-x))))) + (draw-image* teddy + (v 0 (get-mouse-y)) + (v x 0) + (truncate (image-width teddy) 2) + (get-screen-height)) + (draw-image* teddy + (v (truncate (image-width teddy) 2) (get-mouse-y) ) + (v (- (get-screen-width) x) 0) + (truncate (image-width teddy) 2) + (get-screen-height)))))) \ No newline at end of file --- /project/pal/cvsroot/pal/examples/swarm.lisp 2007/07/03 18:42:33 1.2 +++ /project/pal/cvsroot/pal/examples/swarm.lisp 2007/07/13 21:30:58 1.3 @@ -9,13 +9,13 @@ (setf vectors (append vectors (loop repeat 50 collecting (cons (pal:get-mouse-pos) (pal:v-random 5f0)))))))) (pal:draw-rectangle (pal:v 0 0) 1024 768 0 0 0 128) - (pal:with-blend (:r 255 :g 128 :b 128 :a 255) + (pal:with-blend (:color '(255 128 128 255)) (pal:draw-text "Use left mousekey to add particles." (pal:v 0 0)))
(let ((midpoint (pal:v/ (reduce 'pal:v+ vectors :initial-value (pal:v 0 0) :key 'car) (max 1f0 (coerce (length vectors) 'single-float))))) - (pal:draw-point midpoint 255 0 0 255 10f0) + (pal:draw-point midpoint 255 0 0 255 :size 10f0) (setf vectors (mapcar (lambda (v) (cons (pal:v+ (car v) (cdr v)) (pal:v* (pal:v+ (cdr v) @@ -31,6 +31,6 @@ (pal:draw-arrow (car v) (pal:v+ (car v) (cdr v)) 10 7 0 255 - 10f0))))))) + :size 10f0)))))))
;; (swarm) \ No newline at end of file --- /project/pal/cvsroot/pal/examples/teddy.lisp 2007/07/01 22:49:25 1.2 +++ /project/pal/cvsroot/pal/examples/teddy.lisp 2007/07/13 21:30:58 1.3 @@ -22,6 +22,7 @@ (defclass sprite () ((pos :accessor pos-of :initarg :pos :initform (v 0 0)) (vel :accessor vel-of :initarg :vel :initform (v 0 0)) + (alt :accessor alt-of :initarg :alt :initform 10) (image :accessor image-of :initarg :image) (angle :accessor angle-of :initarg :angle :initform 0f0)))
@@ -36,7 +37,9 @@ (defmethod draw ((s sprite)) (draw-image (image-of s) (pos-of s) - (angle-of s))) + :valign :middle + :halign :middle + :angle (angle-of s)))
@@ -64,15 +67,19 @@
(defun example () - (with-pal (:width 800 :height 600 :fullscreenp nil :fps 60) + (with-pal (:width 800 :height 600 :fullscreenp nil :fps 60 :paths (merge-pathnames "examples/" pal::*pal-directory*)) ;; inits PAL, the args used are the default values. - ;; NOTE: fix the PATHS to point to the location of the resource files - ;; PATHS is a pathname or list of pathnames that defines paths that the LOAD-* functions use for finding resources. + ;; PATHS is a pathname or list of pathnames that PAL uses to find the resource files loaded with LOAD-* functions. + ;; By default PATHS contains the PAL source directory and value of *default-pathname-defaults* ;; only call PAL functions (with the expection of DEFINE-TAGS forms) inside WITH-PAL or between OPEN-PAL and CLOSE-PAL
(setf *sprites* nil) + + ;; Hide the mouse cursor and use cursor.png instead. 18,18 is the offset ("hotspot") for the cursor image + ;; Other possible options to cursor are: t - show the default cursor, nil - hide all cursors (set-cursor (tag 'cursor) (v 18 18)) - (make-instance 'plane) + + (make-instance 'plane :alt 20) (dotimes (i 20) (make-instance 'mutant-teddy :pos (v (random (get-screen-width)) @@ -82,35 +89,47 @@
(event-loop () ;; simple event loop, no mouse-move, key-down etc. handlers defined, we'll handle input explicitly with TEST-KEYS. - ;; the default key-down handler quits the event-loop when ESC is pressed. - ;; to define e.g. a key-handler use a form like (event-loop (:key-down-handler (lambda (key) ...)) ...) + ;; The default key-down handler quits the event-loop when ESC is pressed, if you define your own key-down-handler + ;; don't forget to make sure there is a way to quit pal (especially when in fullscreen). + ;; to define e.g. a key-handler use a form like (event-loop (:key-down-fn (lambda (key) ...)) ...) ;; you can quit the event loop with (return-from event-loop)
;; first, draw a scrolling tiled background - (draw-image-from (tag 'tile) - (v 0 0) - (v 0 (- *y-scroll* 64)) - (get-screen-width) - (+ (get-screen-height) 64)) + (draw-image* (tag 'tile) + (v 0 0) + (v 0 (- *y-scroll* 64)) + (get-screen-width) + (+ (get-screen-height) 64)) (setf *y-scroll* (mod (+ *y-scroll* 1) 64))
- ;; then the sprites + ;; then the sprites, first the shadows + ;; sorting the sprites and their shadows according to their altitude is left as an exercise to the reader + + (with-blend (:color '(0 0 0 128)) + (dolist (i *sprites*) + (with-transformation (:pos (v (alt-of i) (alt-of i))) + (draw i)))) + (with-blend (:mode *blend-mode*) (dolist (i *sprites*) (draw i) + + ;; Let's do this for CLisp or we might a get nasty floating-point-undereflow error in the vector operations. #+CLISP (ext:without-floating-point-underflow (act i)) #-CLISP (act i)))
+ ;; TEST-KEYS is used to check if some key is currently pressed, _all_ the matching forms are evaluated. (test-keys (:key-1 (setf *blend-mode* nil) (message *blend-mode*)) (:key-2 (setf *blend-mode* :blend) (message *blend-mode*)) - (:key-3 (setf *blend-mode* :additive) - (message *blend-mode*))) + ;; We can also test for several keys at once: + ((:key-3 :key-space :key-mouse-1) (setf *blend-mode* :additive) + (message *blend-mode*)))
- (draw-fps) + (draw-fps) ;; Draw the frames/second counter to the top left corner. (draw-text "Press key to select blend-mode:" (v 200 (* 0 (get-font-height)))) (draw-text "1=nil 2=:blend 3=:additive" (v 200 (* 1 (get-font-height)))))))