aboutsummaryrefslogtreecommitdiff
path: root/game.scm
blob: b1258524f9801984558110e8e3c2972cd12766e4 (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
(import scheme
        (chicken base)
        (chicken process-context)
	(srfi 197)
        (only (list-utils alist) plist->alist)
        (prefix sdl2 "sdl2:")
        (prefix sdl2-ttf "ttf:")
        (prefix sdl2-image "img:")
        (downstroke engine)
        (downstroke world)
        (downstroke input)
        (downstroke physics)
        (downstroke assets)
        (downstroke entity)
        (downstroke sound)
	(downstroke tween)
        (downstroke scene-loader))

(define +debug?+ (and (member "--debug" (command-line-arguments)) #t))
;; Momentum, number of pixels/s a movement accelerates after pressing/release
(define +horizontal-momentum+ 0.01)
(define +wind-force+ 0.1)
(define +max-leaf-speed+ 3)

(set! *gravity* 0.1)

(define (make-leaf)
  (plist->alist (list #:type 'leaf
                      #:x 100 #:y 200
                      #:width 32 #:height 32
		      #:ax 0 #:ay 0
                      #:vx 0 #:vy 0
                      #:gravity? #t #:on-ground? #f
                      #:tile-id 41 #:tags '(leaf)
		      ;; #:tween (make-tween '((#:x . 100) (#:y . 200))
		      ;; 			  props: '((#:x . 120))
		      ;; 			  duration: 500
		      ;; 			  ease: 'linear
		      ;; 			  repeat: -1
		      ;; 			  yoyo?: #t)
		      )))

(define (clamp value maximum . args)
  (let ((minimum (if (null? args) (- maximum) (car args))))
    (max (min value maximum) minimum)))

(define (leaf-ax vx input)
  (cond ((input-held? input 'left) (- +wind-force+))
        ((input-held? input 'right)  +wind-force+)
        ((> vx 0.1) (- +horizontal-momentum+))
	((< vx -0.1) +horizontal-momentum+)
	(else 0)))

(define (update-leaf leaf input dt)
  (let ((ax (leaf-ax (entity-ref leaf #:vx) input)))
    (chain leaf
     (entity-set _ #:vx (clamp
			    (+ (entity-ref leaf #:vx) (* ax dt))
			    +max-leaf-speed+))
     ;; Clamp gravity
     (entity-set _ #:vy (clamp (entity-ref leaf #:vy) +max-leaf-speed+)))))

(define (scene-get-leaf scene)
  ;; leaf is being added as the first entity in the scene, so we can cheat here.
  (car (scene-entities scene)))

(define *game*
  (make-game
   title: "Free Fall" width: 320 height: 240
   debug?: +debug?+
   scale: 2

   preload: (lambda (game) game)

   create: (lambda (game)
	     (game-scene-set! game (chain (game-load-scene! game "level0.tmx")
					  (scene-add-entity _ (make-leaf))
					  (update-scene _ camera-target: 'leaf)
					  (update-scene _ background: '(173 216 230 255)))))

   update: (lambda (game dt)
             (let* ((input  (game-input game))
                    (scene  (game-scene game))
                    (leaf (update-leaf (scene-get-leaf scene) input dt)))
               (game-scene-set! game (update-scene scene entities: (list leaf)))))))

;; (game-run! *game*)