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*)
|