49e4e968321325f1aea332b6c58a62b8490cf86e
[uxul-world.git] / game.lisp
1 ;;; Copyright 2009 Christoph Senjak
2
3 (in-package :uxul-world)
4
5 (defparameter *cfont* nil)
6
7 (defun start-game (&key (music nil) room-function (15-fps nil))
8   "Start the Game: Call room-function for getting the room-object to
9 run. Music is ignored so far. 15-fps makes only every second frame be
10 drawn (for very slow computers)"
11      (sdl:with-init (sdl:sdl-init-video sdl:sdl-init-audio)
12        (sdl:window +screen-width+ +screen-height+
13                    :title-caption "Uxul World"
14                    :icon-caption "Uxul World"
15                    :flags (logior sdl:sdl-hw-accel  sdl:sdl-hw-surface)
16                    ;:flags (logior sdl:sdl-hw-surface) #| sdl:sdl-fullscreen )|# 
17 )
18        ;;(if music (sdl-mixer:OPEN-AUDIO :frequency 44100))
19        (let ((*graphics-table*
20               #-ecl (trivial-garbage:make-weak-hash-table
21                      :weakness :value
22                      :test #'equal)
23               #+ecl (make-hash-table :test #'equal)
24               ))         
25          (if 15-fps
26              (setf (sdl:frame-rate) 15)
27              (setf (sdl:frame-rate) 30))
28          
29          (setf *current-room* (funcall room-function))
30
31          (sdl:clear-display (sdl:color :r 0 :g 0 :b 0));; :update-p nil)
32
33          ;;(if music (sdl-mixer:play-sample levelmusic))
34       
35          (sdl:with-events ()
36            (:quit-event () 
37                         #|(if music
38                         (progn (sdl-mixer:halt-music)
39                         (sdl-mixer:halt-sample :channel t)
40                         (sdl-mixer:free levelmusic)
41                         (sdl-mixer:close-audio))
42                         t
43                         )|# t)
44            (:key-down-event (:key key)
45                             (cond
46                               ((sdl:key= key :SDL-KEY-ESCAPE)
47                                (sdl:push-quit-event))
48                               (T
49                                (on-key-down *current-room* key))))
50            (:key-up-event (:key key)
51                           (on-key-up *current-room* key))
52            (:idle
53             (progn
54               (invoke *current-room*)
55               (when 15-fps
56                 (invoke *current-room*))
57               (sdl:clear-display (sdl:color :r 128 :g 128 :b 128)); :update-p nil)
58               (draw *current-room*)
59               (sdl:update-display)
60          ))))))
61
62
63 ;; For Debugging
64
65 (defun preview-animation (frameskip &rest images)
66
67      (sdl:with-init (sdl:sdl-init-video sdl:sdl-init-audio)
68        (sdl:window +screen-width+ +screen-height+
69                    :title-caption "Uxul World"
70                    :icon-caption "Uxul World"
71                    :flags (logior sdl:sdl-hw-accel)
72                    #| :flags (logior sdl:sdl-hw-surface sdl:sdl-fullscreen )|#  )
73        (let ((*graphics-table*
74               #-ecl (trivial-garbage:make-weak-hash-table
75                      :weakness :value
76                      :test #'equal)
77               #+ecl (make-hash-table :test #'equal)
78               )
79              (my-anim (apply #'make-animation frameskip images))
80              )
81          
82          (setf (sdl:frame-rate) 30)
83          (sdl:clear-display (sdl:color :r 64 :g 64 :b 46));; :update-p nil)
84       
85          (sdl:with-events ()
86            (:quit-event () t)
87            (:key-down-event (:key key)
88                             (cond
89                               ((sdl:key= key :SDL-KEY-ESCAPE)
90                                (sdl:push-quit-event))))
91            (:idle
92             (progn
93               (sdl:clear-display (sdl:color :r 64 :g 64 :b 46));; :update-p nil)
94
95
96               (draw my-anim)
97               
98               (sdl:update-display)
99          ))))))