diff options
Diffstat (limited to 'lisparuga/game.scm')
-rw-r--r-- | lisparuga/game.scm | 96 |
1 files changed, 91 insertions, 5 deletions
diff --git a/lisparuga/game.scm b/lisparuga/game.scm index edd97fc..5b14edd 100644 --- a/lisparuga/game.scm +++ b/lisparuga/game.scm @@ -26,9 +26,13 @@ #:use-module (chickadee math vector) #:use-module (chickadee render color) #:use-module (chickadee render texture) + #:use-module (chickadee scripting) + #:use-module (ice-9 format) + #:use-module (lisparuga actor) #:use-module (lisparuga asset) #:use-module (lisparuga bullets) #:use-module (lisparuga config) + #:use-module (lisparuga enemy) #:use-module (lisparuga node) #:use-module (lisparuga node-2d) #:use-module (lisparuga player) @@ -43,28 +47,109 @@ (define-asset clouds (load-image (scope-asset "images/clouds.png"))) (define-asset player-bullet-atlas (load-tile-atlas (scope-asset "images/player-bullets.png") 16 16)) +(define-asset enemy-bullet-atlas + (load-tile-atlas (scope-asset "images/enemy-bullets.png") 24 24)) ;; nodes needed: -;; enemies -;; enemy bullets ;; scrolling background (define-class <game> (<node-2d>)) (define-method (on-boot (game <game>)) (let* ((player-bullets (make <bullet-field> + #:name 'player-bullets + #:rank 2 #:capacity 500 #:texture-atlas player-bullet-atlas)) (player (make-player player-bullets)) (enemy-bullets (make <bullet-field> + #:name 'enemy-bullets + #:rank 4 #:capacity 1000 - #:texture-atlas player-bullet-atlas))) + #:texture-atlas enemy-bullet-atlas)) + (ui (make <node-2d> + #:name 'ui + #:rank 999))) + (set! (rank player) 1) (attach-to game (make <sprite> #:name 'clouds + #:rank 0 #:texture clouds) player player-bullets - enemy-bullets))) + (make <node-2d> + #:name 'enemies + #:rank 3) + enemy-bullets + ui) + ;; Setup UI elements + (attach-to ui + (make <label> + #:name 'score + #:position (vec2 2.0 226.0)) + (make <label> + #:name 'chain + #:position (vec2 2.0 210.0)) + (make <label> + #:name 'energy + #:position (vec2 2.0 18.0)) + (make <label> + #:name 'lives + #:position (vec2 2.0 2.0))) + (update-ui game) + ;; Test enemy + (spawn-enemy game (make-utatsugumi 'white 10.0 180.0)) + (spawn-enemy game (make-utatsugumi 'white 30.0 180.0)) + (spawn-enemy game (make-utatsugumi 'white 50.0 180.0)) + (spawn-enemy game (make-utatsugumi 'black 70.0 180.0)) + (spawn-enemy game (make-utatsugumi 'black 90.0 180.0)) + (spawn-enemy game (make-utatsugumi 'black 110.0 180.0)) + (spawn-enemy game (make-utatsugumi 'white 130.0 180.0)) + (spawn-enemy game (make-utatsugumi 'white 150.0 180.0)))) + +(define (update-ui game) + (set! (text (& game ui score)) + (format #f "~9,'0d" (score (& game player)))) + (set! (text (& game ui chain)) + (format #f "CHAIN ~a: ~a" + (let ((n (chain (& game player)))) + (if (< n 9) (number->string n) "MAX")) + (list->string + (map (lambda (polarity) + (if (eq? polarity 'white) + #\W + #\B)) + (chain-progress (& game player)))))) + (set! (text (& game ui energy)) + (format #f "E~d" (quotient (energy (& game player)) 10))) + (set! (text (& game ui lives)) + (format #f "x~d" (max (- (lives (& game player)) 1) 0)))) + +(define-method (update (game <game>) dt) + (let ((refresh-ui? #f) + (player (& game player))) + ;; enemy -> player bullet collision + ;; enemy -> player collision + (for-each (lambda (enemy) + (cond + ((and (collide (& game player-bullets) enemy) + (dead? enemy)) + (on-kill player enemy) + (fire-parting-shots-maybe enemy player) + (detach enemy) + (set! refresh-ui? #t)) + ((collide player enemy) + (set! refresh-ui? #t)))) + (children (& game enemies))) + ;; player -> enemy bullet collision + (when (collide (& game enemy-bullets) (& game player)) + (set! refresh-ui? #t)) + (when refresh-ui? + (update-ui game)))) + +(define-method (spawn-enemy (game <game>) enemy) + (set! (bullet-field enemy) (& game enemy-bullets)) + (attach-to (& game enemies) enemy)) (define-method (steer-player (game <game>) up? down? left? right?) (steer (& game player) up? down? left? right?)) @@ -79,4 +164,5 @@ (toggle-polarity (& game player))) (define-method (fire-player-homing-missiles (game <game>)) - (fire-homing-missiles (& game player))) + (fire-homing-missiles (& game player) (children (& game enemies))) + (update-ui game)) |