From 2bdb665cffff93721bbd38b3809a7c420dff2f1c Mon Sep 17 00:00:00 2001 From: David Thompson Date: Sun, 12 Apr 2020 21:59:35 -0400 Subject: Day 3 progress. --- lisparuga/enemy.scm | 10 +- lisparuga/game.scm | 281 +++++++++++++++++++++++++++++++++++++++++--------- lisparuga/node-2d.scm | 26 ++++- lisparuga/player.scm | 51 ++++++--- 4 files changed, 304 insertions(+), 64 deletions(-) (limited to 'lisparuga') diff --git a/lisparuga/enemy.scm b/lisparuga/enemy.scm index 0589d16..aa5335e 100644 --- a/lisparuga/enemy.scm +++ b/lisparuga/enemy.scm @@ -21,6 +21,7 @@ ;;; Code: (define-module (lisparuga enemy) + #:use-module (chickadee audio) #:use-module (chickadee math) #:use-module (chickadee math rect) #:use-module (chickadee math vector) @@ -46,6 +47,9 @@ ;;; ;;; Base Enemy ;;; + +(define-asset explosion-sound (load-audio (scope-asset "sounds/explosion.wav"))) + (define-class () (health #:accessor health #:init-keyword #:health) (points #:getter points #:init-keyword #:points) @@ -56,7 +60,11 @@ #t) (define-method (damage (enemy ) x) - (set! (health enemy) (max (- (health enemy) x) 0))) + (let ((new-health (max (- (health enemy) x) 0))) + (set! (health enemy) new-health) + (when (zero? new-health) + (audio-play (asset-ref explosion-sound) + #:volume 0.5)))) (define-method (dead? (enemy )) (zero? (health enemy))) diff --git a/lisparuga/game.scm b/lisparuga/game.scm index 5b14edd..9e79898 100644 --- a/lisparuga/game.scm +++ b/lisparuga/game.scm @@ -22,9 +22,11 @@ ;;; Code: (define-module (lisparuga game) + #:use-module (chickadee) #:use-module (chickadee math rect) #:use-module (chickadee math vector) #:use-module (chickadee render color) + #:use-module (chickadee render particles) #:use-module (chickadee render texture) #:use-module (chickadee scripting) #:use-module (ice-9 format) @@ -42,17 +44,36 @@ start-player-shooting stop-player-shooting toggle-player-polarity - fire-player-homing-missiles)) + fire-player-homing-missiles + spawn-enemies + start-stage + game-over? + complete?)) (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)) +(define-asset explosion-texture + (load-image (scope-asset "images/explosion.png"))) ;; nodes needed: ;; scrolling background -(define-class ()) +(define-class () + (player-control? #:accessor player-control? #:init-value #f) + (complete? #:accessor complete? #:init-value #f)) + +(define-method (initialize (game ) initargs) + (next-method) + (set! (views game) + ;; Game happens on a 160x240 pixel screen. + (list (make + #:camera (make + #:width 160 + #:height 240) + #:area (make-rect 80 0 160 240) + #:clear-color (make-color 0.0 0.0 0.0 1.0))))) (define-method (on-boot (game )) (let* ((player-bullets (make @@ -60,58 +81,79 @@ #:rank 2 #:capacity 500 #:texture-atlas player-bullet-atlas)) - (player (make-player player-bullets)) (enemy-bullets (make #:name 'enemy-bullets - #:rank 4 + #:rank 5 #:capacity 1000 #:texture-atlas enemy-bullet-atlas)) + (explosions (make + #:name 'explosions + #:rank 3 + #:particles + (make-particles 1000 + #:texture (asset-ref explosion-texture) + #:end-color (make-color 1.0 1.0 1.0 0.0) + #:speed-range (vec2 0.5 5.0) + #:lifetime 12))) (ui (make #:name 'ui #:rank 999))) - (set! (rank player) 1) (attach-to game (make #:name 'clouds #:rank 0 #:texture clouds) - player player-bullets (make #:name 'enemies - #:rank 3) + #:rank 4) + explosions enemy-bullets ui) ;; Setup UI elements + ;; TODO: Move this out of here. (attach-to ui (make