summaryrefslogtreecommitdiff
path: root/lisparuga.scm
diff options
context:
space:
mode:
Diffstat (limited to 'lisparuga.scm')
-rw-r--r--lisparuga.scm78
1 files changed, 61 insertions, 17 deletions
diff --git a/lisparuga.scm b/lisparuga.scm
index 828ba58..b552a7a 100644
--- a/lisparuga.scm
+++ b/lisparuga.scm
@@ -33,6 +33,7 @@
#:use-module (lisparuga kernel)
#:use-module (lisparuga node)
#:use-module (lisparuga node-2d)
+ #:use-module (lisparuga player)
#:use-module (lisparuga scene)
#:use-module (oop goops)
#:export (launch-lisparuga))
@@ -42,7 +43,11 @@
(define-asset background (load-image (scope-asset "images/background.png")))
-(define-class <lisparuga> (<scene-2d>))
+(define-class <lisparuga> (<scene-2d>)
+ (state #:accessor state #:init-value 'play))
+
+(define (game-over? lisparuga)
+ (zero? (lives (& lisparuga actor-canvas game player))))
(define-method (on-boot (lisparuga <lisparuga>))
;; Scale a small framebuffer up to the window size.
@@ -57,38 +62,77 @@
;; rendered.
(let ((actor-canvas (make <canvas>
#:name 'actor-canvas
+ #:rank 1
#:views (list (make <view-2d>
#:camera (make <camera-2d>
#:width 160
#:height 240)
#:area (make-rect 80 0 160 240)
#:clear-color (make-color 0.0 0.0 0.0 1.0))))))
- (attach-to actor-canvas (make <game> #:name 'game))
(attach-to lisparuga
(make <sprite>
#:name 'background
+ #:rank 0
#:texture background)
- actor-canvas)))
+ actor-canvas)
+ (new-game-transition lisparuga)))
+
+(define (new-game-transition lisparuga)
+ (set! (state lisparuga) 'play)
+ (let ((game-over (& lisparuga game-over)))
+ (and game-over (detach game-over)))
+ (let ((old-game (& lisparuga actor-canvas game)))
+ (and old-game (detach old-game)))
+ (attach-to (& lisparuga actor-canvas) (make <game> #:name 'game)))
+
+(define (game-over-transition lisparuga)
+ (set! (state lisparuga) 'game-over)
+ (let ((game-over (make <node-2d>
+ #:name 'game-over
+ #:rank 999)))
+ (attach-to game-over
+ (make <label>
+ #:name 'game-over
+ #:text "GAME OVER"
+ #:position (vec2 (- 160.0 (/ (* 9.0 8.0) 2.0))
+ 116.0)
+ #:rank 999))
+ (attach-to lisparuga game-over)))
(define-method (update (lisparuga <lisparuga>) dt)
- (steer-player (& lisparuga actor-canvas game)
- (key-pressed? 'up)
- (key-pressed? 'down)
- (key-pressed? 'left)
- (key-pressed? 'right)))
+ (match (state lisparuga)
+ ('play
+ (if (game-over? lisparuga)
+ (game-over-transition lisparuga)
+ (steer-player (& lisparuga actor-canvas game)
+ (key-pressed? 'up)
+ (key-pressed? 'down)
+ (key-pressed? 'left)
+ (key-pressed? 'right))))
+ (_ #f)))
(define-method (on-key-press (lisparuga <lisparuga>) key scancode modifiers repeat?)
- (unless repeat?
- (match key
- ('z (start-player-shooting (& lisparuga actor-canvas game)))
- ('x (toggle-player-polarity (& lisparuga actor-canvas game)))
- ('c (fire-player-homing-missiles (& lisparuga actor-canvas game)))
- (_ #t))))
+ (match (state lisparuga)
+ ('play
+ (unless repeat?
+ (match key
+ ('z (start-player-shooting (& lisparuga actor-canvas game)))
+ ('x (toggle-player-polarity (& lisparuga actor-canvas game)))
+ ('c (fire-player-homing-missiles (& lisparuga actor-canvas game)))
+ (_ #t))))
+ ('game-over
+ (match key
+ ('return (new-game-transition lisparuga))
+ (_ #f)))
+ (_ #f)))
(define-method (on-key-release (lisparuga <lisparuga>) key scancode modifiers)
- (match key
- ('z (stop-player-shooting (& lisparuga actor-canvas game)))
- (_ #t)))
+ (match (state lisparuga)
+ ('play
+ (match key
+ ('z (stop-player-shooting (& lisparuga actor-canvas game)))
+ (_ #t)))
+ (_ #f)))
(define* (launch-lisparuga #:key (window-width 640) (window-height 480))
(boot-kernel (make <kernel>