(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)) (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 [])))