aboutsummaryrefslogtreecommitdiff
path: root/game.scm
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2026-05-19 07:09:00 +0100
committerGene Pasquet <dev@etenil.net>2026-05-19 07:09:00 +0100
commit822cb31184875def0b2cc0d5d66e0f65bacff226 (patch)
tree9058b539fb88b51a950a3e96603d08b46ee74618 /game.scm
parentbfa58d7b780e0cd6f75421fe1153d73fc6f8057b (diff)
First attempt!?HEADmaster
Diffstat (limited to 'game.scm')
-rw-r--r--game.scm88
1 files changed, 87 insertions, 1 deletions
diff --git a/game.scm b/game.scm
index 54ee68c..b125852 100644
--- a/game.scm
+++ b/game.scm
@@ -1,2 +1,88 @@
-(import (downstroke engine))
+(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*)