summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2020-09-19 23:31:52 +0200
committerThomas White <taw@physics.org>2020-09-19 23:31:52 +0200
commit6834e0e46ac5516c7883d22261728d4651d2f554 (patch)
tree2879df0541805545a2ed29083c3fca4af5f396dc
parent5bfc87ce83b1c22e06879b8a0f0704e08ec7204b (diff)
Add basic collision detection
-rw-r--r--heyllama.scm36
-rw-r--r--llama.tmx13
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))))))
diff --git a/llama.tmx b/llama.tmx
index 4600eb1..240bf88 100644
--- a/llama.tmx
+++ b/llama.tmx
@@ -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>