blob: 1be3968818746ad6f81cc1d7160f9576ef6f266e (
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
|
(import scheme
(chicken base)
(chicken random)
(prefix sdl2 "sdl2:")
(prefix sdl2-ttf "ttf:")
(prefix sdl2-image "img:")
downstroke/engine
downstroke/world
downstroke/tilemap
downstroke/renderer
downstroke/input
downstroke/physics
downstroke/assets
downstroke/entity)
(define *elapsed* 0)
(define *respawn-interval* 10000)
(define (spawn-entities)
(let loop ((i 0) (acc '()))
(if (= i 10)
acc
(loop (+ i 1)
(cons (list #:type 'box
#:x (+ 30 (* i 55))
#:y (+ 10 (* (pseudo-random-integer 4) 20))
#:width 16 #:height 16
#:vx 0 #:vy 0
#:gravity? #t
#:on-ground? #f
#:solid? #t
#:tile-id 1)
acc)))))
(define *game*
(make-game
title: "Demo: Physics Sandbox" width: 600 height: 400
preload: (lambda (game)
(game-asset-set! game 'tilemap
(load-tilemap "demo/assets/level-0.tmx")))
create: (lambda (game)
(let* ((tm (game-asset game 'tilemap))
(tex (sdl2:create-texture-from-surface
(game-renderer game)
(tileset-image (tilemap-tileset tm)))))
(game-scene-set! game
(make-scene
entities: (spawn-entities)
tilemap: tm
camera: (make-camera x: 0 y: 0)
tileset-texture: tex))))
update: (lambda (game dt)
(let* ((scene (game-scene game))
(tm (scene-tilemap scene)))
(set! *elapsed* (+ *elapsed* dt))
(when (>= *elapsed* *respawn-interval*)
(set! *elapsed* 0)
(scene-entities-set! scene (spawn-entities)))
(scene-update-entities scene
apply-gravity
apply-velocity-x
(lambda (e) (resolve-tile-collisions-x e tm))
apply-velocity-y
(lambda (e) (resolve-tile-collisions-y e tm))
(lambda (e) (detect-ground e tm)))
(scene-resolve-collisions scene)))))
(game-run! *game*)
|