From 98b8d18e1cd3f3ea5bfee87783756f02093e2ec0 Mon Sep 17 00:00:00 2001 From: Peter Tillemans Date: Mon, 20 May 2024 19:49:32 +0200 Subject: [PATCH] split hero entity in model and render module --- game/main.scm | 33 +++++++++------------------------ game/model/hero.scm | 18 ++++++++++++++---- game/render/hero.scm | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 28 deletions(-) create mode 100644 game/render/hero.scm diff --git a/game/main.scm b/game/main.scm index beb51e6..913954c 100644 --- a/game/main.scm +++ b/game/main.scm @@ -1,6 +1,8 @@ (define-module (game main) #:use-module (game model level) + #:use-module (game model hero) #:use-module (game render level) + #:use-module (game render hero) #:use-module (chickadee) #:use-module (chickadee math rect) #:use-module (chickadee math vector) @@ -12,44 +14,27 @@ #:use-module (system repl coop-server) #:export (launch-game)) -(define hero-texture #f) -(define hero-atlas #f) -(define hero-position (vec2 32.0 32.0)) (define level #f) (define repl #f) +(define hero #f) (define (load) (render-level-load) - (set! hero-texture (load-image "assets/images/lr_penguin2.png")) - (set! hero-atlas (split-texture hero-texture 32 32)) + (render-hero-load) (set! level (level-parse-file "assets/levels/level-1.map")) (render-level-set! level) + (set! hero (hero-load)) (set! repl (spawn-coop-repl-server))) (define (update dt) (poll-coop-repl-server repl) - (set-vec2-x! hero-position - (floor-remainder (+ (vec2-x hero-position) (* 50.0 dt)) 608.0))) - -(define (draw-hero i) - (let ((x (* 64 (remainder i 8))) - (y (* 32 (quotient i 8))) - ) - (draw-sprite - (texture-atlas-ref hero-atlas i) - (vec2 (+ x 16) y) - #:scale (vec2 1.0 1.0)) - (draw-text (format #f "~A" i) (vec2 x y) #:color white)) - ) - - + (set! hero + (hero-with-x hero + (floor-remainder (+ (hero-x hero) (* 50.0 dt)) 608.0)))) (define (draw _alpha) (render-level-draw level) - (let ((hero-index (+ 56 (remainder (inexact->exact (floor (vec2-x hero-position))) 8)))) - (draw-sprite - (texture-atlas-ref hero-atlas hero-index) - (vec2+ hero-position (vec2 16.0 0.0)))) + (render-hero hero) ) (define (launch-game args) diff --git a/game/model/hero.scm b/game/model/hero.scm index c8938fb..07fb88a 100644 --- a/game/model/hero.scm +++ b/game/model/hero.scm @@ -3,10 +3,16 @@ #:use-module (srfi srfi-9) #:use-module (srfi srfi-9 gnu) #:use-module (srfi srfi-64) + #:use-module (chickadee math vector) #:export (hero-load - - ) - ) + hero-x hero-with-x + hero-y hero-with-y + hero-state hero-with-state + hero-bloat hero-with-bloat + hero-position + )) + + (define-immutable-record-type (%make-hero x y state bloat) hero? @@ -17,13 +23,15 @@ ) (define default-x 320) -(define default-y 16) +(define default-y 32) (define default-state 'stationary) (define default-bloat 1.0) (define (hero-load) (%make-hero default-x default-y default-state default-bloat)) +(define (hero-position hero) + (vec2 (hero-x hero) (hero-y hero))) ;; Tests [test-begin "hero model"] @@ -43,4 +51,6 @@ (test-equal 1.5 (hero-bloat (hero-with-bloat hero 1.5))) (test-equal default-bloat (hero-bloat hero))) +(test-equal (vec2 default-x default-y) (hero-position (hero-load))) + (test-end "hero model") diff --git a/game/render/hero.scm b/game/render/hero.scm new file mode 100644 index 0000000..ca9d6b8 --- /dev/null +++ b/game/render/hero.scm @@ -0,0 +1,34 @@ +(define-module (game render hero) + #:use-module (game model hero) + #:use-module (chickadee) + #:use-module (chickadee math vector) + #:use-module (chickadee graphics sprite) + #:use-module (chickadee graphics texture) + #:export (render-hero + render-hero-load) + ) + + +(define hero-texture #f) +(define hero-atlas #f) + + +(define (render-hero-load) + (set! hero-texture (load-image "assets/images/lr_penguin2.png")) + (set! hero-atlas (split-texture hero-texture 32 32))) + +;; start index of the walk animation +(define hero-walk-offset 56) + +(define (hero-sprite hero) + (let* ((x (inexact->exact (floor (vec2-x (hero-position hero))))) + (x-offset (remainder x 8)) + (hero-index (+ hero-walk-offset x-offset))) + (texture-atlas-ref hero-atlas hero-index))) + +(define (render-hero hero) + (draw-sprite + (hero-sprite hero) + (vec2+ + (hero-position hero) + (vec2 16.0 0.0))))