aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/macroknight/entities.hy40
-rw-r--r--src/macroknight/game.hy18
-rw-r--r--src/macroknight/systems.hy19
-rw-r--r--src/macroknight/utils.hy7
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))))