diff options
author | Thomas White <taw@physics.org> | 2020-09-19 23:31:52 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2020-09-19 23:31:52 +0200 |
commit | 6834e0e46ac5516c7883d22261728d4651d2f554 (patch) | |
tree | 2879df0541805545a2ed29083c3fca4af5f396dc | |
parent | 5bfc87ce83b1c22e06879b8a0f0704e08ec7204b (diff) |
Add basic collision detection
-rw-r--r-- | heyllama.scm | 36 | ||||
-rw-r--r-- | llama.tmx | 13 |
2 files changed, 30 insertions, 19 deletions
diff --git a/heyllama.scm b/heyllama.scm index abe9a77..d1e3be3 100644 --- a/heyllama.scm +++ b/heyllama.scm @@ -6,6 +6,8 @@ (chickadee render sprite) (chickadee render texture) (chickadee render tiled) + (chickadee render color) + (chickadee render shapes) (oop goops)) (define-class <animal> (<object>) @@ -19,7 +21,6 @@ #:getter get-vel #:setter set-vel!) - (walk-direction #:init-value 0 #:setter set-walk-direction! @@ -49,14 +50,6 @@ (get-screen-pos animal))) -(define (update-animal animal tstep) - (vec2-add! (get-pos animal) (get-vel animal)) - (if (> (vec2-y (get-pos animal)) 200.0) - (set-vel! animal - (vec2+ (get-vel animal) - #v(0.0 -1.0))) - (set-vel! animal #v(0.0 0.0)))) - ;; -------------- Initial game state -------------- @@ -65,6 +58,7 @@ (define tile-map #f) (define view-pos #v(0.0 0.0)) (define grid (make-grid 16)) +(define show-hitboxes #f) (define (load) (set! llama (make <animal> @@ -76,6 +70,8 @@ #:spacing 48 #:margin 24))) + (grid-add grid 'llama 200.0 200.0 80.0 80.0) + (set! tile-map (load-tile-map "llama.tmx")) ;; Add objects from map to grid @@ -85,7 +81,7 @@ (grid-add grid (map-object-id obj) (rect-x shape) - (rect-y shape) + (- (rect-y shape) (rect-height shape)) (rect-width shape) (rect-height shape)))) @@ -102,9 +98,18 @@ ;; ------------------------------------------------ (define (draw alpha) + (draw-tile-map tile-map #:position (vec2* view-pos -1.0)) - (draw-animal llama)) + + (draw-animal llama) + + (when show-hitboxes + (let ((col (make-color 0.0 0.0 0.7 0.8))) + (for-each-item (lambda (item rect) + (draw-filled-rect (rect-move-by-vec2 rect (vec2* view-pos -1)) + col)) + grid)))) (define (get-screen-pos animal) @@ -131,8 +136,6 @@ (define (update tstep) - (update-animal llama tstep) - (when (key-pressed? 'right) (set-face-direction! llama 1) (vec2-add! (get-pos llama) #v((* tstep 0.2) 0)) @@ -149,6 +152,12 @@ (- (get-animation-step llama) 1) 16))) + (vec2-add! (get-pos llama) #v(0.0 -1.0)) + (grid-move grid 'llama (get-pos llama) (lambda (a b) + (if (eq? a 'llama) + slide + #f))) + ;; Ensure llama is near centre of screen (let ((fovea (make-rect 150.0 150.0 350.0 350.0)) (llama-rect (get-screen-rect llama))) @@ -159,6 +168,7 @@ (define (key-press key scancode modifier repeat?) (case key ((q) (abort-game)) + ((f1) (set! show-hitboxes (not show-hitboxes))) ((space) (unless repeat? (set-vel! llama #v(0.0 15.0)))))) @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<map version="1.2" tiledversion="1.3.2" orientation="orthogonal" renderorder="right-down" compressionlevel="0" width="100" height="16" tilewidth="32" tileheight="32" infinite="0" nextlayerid="3" nextobjectid="5"> +<map version="1.2" tiledversion="1.3.2" orientation="orthogonal" renderorder="right-down" compressionlevel="0" width="100" height="16" tilewidth="32" tileheight="32" infinite="0" nextlayerid="3" nextobjectid="6"> <tileset firstgid="1" name="llama" tilewidth="32" tileheight="32" tilecount="25" columns="5"> <image source="Tileset_ground.png" width="160" height="160"/> </tileset> - <layer id="1" name="Tile Layer 1" width="100" height="16"> + <layer id="1" name="tile-layer" width="100" height="16"> <data encoding="csv"> 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -12,7 +12,7 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,22,22,22,22,22,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -23,8 +23,9 @@ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 </data> </layer> - <objectgroup id="2" name="Object Layer 1"> - <object id="3" x="1.33333" y="384.667" width="862" height="126.667"/> - <object id="4" x="708.667" y="256.667" width="120.667" height="28"/> + <objectgroup id="2" name="object-layer"> + <object id="3" name="ground" x="0" y="384.667" width="960" height="126.667"/> + <object id="4" name="float1" x="708.667" y="256.667" width="120.667" height="28"/> + <object id="5" name="startwall" x="-1.33333" y="0" width="16" height="512"/> </objectgroup> </map> |