summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Tileset_ground.pngbin0 -> 11663 bytes
-rw-r--r--heyllama.scm81
-rw-r--r--llama.tmx26
3 files changed, 86 insertions, 21 deletions
diff --git a/Tileset_ground.png b/Tileset_ground.png
new file mode 100644
index 0000000..1294865
--- /dev/null
+++ b/Tileset_ground.png
Binary files differ
diff --git a/heyllama.scm b/heyllama.scm
index 9b08c45..0b90dcb 100644
--- a/heyllama.scm
+++ b/heyllama.scm
@@ -1,25 +1,31 @@
(use-modules (chickadee)
(chickadee math vector)
+ (chickadee math rect)
(chickadee render font)
(chickadee render sprite)
(chickadee render texture)
+ (chickadee render tiled)
(oop goops))
(define-class <animal> (<object>)
- (pos #:init-keyword #:initial-pos
+ (pos #:init-keyword #:pos
#:getter get-pos)
+ (size #:init-keyword #:size
+ #:getter get-size)
+
(vel #:init-value #v(0.0 0.0)
#:getter get-vel
#:setter set-vel!)
+
(walk-direction
#:init-value 0
#:setter set-walk-direction!
#:getter get-walk-direction)
(face-direction
- #:init-keyword #:initial-face-dir
+ #:init-keyword #:face-dir
#:setter set-face-direction!
#:getter get-face-direction)
@@ -28,8 +34,7 @@
#:setter set-animation-step!)
(sprite #:init-keyword #:sprite
- #:getter get-sprite
- #:setter set-sprite!))
+ #:getter get-sprite))
(define (face-row dir)
(if (> 0 dir)
@@ -40,7 +45,7 @@
(draw-sprite (texture-atlas-ref (get-sprite animal)
(+ (face-row (get-face-direction animal))
(truncate (/ (get-animation-step animal) 4))))
- (get-pos animal)))
+ (get-screen-pos animal)))
(define (update-animal animal tstep)
@@ -53,7 +58,7 @@
(+ (get-animation-step animal) wd)
16))))
(vec2-add! (get-pos animal) (get-vel animal))
- (if (> (vec2-y (get-pos animal)) 100.0)
+ (if (> (vec2-y (get-pos animal)) 200.0)
(set-vel! animal
(vec2+ (get-vel animal)
#v(0.0 -1.0)))
@@ -63,42 +68,76 @@
;; -------------- Initial game state --------------
-(define llama
- (make <animal>
- #:initial-pos #v(100.0 100.0)
- #:initial-face-dir 1))
+(define llama #f)
+(define tile-map #f)
+(define view-pos #v(0.0 0.0))
+(define (load)
+ (set! llama (make <animal>
+ #:pos #v(200.0 200.0)
+ #:size #v(128.0 128.0)
+ #:face-dir 1
+ #:sprite (split-texture (load-image "llama_walk.png")
+ 128
+ 128)))
-;; ------------------------------------------------
+ (set! tile-map (load-tile-map "llama.tmx")))
-(define (load)
- (set-sprite! llama
- (split-texture (load-image "llama_walk.png")
- 128
- 128)))
+;; ------------------------------------------------
(define (draw alpha)
+ (draw-tile-map tile-map
+ #:position (vec2* view-pos -1.0))
(draw-animal llama))
+(define (get-screen-pos animal)
+ (vec2- (get-pos animal) view-pos))
+
+
+(define (rect-xy rect)
+ #v((rect-x rect) (rect-y rect)))
+
+
+(define (get-screen-rect animal)
+ (let ((screen-pos (get-screen-pos animal)))
+ (make-rect (vec2-x screen-pos)
+ (vec2-y screen-pos)
+ (vec2-x (get-size animal))
+ (vec2-y (get-size animal)))))
+
+
+(define (overshoot small-rect big-rect)
+ (let ((moved-small-rect (rect-clamp small-rect big-rect)))
+ (vec2- (rect-xy small-rect)
+ (rect-xy moved-small-rect))))
+
+
(define (update tstep)
- (update-animal llama tstep))
+
+ (update-animal llama tstep)
+
+ ;; 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)))
+ (unless (rect-within? llama-rect fovea)
+ (vec2-add! view-pos (overshoot llama-rect fovea)))))
(define (key-press key scancode modifier repeat?)
(case key
((q) (abort-game))
((right) (set-walk-direction! llama 1))
- ((left) (set-walk-direction! llama -1))))
- ;;((space) (accelerate llama #v(0.0 10.0)))))
+ ((left) (set-walk-direction! llama -1))
+ ((space) (unless repeat?
+ (set-vel! llama #v(0.0 15.0))))))
(define (key-release key scancode modifier)
(case key
((right) (set-walk-direction! llama 0))
- ((left) (set-walk-direction! llama 0))
- ((space) (set-vel! llama #v(0.0 20.0)))))
+ ((left) (set-walk-direction! llama 0))))
(run-game #:window-title "Hey Llama!"
diff --git a/llama.tmx b/llama.tmx
new file mode 100644
index 0000000..bdb0f80
--- /dev/null
+++ b/llama.tmx
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.2" tiledversion="1.3.2" orientation="orthogonal" renderorder="right-down" compressionlevel="-1" width="100" height="16" tilewidth="32" tileheight="32" infinite="0" nextlayerid="2" nextobjectid="1">
+ <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">
+ <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,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+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,
+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,
+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>
+</map>