aboutsummaryrefslogtreecommitdiffhomepage
path: root/examples/06-sprite.lisp
blob: 2d737e55d7e3c177b41e1a9a109fb663c42ef064 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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)))))