diff options
| -rw-r--r-- | assets/level-0.tmx | 52 | ||||
| -rw-r--r-- | assets/level-1.tmx | 4 | ||||
| -rw-r--r-- | macroknight.tiled-session | 8 | ||||
| -rw-r--r-- | src/macroknight/entities.hy | 9 | ||||
| -rw-r--r-- | src/macroknight/game.hy | 73 | ||||
| -rw-r--r-- | src/macroknight/systems.hy | 22 | 
6 files changed, 98 insertions, 70 deletions
| diff --git a/assets/level-0.tmx b/assets/level-0.tmx index 3655221..11405a2 100644 --- a/assets/level-0.tmx +++ b/assets/level-0.tmx @@ -1,47 +1,47 @@  <?xml version="1.0" encoding="UTF-8"?>  <map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="40" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="8" nextobjectid="5"> - <tileset firstgid="1025" source="monochrome_transparent.tsx"/> + <tileset firstgid="1" source="monochrome_transparent.tsx"/>   <layer id="3" name="ground" width="40" height="30">    <data encoding="csv"> -0,0,0,0,1192,1240,0,0,0,0,1239,1193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1192,1240,0,0,1239,1193,0,0,0,0, -0,0,0,1192,1240,0,0,0,0,0,0,1239,1193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1192,1240,0,0,0,0,1239,1193,0,0,1192, -0,0,1192,1240,0,0,0,0,0,0,0,0,1239,1193,0,0,0,0,0,0,0,0,1192,1193,0,0,0,0,1192,1240,0,0,0,0,0,0,1239,1193,1192,1240, -0,1192,1240,0,0,0,0,0,0,0,0,0,0,1239,1193,0,0,1192,1193,0,0,1192,1240,1239,1193,0,0,1192,1240,0,0,0,0,0,0,0,0,1239,1193,0, -1192,1240,0,0,0,0,0,0,0,0,0,0,0,0,1239,1193,1192,1240,1239,1193,1192,1240,0,0,1239,1193,1192,1240,0,0,0,0,0,0,0,0,0,0,1239,1193, -1240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,1193,0,0,1192,1240,0,0,0,0,1239,1240,0,0,0,0,0,0,0,0,0,0,0,0,1239, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,1193,1192,1240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,1240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,168,216,0,0,0,0,215,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,216,0,0,215,169,0,0,0,0, +0,0,0,168,216,0,0,0,0,0,0,215,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,216,0,0,0,0,215,169,0,0,168, +0,0,168,216,0,0,0,0,0,0,0,0,215,169,0,0,0,0,0,0,0,0,168,169,0,0,0,0,168,216,0,0,0,0,0,0,215,169,168,216, +0,168,216,0,0,0,0,0,0,0,0,0,0,215,169,0,0,168,169,0,0,168,216,215,169,0,0,168,216,0,0,0,0,0,0,0,0,215,169,0, +168,216,0,0,0,0,0,0,0,0,0,0,0,0,215,169,168,216,215,169,168,216,0,0,215,169,168,216,0,0,0,0,0,0,0,0,0,0,215,169, +216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,169,0,0,168,216,0,0,0,0,215,216,0,0,0,0,0,0,0,0,0,0,0,0,215, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,169,168,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1963,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1917,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1712,0,0,0, -1870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1868,0,0,0, -1868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1869,1570,1570,1570, -1870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1868,1868,1868,1868, -1868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1468,1868,1868,1868, -1572,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1239,1044,1044,1043,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044,1044, -1044,1044,1044,1044,1045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1766,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1239,1045,0,0,0,0,0,0,0,0,0,0,0,0,0,1668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,1093,0,1239,1045,0,0,0,0,0,0,0,0,0,0,0,0,1662,0,0,0,0,0,0,0,0,0,0,0,1093,0,0,0,0,0,0,1093,0, -0,0,0,0,0,0,1239,1045,0,0,0,0,0,0,0,0,1043,1044,1044,1240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,1239,1045,0,0,0,0,0,0,0,1092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1239,1044,1044,1044,1044,1044,1044,1044,1240,0,0,0,0,0,0,1093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +893,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,688,0,0,0, +846,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,844,0,0,0, +844,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,845,546,546,546, +846,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,844,844,844,844, +844,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,444,844,844,844, +548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,215,20,20,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,215,21,0,0,0,0,0,0,0,0,0,0,0,0,0,644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,69,0,215,21,0,0,0,0,0,0,0,0,0,0,0,0,638,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,69,0, +0,0,0,0,0,0,215,21,0,0,0,0,0,0,0,0,19,20,20,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,215,21,0,0,0,0,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,215,20,20,20,20,20,20,20,216,0,0,0,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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="7" name="entities"> -  <object id="2" name="player" type="Player" gid="1053" x="182" y="350.5" width="16" height="16"/> +  <object id="2" name="player" type="Player" gid="29" x="182" y="350.5" width="16" height="16"/>    <object id="3" name="hint" type="Text" x="98.5" y="432.5" width="197" height="78">     <properties>      <property name="text" value="hit space to start a macro"/>     </properties>    </object> -  <object id="4" name="goal" type="Goal" x="560.48" y="287.914" width="16" height="16"/> +  <object id="4" name="goal" type="Goal" x="560.935" y="288.641" width="16" height="16"/>   </objectgroup>  </map> diff --git a/assets/level-1.tmx b/assets/level-1.tmx index 9ec19ce..9a1dda0 100644 --- a/assets/level-1.tmx +++ b/assets/level-1.tmx @@ -35,8 +35,8 @@  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,0,0,0,0  </data>   </layer> - <objectgroup id="5" name="objects" offsetx="0" offsety="0"> -  <object id="1" name="goal" type="Goal" x="560.182" y="287.636" width="16" height="16"/> + <objectgroup id="5" name="objects"> +  <object id="1" name="goal" type="Goal" x="560.356" y="288.288" width="16" height="16"/>    <object id="2" name="player" type="Player" gid="29" x="209.182" y="289.697" width="16" height="16"/>   </objectgroup>  </map> diff --git a/macroknight.tiled-session b/macroknight.tiled-session index 95f22d5..7b13834 100644 --- a/macroknight.tiled-session +++ b/macroknight.tiled-session @@ -6,11 +6,11 @@      ],      "fileStates": {          "assets/level-0.tmx": { -            "scale": 1.939583333333333, -            "selectedLayer": 0, +            "scale": 3, +            "selectedLayer": 1,              "viewCenter": { -                "x": 320.4296455424276, -                "y": 314.7583243823846 +                "x": 245.16666666666669, +                "y": 330.16666666666663              }          },          "assets/level-1.tmx": { diff --git a/src/macroknight/entities.hy b/src/macroknight/entities.hy index 50d774c..666b06b 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) diff --git a/src/macroknight/game.hy b/src/macroknight/game.hy index a8f6c62..1676e5a 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,22 @@                    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) +            (.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 +164,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))))) | 
