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

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

  (defn __init__ [self id tile tile-size x y]
    (.__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 (* x tile-size)
                                :top (* y tile-size))))

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

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

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

  (defn [property] type [self]
    self._type))

(defclass LevelTile [Entity]
  (setv _fixed True)
  (setv _type "level")

  (defn __init__ [self id tile tile-size x y scaling]
    (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 Goal [Entity]
  (setv _type "goal")
  (setv _fixed True))

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

  (defn __init__ [self id tile tile-size x y]
    (.__init__ (super) id tile tile-size x y)
    (setv self.jumping False)
    (setv self.jump-move 0)
    (setv self.moves [])
    (setv self._disp_surf (.copy self._surf)))

  (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 animate [self]
    (let [x-move (get self.total-move 0)]
      (setv self._disp_surf
            (cond
              (< x-move 0) (pygame.transform.flip self._surf True False)
              (> x-move 0) (.copy self._surf)
              True self._disp_surf))))

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

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