(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)) (defclass Enemy [Entity] (setv _type "enemy")) (defclass Enemy2Swords [Enemy] (defn __init__ [self id tile tile-size x y] (.__init__ (super) id tile tile-size x y) (.flush self)) (defn move [self move] (.append self.moves move) (.move_ip self._rect (get move 0) (get move 1))) (defn flush [self] (setv self.moves [])) (defn ground [self]) (defn [property] total-move [self] (merge-moves self.moves)))