diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/macroknight/game.hy | 123 | 
1 files changed, 115 insertions, 8 deletions
| diff --git a/src/macroknight/game.hy b/src/macroknight/game.hy index 2db0f29..c910416 100644 --- a/src/macroknight/game.hy +++ b/src/macroknight/game.hy @@ -1,20 +1,127 @@  (require hy)  (require hyrule) -(import pygame) +(import pygame +        pytmx.util_pygame [load_pygame] +        pprint [pprint])  (pygame.init) -(setv screen (pygame.display.set_mode #(1280 720))) + +(setv TILE_SCALING 1) +(setv TILE_SIZE 32) +(setv GRAVITY 5) + +(defclass TileSet [] +  (defn __init__ [self image tile-w tile-h [padding 0]] + +    (setv self.sheet +          (let [surf (pygame.image.load "assets/tileset_legacy.png")] +            (if (!= TILE_SCALING 1) +                (pygame.transform.scale +                  surf +                  #((* (.get_width surf) TILE_SCALING) +                     (* (.get_height surf) TILE_SCALING))) +                surf))) + +    (setv self.tiles +          (lfor y (range 0 (.get_height self.sheet) (+ tile-h (* padding TILE_SCALING))) +                x (range 0 (.get_width self.sheet) (+ tile-w (* padding TILE_SCALING))) +                (let [tile (pygame.Surface #(tile-w tile-h))] +                  (.blit tile self.sheet #(0 0) #(x y tile-w tile-h)) +                  tile))))) + +;; Define systems here +(defn apply-gravity [entity entities] +  (when (not entity.fixed) +    (.move entity 0 GRAVITY))) + +(defn apply-collisions [entity entities] +  (for [ent entities] +    (when (and (!= ent.id entity.id) +               (.colliderect entity.rect ent.rect) +               (not entity.fixed)) +      (let [collision (.clip entity.rect ent.rect)] +        (print f"{entity.id} == {ent.id}") +        (.move entity +               (* -1 collision.width) +               (* -1 collision.height)))))) + +;; Define entities here +(defclass LevelTile [] +  (setv fixed True) + +  (defn __init__ [self id x y surf] +    (setv self.id id) +    (setv self.surf +          (if (!= TILE_SCALING 1) +              (pygame.transform.scale +                surf +                #((* (.get_width surf) TILE_SCALING) +                   (* (.get_height surf) TILE_SCALING))) +              surf)) + +    (setv self.rect (.get_rect surf :left (* x TILE_SIZE) :top (* y TILE_SIZE))))) + +(defclass Player [pygame.sprite.Sprite] +  (setv fixed False) +  (setv SPEED 5) +  (setv JUMP_IMPULSE 5) + +  (defn __init__ [self tile initial-x initial-y] +    (.__init__ (super)) +    (setv self.id 1) +    (setv self.surf (pygame.Surface #(TILE_SIZE TILE_SIZE))) +    (.blit self.surf tile #(0 0)) +    (setv self.rect (.get_rect self.surf))) + +  (defn move [self dx dy] +    (.move_ip self.rect dx dy))) + +(setv screen (pygame.display.set_mode #((* TILE_SCALING 640) (* TILE_SCALING 480))))  (setv clock (pygame.time.Clock))  (setv running True) +(setv tiles (TileSet "assets/tileset_legacy.png" TILE_SIZE TILE_SIZE 1)) + +(setv player (Player (get tiles.tiles 28) 0 0)) +(setv sprites-group []) +(.append sprites-group player) +(setv level (load_pygame "assets/level-1.tmx")) + +(pprint (next (.tiles (get level.layers 1)))) + +(for [tiledef (enumerate (.tiles (get level.layers 1)))] +  (.append sprites-group (LevelTile (get tiledef 0) #* (get tiledef 1)))) + + +(setv ongoing_inputs []) +  (while running -  (when (any -          (lfor event (pygame.event.get) -                (= event.type pygame.QUIT))) -    (setv running False)) -  (.fill screen "purple") +  (for [event (pygame.event.get)] +    (match event.type +           pygame.QUIT (setv running False) +           pygame.KEYDOWN (.append ongoing_inputs event.key) +           pygame.KEYUP (.remove ongoing_inputs event.key))) + +  (for [inp ongoing_inputs] +    (match inp +           pygame.K_w (.move player 0 (* -1 player.JUMP_IMPULSE)) +           pygame.K_a (.move player (* -1 player.SPEED) 0) +           pygame.K_s (.move player 0 1) +           pygame.K_d (.move player player.SPEED 0))) + +  (.fill screen "#472d3c") + +  ;; Apply systems +  (for [sprite sprites-group] +    (apply-gravity sprite sprites-group) +    (apply-collisions sprite sprites-group)) + +  (for [sprite sprites-group] +    (.blit screen sprite.surf sprite.rect)) +    (pygame.display.flip) -  (.tick clock 60)) +  (.tick clock 60) +  )  (pygame.quit) | 
