diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/macroknight/entities.hy | 26 | ||||
| -rw-r--r-- | src/macroknight/game.hy | 76 | ||||
| -rw-r--r-- | src/macroknight/systems.hy | 22 | 
3 files changed, 84 insertions, 40 deletions
| diff --git a/src/macroknight/entities.hy b/src/macroknight/entities.hy index 50d774c..812193e 100644 --- a/src/macroknight/entities.hy +++ b/src/macroknight/entities.hy @@ -6,6 +6,7 @@  (defclass Entity [Sprite]     ;;; Game entity    (setv _fixed False) +  (setv _type "none")    (defn __init__ [self id tile tile-size x y]      (.__init__ (super)) @@ -23,10 +24,14 @@      self._rect)    (defn [property] surf [self] -    self._surf)) +    self._surf) + +  (defn [property] type [self] +    self._type))  (defclass LevelTile [Entity]    (setv _fixed True) +  (setv _type "level")    (defn __init__ [self id tile tile-size x y scaling]      (let [tile-width (* (.get_width tile) scaling) @@ -37,9 +42,11 @@        (.__init__ (super) id tile_ tile-size x y))))  (defclass Goal [Entity] +  (setv _type "goal")    (setv _fixed True))  (defclass Player [Entity] +  (setv _type "player")    (setv SPEED 3)    (setv JUMP_IMPULSE 10)    (setv MAX_JUMPING 100) @@ -47,7 +54,9 @@    (defn __init__ [self id tile tile-size x y]      (.__init__ (super) id tile tile-size x y)      (setv self.jumping False) -    (setv self.jump-move 0)) +    (setv self.jump-move 0) +    (setv self.moves []) +    (setv self._disp_surf (.copy self._surf)))    (defn move [self move]      (.append self.moves move) @@ -65,5 +74,16 @@    (defn ground [self]      (setv self.jump-move 0)) +  (defn animate [self] +    (let [x-move (get self.total-move 0)] +      (setv self._disp_surf +            (cond +              (< x-move 0) (pygame.transform.flip self._surf True False) +              (> x-move 0) (.copy self._surf) +              True self._disp_surf)))) +    (defn flush [self] -    (setv self.moves []))) +    (setv self.moves [])) + +  (defn [property] surf [self] +    self._disp_surf)) diff --git a/src/macroknight/game.hy b/src/macroknight/game.hy index a8f6c62..005f356 100644 --- a/src/macroknight/game.hy +++ b/src/macroknight/game.hy @@ -1,13 +1,12 @@  (require hy)  (require hyrule *)  (import pygame -        pprint [pprint]          pytmx.util_pygame [load_pygame]          entities [Player LevelTile Goal]          tiles [TileSet draw-tile]          utils [neg]          text [render-text] -        systems [apply-gravity apply-collisions] +        systems [apply-gravity apply-collisions GoalHit]          math [floor])  (pygame.init) @@ -15,11 +14,10 @@  (setv TILE_SCALING 1)  (setv TILE_SIZE (* TILE_SCALING 16))  (setv MACRO_STEP_WAIT 300) -(setv MACRO_COOLDOWN 5000) +(setv MACRO_COOLDOWN 2000)  (setv screen (pygame.display.set_mode #((* TILE_SCALING 640) (* TILE_SCALING 480))))  (setv clock (pygame.time.Clock)) -(setv running True)  (setv tileset (TileSet "assets/monochrome-transparent.png" TILE_SCALING TILE_SIZE TILE_SIZE 1))  (setv levels [(load_pygame "assets/level-0.tmx")                (load_pygame "assets/level-1.tmx")]) @@ -29,10 +27,10 @@  (setv game-running True) -  (while game-running    ;; Load the level +  (setv running True)    (setv level (get levels level-id))    (setv entities [])    (setv player-pos #(5 5)) @@ -60,16 +58,15 @@    (setv macro-input-mode False)    (setv macro-wait-time 0)    (setv macro-commands [None None None]) -  (for [#(id tiledef) (enumerate (.tiles (get level.layers 0)))] -    (let [x (get tiledef 0) -          y (get tiledef 1) -          tile (get tiledef 2)] -      (.append entities (LevelTile id tile TILE_SIZE x y TILE_SCALING)))) +  (let [id-offset (len entities)] +    (for [#(id tiledef) (enumerate (.tiles (get level.layers 0)))] +      (let [x (get tiledef 0) +            y (get tiledef 1) +            tile (get tiledef 2)] +        (.append entities (LevelTile (+ id id-offset) tile TILE_SIZE x y TILE_SCALING)))))    (setv ongoing_inputs []) -  (pprint (get entities 0)) -    (while running      (for [event (pygame.event.get)]        (case event.type @@ -112,9 +109,10 @@                        pygame.K_w (.move player #(0 (neg (/ player.MAX_JUMPING 2))))                        pygame.K_d (.move player #((* 2 TILE_SIZE) 0)))                  (if (= command-id (- (len macro-commands) 1)) -                    (do  (setv macro-commands [None None None]) -                         (setv macro-input-mode False) -                         (setv macro-wait-time (+ (pygame.time.get_ticks) MACRO_COOLDOWN))) +                    (do +                      (setv macro-commands [None None None]) +                      (setv macro-input-mode False) +                      (setv macro-wait-time (+ (pygame.time.get_ticks) MACRO_COOLDOWN)))                      (setv (get macro-commands command-id) None)))                (pygame.time.wait MACRO_STEP_WAIT)) @@ -131,10 +129,9 @@          ;; Not in macro mode          (do            (when (> macro-wait-time 0) -            (let [progress (round (* 3 (/ (- (pygame.time.get_ticks) macro-wait-time) MACRO_COOLDOWN)))] -              (for [indicator (range 3)] -                (draw-tile -                  screen tileset 725 )))) +            (let [progress (round (* 3 (/ (- macro-wait-time (pygame.time.get_ticks)) MACRO_COOLDOWN)))] +              (for [indicator (range progress)] +                (draw-tile screen tileset 725 (+ 4 indicator) 5))))            (for [inp ongoing_inputs]              (case inp                    pygame.K_a (.move player #((neg player.SPEED) 0)) @@ -142,16 +139,25 @@                    pygame.K_w (.jump player)                    pygame.K_d (.move player #(player.SPEED 0)))) -          (when (any ongoing_inputs) -            (for [entity entities] -              (apply-collisions entity entities))) +           +           +          (try +            (when (any ongoing_inputs) +              (for [entity entities] +                (apply-collisions entity entities))) -          (.flush player) +            (.animate player) +            (.flush player) -          ;; Apply systems -          (for [entity entities] -            (apply-gravity entity entities) -            (apply-collisions entity entities)) +            ;; Apply systems +            (for [entity entities] +              (apply-gravity entity entities) +              (apply-collisions entity entities)) +             +            (except [GoalHit] +              (setv level-id (+ level-id 1)) +              (setv running False) +              (setv game-running (< level-id (len levels)))))            (.flush player))) @@ -161,10 +167,22 @@      (pygame.display.flip) -    (when (or (= 0 macro-wait-time) -              (< (- (pygame.time.get_ticks) macro-wait-time) 0)) +    (when (and (!= 0 macro-wait-time) +               (> (pygame.time.get_ticks) macro-wait-time))        (setv macro-wait-time 0))      (.tick clock 60))) +(do +  (.fill screen "#000000") + +  (render-text screen +               tileset +               "YOU WIN" +               10 +               10) + +  (pygame.display.flip) +  (pygame.time.wait 1000)) +  (pygame.quit) diff --git a/src/macroknight/systems.hy b/src/macroknight/systems.hy index b02bc50..fccccd0 100644 --- a/src/macroknight/systems.hy +++ b/src/macroknight/systems.hy @@ -1,19 +1,25 @@  ;; Define systems here  (setv GRAVITY 5) +(defclass GoalHit [Exception]) +  (defn apply-gravity [entity entities]    (when (not entity.fixed)      (.move entity #(0 GRAVITY))))  (defn apply-collisions [entity entities]    (when (not entity.fixed) -    (for [ent (gfor enti entities :if (!= enti.id entity.id) enti)] +    (for [ent (gfor enti entities +                    :if (!= enti.id entity.id) +                    enti)]        (when (.colliderect entity.rect ent.rect) -        (let [collision-rect (.clip entity.rect ent.rect) -              move-x (get entity.total-move 0) -              move-y (get entity.total-move 1)] -          (when (!= move-x 0) -            (.move entity #((* (if (> move-x 0) -1 1) collision-rect.width) 0))) -          (when (!= move-y 0) -            (.move entity #(0 (* (if (> move-y 0) -1 1) collision-rect.height))))) +        (if (= ent.type "goal") +            (raise (GoalHit)) +            (let [collision-rect (.clip entity.rect ent.rect) +                  move-x (get entity.total-move 0) +                  move-y (get entity.total-move 1)] +              (when (!= move-x 0) +                (.move entity #((* (if (> move-x 0) -1 1) collision-rect.width) 0))) +              (when (!= move-y 0) +                (.move entity #(0 (* (if (> move-y 0) -1 1) collision-rect.height))))))          (.ground entity))))) | 
