From 59f5cb6c28399c84221b728daf4bd8461ab1e230 Mon Sep 17 00:00:00 2001 From: Colin Okay Date: Fri, 1 Jul 2022 10:53:47 -0500 Subject: [add] sprite class and example --- examples/05-frameset-animation.lisp | 5 +- examples/06-sprite.lisp | 96 +++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 examples/06-sprite.lisp (limited to 'examples') diff --git a/examples/05-frameset-animation.lisp b/examples/05-frameset-animation.lisp index 4686ecc..12207f3 100644 --- a/examples/05-frameset-animation.lisp +++ b/examples/05-frameset-animation.lisp @@ -1,7 +1,8 @@ ;;;; examples/05-frameset-animation.lisp (defpackage #:ww.examples/5 - (:use #:cl)) + (:use #:cl) + (:export #:start)) (in-package #:ww.examples/5) @@ -35,7 +36,7 @@ :fps 30 :width 800 :height 600 - :title "Wheelwork Example: An Animated Sprite" + :title "Wheelwork Example: A framebased animation" :asset-root (merge-pathnames "examples/" (asdf:system-source-directory :wheelwork))))) diff --git a/examples/06-sprite.lisp b/examples/06-sprite.lisp new file mode 100644 index 0000000..2d737e5 --- /dev/null +++ b/examples/06-sprite.lisp @@ -0,0 +1,96 @@ +;;;; examples/06-sprite.lisp + +(defpackage #:ww.examples/6 + (:use #:cl) + (:export #:start)) + +(in-package #:ww.examples/6) + +(defclass sprite-example (ww::application) ()) + +(defun set-key-if-not (sprite key ) + (unless (eql key (ww::frameset-key sprite)) + (setf (ww::runningp (ww::current-frameset sprite)) nil) + (setf (ww::frameset-key sprite) key)) + (unless (ww::runningp (ww::current-frameset sprite)) + (setf (ww::runningp (ww::current-frameset sprite)) t))) + +(define-symbol-macro +walking-speed+ 10) + +(ww::defhandler move-dude + (ww::on-keydown (target scancode) + (case scancode + (:scancode-left + (set-key-if-not target :left) + (decf (ww::x target) +walking-speed+)) + (:scancode-right + (set-key-if-not target :right) + (incf (ww::x target) +walking-speed+)) + (:scancode-up + (set-key-if-not target :back) + (incf (ww::y target) +walking-speed+)) + (:scancode-down + (set-key-if-not target :front) + (decf (ww::y target) +walking-speed+))))) + +(ww::defhandler stand + (ww::on-keyup (target) + (let ((current + (ww::current-frameset target))) + (setf (ww::runningp current) nil + (ww::frameset-index current) 0)))) + + +(defmethod ww::boot ((app sprite-example)) + (let* ((front + (ww::make-frameset + '("dude/Front_Stand.png" + "dude/Front_Left.png" + "dude/Front_Stand.png" + "dude/Front_Right.png") + :fps 3)) + (back + (ww::make-frameset + '("dude/Back_Stand.png" + "dude/Back_Left.png" + "dude/Back_Stand.png" + "dude/Back_Right.png") + :fps 3)) + (left + (ww::make-frameset + '("dude/Left_Stand.png" + "dude/Left_Left.png" + "dude/Left_Stand.png" + "dude/Left_Right.png") + :fps 3)) + (right + (ww::make-frameset + '("dude/Right_Stand.png" + "dude/Right_Left.png" + "dude/Right_Stand.png" + "dude/Right_Right.png") + :fps 3)) + (dude + (make-instance + 'ww::sprite + :framesets (list :front front + :back back + :left left + :right right) + :frameset-key :front))) + + (ww::add-handler dude #'move-dude) + (ww::add-handler dude #'stand) + (ww::refocus-on dude) + (ww::add-unit app dude))) + +(defun start () + (ww::start (make-instance + 'sprite-example + :fps 30 + :width 800 + :height 600 + :title "Wheelwork Example: An Animated Sprite" + :asset-root (merge-pathnames + "examples/" + (asdf:system-source-directory :wheelwork))))) -- cgit v1.2.3