aboutsummaryrefslogtreecommitdiffhomepage
path: root/examples/03-font-render.lisp
blob: de3c487905f5c1aebed48f6c553045dc85282058 (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
;;; 03-font-render.lisp

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

(in-package #:ww.examples/3)

(defclass font-display (ww::application) ())

(defun random-text-color ()
  (make-array 4 :initial-contents (list (random 1.0) (random 1.0) (random 1.0) 1.0)))

(ww::defhandler change-text-color
    (ww::on-keydown ()
      "Press any key to change the color of the text"
      (format t "Pressed a key, changing the color~%")
      (setf (ww::text-color target) (random-text-color))

      (with-accessors ((x ww::x) (y ww::y) (w ww::width) (h ww::height)) target 
        (format t "x:~a,y:~a,width:~a,height:~a~%" x y w h))))

(ww::defhandler marquee
    (ww::on-perframe ()
      (when (< 900 (ww::x target))
        (setf (ww::x target)
              -800))
      (incf (ww::x target) 5 )))

(defvar *spin-table* (make-hash-table :synchronized t))

(ww::defhandler spin
    (ww::on-perframe ()
      (let ((rot 
              (gethash target *spin-table* 0.0)))
        (if (< rot (* 8 pi)) 
            (setf
             (gethash target *spin-table*) (+ rot 0.88)
             (ww::text-color target) (random-text-color)
             (ww::rotation target) rot)
            (progn
              (setf (ww::rotation target) 0.0) 
              (ww::remove-handler target #'spin)
              (remhash target *spin-table*))))))

(ww::defhandler twirl-on-click
    (ww::on-mousedown ()
      (ww::add-handler target #'spin)))

(defmethod ww::boot ((app font-display))
  (let ((hello
          (make-instance
           'ww::text
           ;:content "Hell! Oh World ..."
           :content (format nil "Hell!~%Oh World...")
           :font (ww::get-asset "Ticketing.ttf" :asset-args '(:oversample 2))))
        (instructions
          (make-instance
           'ww::text
           :content "Click to spin. Press any key to change color."
           :font (ww::get-asset "Ticketing.ttf"))))
 
    (ww::scale-by  hello 3.0)
    (setf
     (ww::x hello) (* 0.5 (- 800 (ww::width hello))) 
     (ww::y hello) (* 0.5 (- 600 (ww::height hello))))
    (ww::add-handler hello #'marquee)
    (ww::add-handler hello #'change-text-color)
    (ww::add-handler hello #'twirl-on-click)
    (ww::refocus-on hello)
    (ww::add-unit hello)

    (ww::scale-by instructions 2.0)
    (setf
     (ww::x instructions) (* 0.5 (- 800 (ww::width instructions))))
    (ww::add-unit instructions)))


(defun start ()
  (ww::start (make-instance
              'font-display
              :fps 60
              :refocus-on-mousedown-p nil
              :width 800
              :height 600
              :title "Wheelwork Example: Font display"
              :asset-root (merge-pathnames
                           "examples/"
                           (asdf:system-source-directory :wheelwork)))))