blob: c910416c87df7809ef3801996b89cd7fe5af5168 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
(require hy)
(require hyrule)
(import pygame
pytmx.util_pygame [load_pygame]
pprint [pprint])
(pygame.init)
(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
(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)
)
(pygame.quit)
|