aboutsummaryrefslogtreecommitdiff
path: root/src/macroknight/entities.hy
blob: 1ac59ce3fe85850a53242f9982711e1eaded862a (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
(import pygame.sprite [Sprite]
        pygame [Surface]
        pygame
        utils [neg merge-moves])

(defclass Entity [Sprite]
   ;;; Game entity
  (setv _fixed False)

  (defn __init__ [self id tile tile-size initial-pos]
    (.__init__ (super))
    (setv self.id id)
    (setv self._surf (Surface #(tile-size tile-size)))
    (.blit self._surf tile #(0 0))
    (setv self._rect (.get_rect self._surf
                                :left (* (get initial-pos 0) tile-size)
                                :top (* (get initial-pos 1) tile-size))))

  (defn [property] fixed [self]
    self._fixed)

  (defn [property] rect [self]
    self._rect)

  (defn [property] surf [self]
    self._surf))

(defclass LevelTile [Entity]
  (setv _fixed True)

  (defn __init__ [self id tile-size scaling x y tile]
    (let [tile-width (* (.get_width tile) scaling)
          tile-height (* (.get_height tile) scaling)
          tile_ (if (!= scaling 1)
                    (pygame.transform.scale tile #(tile-width tile-height))
                    tile)]
      (.__init__ (super) id tile_ tile-size #(x y)))))

(defclass Player [Entity]
  (setv SPEED 3)
  (setv JUMP_IMPULSE 10)
  (setv MAX_JUMPING 100)

  (defn __init__ [self id tile tile-size initial-x initial-y]
    (.__init__ (super) id tile tile-size #(initial-x initial-y))
    (setv self.jumping False)
    (setv self.jump-move 0))

  (defn move [self move]
    (.append self.moves move)
    (.move_ip self._rect (get move 0) (get move 1)))

  (defn [property] total-move [self]
    (merge-moves self.moves))

  (defn jump [self]
    (setv self.jumping True)
    (when (< self.jump-move self.MAX_JUMPING)
      (setv self.jump-move (+ self.jump-move self.JUMP_IMPULSE))
      (.move self #(0 (neg self.JUMP_IMPULSE)))))

  (defn ground [self]
    (setv self.jump-move 0))

  (defn flush [self]
    (setv self.moves [])))