From 822cb31184875def0b2cc0d5d66e0f65bacff226 Mon Sep 17 00:00:00 2001 From: Gene Pasquet Date: Tue, 19 May 2026 07:09:00 +0100 Subject: First attempt!? --- game.scm | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) (limited to 'game.scm') 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*) -- cgit v1.2.3