aboutsummaryrefslogtreecommitdiff
path: root/src/macroknight
diff options
context:
space:
mode:
Diffstat (limited to 'src/macroknight')
-rw-r--r--src/macroknight/game.hy123
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)