aboutsummaryrefslogtreecommitdiffhomepage
path: root/examples/12-canvas-drawing-language.lisp
blob: 526ec2d30790903772a933163e173626aef24e20 (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
;;;; examples/13-canvas-drawing-language.lisp

(defpackage #:ww.examples/12
  (:use #:cl)
  (:export #:start))

(in-package :ww.examples/12)

(defclass canvas-lang-demo (ww:application) ())

(ww:defhandler quit
    (ww::on-keydown (app scancode)
      (when (eql :scancode-q scancode)
        (ww::stop))))

(ww:defhandler clear-and-draw
    (ww::on-perframe (canvas time)
      (ww::clear-canvas canvas :r 255 :g 255 :b 255)
      (draw-stuff canvas time)
      (ww::blit canvas)))

(defun triangle-at (x y)
    (ww::move-to x y)
    (ww::stroke-rel 150 0)
    (ww::stroke-rel 0 130)
    (ww::stroke-rel -150 -130))

(defun filled-triangle-at (x y)
  (ww::move-to x y)
  (ww::fill-rel-path
   '((-10 100)
     (10 -30))))

(defun draw-stuff (canvas time)
  (declare (ignorable time))
  (ww::with-canvas canvas
    (triangle-at 100 100)
    (filled-triangle-at 200 200)))

(defmethod ww:boot ((app canvas-lang-demo ))
  (let ((canvas
          (make-instance 'ww:canvas
                         :pixel-width 500
                         :pixel-height 500)))
    ;; stretch canvas over the whole app
    (setf (ww:width canvas) (ww::application-width app)
          (ww:height canvas) (ww::application-height app))

    ;; add it to the display tree
    (ww:add-unit app canvas)

    ;; handlers
    (ww::add-handler canvas #'clear-and-draw)
    (ww:add-handler app #'quit)
    (ww:add-handler canvas #'quit)))

(defun start (&optional (side 500))
  (ww::start
   (make-instance
    'canvas-lang-demo
    :fps 10
    :width side
    :height side
    :title "Canvas demo")))