diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/macroknight/entities.hy | 40 | ||||
-rw-r--r-- | src/macroknight/game.hy | 18 | ||||
-rw-r--r-- | src/macroknight/systems.hy | 19 | ||||
-rw-r--r-- | src/macroknight/utils.hy | 7 |
4 files changed, 57 insertions, 27 deletions
diff --git a/src/macroknight/entities.hy b/src/macroknight/entities.hy index 760aeca..2ba77ea 100644 --- a/src/macroknight/entities.hy +++ b/src/macroknight/entities.hy @@ -72,8 +72,9 @@ (defn move [self move] (.append self.moves move) (.move_ip self._rect (get move 0) (get move 1)) - (setv self.facing - (.x-from-move Direction move))) + (when (!= (get move 0) 0) + (setv self.facing + (.x-from-move Direction move)))) (defn [property] total-move [self] (merge-moves self.moves)) @@ -104,7 +105,9 @@ (setv self._disp_surf (case self.facing Direction.LEFT (pygame.transform.flip self._surf True False) - Direction.RIGHT (.copy self._surf)))) + Direction.RIGHT (.copy self._surf))) + + (.flush self)) (defn flush [self] (setv self.moves [])) @@ -115,17 +118,23 @@ (defclass Enemy [Entity] (setv _type "enemy") - (defn __init__ [self id tile tile-size x y] - (.__init__ (super) id tile tile-size x y) + (defn __init__ [self id tiles tile-size x y] + (.__init__ (super) id (get tiles 0) tile-size x y) + (setv self.tiles tiles) (setv self.facing Direction.RIGHT) (setv self.attacking False) + (setv self.animate-end 0) (.flush self)) (defn move [self move] (.append self.moves move) (.move_ip self._rect (get move 0) (get move 1)) - (setv self.facing - (.x-from-move Direction move))) + (when (!= (get move 0) 0) + (setv self.facing + (.x-from-move Direction move)))) + + (defn attack [self] + (setv self.attacking True)) (defn flush [self] (setv self.moves [])) @@ -133,10 +142,23 @@ (defn ground [self]) (defn animate [self ticks] + ;; Attack animation + (when (and self.attacking (= self.animate-end 0)) + (setv self.animate-end (+ ticks 200)) + (.blit self._surf (get self.tiles 1) #(0 0))) + (when (and self.attacking (> ticks self.animate-end)) + (setv self.animate-end 0) + (setv self.attacking False) + (.blit self._surf (get self.tiles 0) #(0 0))) + (setv self._disp_surf (case self.facing Direction.LEFT (pygame.transform.flip self._surf True False) - Direction.RIGHT (.copy self._surf)))) + Direction.RIGHT (.copy self._surf))) + (.flush self)) (defn [property] total-move [self] - (merge-moves self.moves))) + (merge-moves self.moves)) + + (defn [property] surf [self] + self._disp_surf)) diff --git a/src/macroknight/game.hy b/src/macroknight/game.hy index 95cb8b1..7709f41 100644 --- a/src/macroknight/game.hy +++ b/src/macroknight/game.hy @@ -49,7 +49,8 @@ tile-y)) "Enemy1" (.append entities (Enemy (len entities) - (get tileset.tiles 128) + [(get tileset.tiles 128) + (get tileset.tiles 129)] TILE_SIZE tile-x tile-y))))) @@ -157,15 +158,14 @@ (for [entity entities] (apply-collisions entity entities))) - (.animate player (pygame.time.get_ticks)) - (.flush player) - ;; Apply systems - (for [entity entities] - (apply-gravity entity entities) - (run-enemies entity entities) - (apply-collisions entity entities)) - + (let [ticks (pygame.time.get_ticks)] + (for [entity entities] + (run-enemies entity entities) + (when (hasattr entity "animate") (.animate entity ticks)) + (apply-gravity entity entities) + (apply-collisions entity entities))) + (except [GoalHit] (setv level-id (+ level-id 1)) (setv running False) diff --git a/src/macroknight/systems.hy b/src/macroknight/systems.hy index 8c1bb9c..f503642 100644 --- a/src/macroknight/systems.hy +++ b/src/macroknight/systems.hy @@ -1,4 +1,4 @@ -(import utils [sub-points Direction]) +(import utils [sub-points distance Direction]) ;; Define systems here (setv GRAVITY 5) @@ -40,14 +40,17 @@ (= entity.type "enemy") ;; If the player is on the tile next to the enemy, attack. (let [player (next (entities-by-type entities ["player"])) - dist (sub-points entity.pos player.pos) - direction (.x-from-move Direction dist)] + delta (sub-points entity.pos player.pos) + dist (distance entity.pos player.pos) + direction (.x-from-move Direction delta)] ;; If facing the player and within reach, attack) (when (and (= direction entity.facing) - (< (get dist 1) 1) ;; Same level - (< (abs (get dist 0)) 2) + (< (get delta 1) 1) ;; Same level + (< (abs (get delta 0)) 2) (not entity.attacking)) - (setv entity.attacking True) - (print "attack") - ) + (.attack entity)) + ;; If not facing the player, turn to face + (when (and (< dist 5) + (!= direction entity.facing)) + (.move entity #((if (< (get delta 0) 0) -1 1) 0))) )) diff --git a/src/macroknight/utils.hy b/src/macroknight/utils.hy index dde8d2e..5de8887 100644 --- a/src/macroknight/utils.hy +++ b/src/macroknight/utils.hy @@ -1,4 +1,5 @@ -(import enum [Enum]) +(import enum [Enum] + math [sqrt]) (defclass Direction [Enum] (setv UP "UP") @@ -44,3 +45,7 @@ (defn sub-points [point1 point2] #((- (get point2 0) (get point1 0)) (- (get point2 1) (get point2 1)))) + +(defn distance [point1 point2] + (sqrt (+ (** (- (get point1 0) (get point2 0)) 2) + (** (- (get point1 1) (get point2 1)) 2)))) |