aboutsummaryrefslogtreecommitdiff
path: root/demo/scaling.scm
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2026-04-08 00:38:55 +0100
committerGene Pasquet <dev@etenil.net>2026-04-08 00:38:55 +0100
commit0c3a700aa94a0256c5e5b1a14819f10b3d3e869b (patch)
treec1b0dc233769bea9f6a545333687539ace5b3804 /demo/scaling.scm
parentf8cc4a748bb8b6431a1023a876745b1bb473eb19 (diff)
Support scling
Diffstat (limited to 'demo/scaling.scm')
-rw-r--r--demo/scaling.scm77
1 files changed, 77 insertions, 0 deletions
diff --git a/demo/scaling.scm b/demo/scaling.scm
new file mode 100644
index 0000000..983e583
--- /dev/null
+++ b/demo/scaling.scm
@@ -0,0 +1,77 @@
+(import scheme
+ (chicken base)
+ (prefix sdl2 "sdl2:")
+ (prefix sdl2-ttf "ttf:")
+ downstroke-engine
+ downstroke-world
+ downstroke-entity
+ downstroke-input
+ downstroke-renderer
+ downstroke-assets)
+
+;; Logical resolution: 320×240, displayed at 640×480 via scale: 2
+
+(define +width+ 320)
+(define +height+ 240)
+(define +box-size+ 16)
+(define +speed+ 2)
+
+(define *game*
+ (make-game
+ title: "Demo: Scaling (2×)"
+ width: +width+ height: +height+
+ scale: 2
+
+ create: (lambda (game)
+ (game-scene-set! game
+ (make-scene
+ entities: (list (list #:type 'box
+ #:x (/ +width+ 2)
+ #:y (/ +height+ 2)
+ #:width +box-size+
+ #:height +box-size+
+ #:vx 0 #:vy 0
+ #:color '(255 200 0)))
+ tilemap: #f
+ camera: (make-camera x: 0 y: 0)
+ tileset-texture: #f
+ camera-target: #f
+ background: '(30 30 50))))
+
+ update: (lambda (game dt)
+ (let* ((input (game-input game))
+ (scene (game-scene game))
+ (box (car (scene-entities scene)))
+ (vx (cond ((input-held? input 'left) (- +speed+))
+ ((input-held? input 'right) +speed+)
+ (else 0)))
+ (vy (cond ((input-held? input 'up) (- +speed+))
+ ((input-held? input 'down) +speed+)
+ (else 0)))
+ (nx (max 0 (min (- +width+ +box-size+)
+ (+ (entity-ref box #:x 0) vx))))
+ (ny (max 0 (min (- +height+ +box-size+)
+ (+ (entity-ref box #:y 0) vy))))
+ (box (entity-set (entity-set box #:x nx) #:y ny)))
+ (scene-entities-set! scene (list box))))
+
+ render: (lambda (game)
+ (let* ((renderer (game-renderer game))
+ (scene (game-scene game))
+ (box (car (scene-entities scene)))
+ (bx (inexact->exact (floor (entity-ref box #:x 0))))
+ (by (inexact->exact (floor (entity-ref box #:y 0)))))
+ ;; Draw the colored box
+ (set! (sdl2:render-draw-color renderer) (sdl2:make-color 255 200 0))
+ (sdl2:render-fill-rect! renderer
+ (sdl2:make-rect bx by +box-size+ +box-size+))
+ ;; Draw a border around the logical viewport
+ (set! (sdl2:render-draw-color renderer) (sdl2:make-color 100 100 100))
+ (sdl2:render-draw-rect! renderer
+ (sdl2:make-rect 0 0 +width+ +height+))
+ ;; Draw crosshair at center
+ (set! (sdl2:render-draw-color renderer) (sdl2:make-color 60 60 80))
+ (sdl2:render-draw-line! renderer (/ +width+ 2) 0 (/ +width+ 2) +height+)
+ (sdl2:render-draw-line! renderer 0 (/ +height+ 2) +width+ (/ +height+ 2))))))
+
+(game-run! *game*)