class Player(Ball): """The player ball.""" SPEED = 400 # movement speed with the keyboard def __init__(self, x, y): """ Creates the player ball. @param x: initial x position of the ball. @param y: initial y position of the ball. """ super().__init__("player.png") self.position = x, y # WARNING: position is a tuple, not a vector! self.cshape.center = Vector2(x, y) # the center must be a Vector2! self._frozen = False self._invulnerable = False self.invulnerableSprite = Sprite("player_invulnerable.png", opacity=0) self.add(self.invulnerableSprite, z=0.8) def freeze(self): """Freezes the ball.""" self.image = pyglet.resource.image("player_frozen.png") self._frozen = True def unfreeze(self): """Unfreezes the ball.""" self._frozen = False self.image = pyglet.resource.image("player.png") def isFrozen(self): """Returns whether the ball is frozen.""" return self._frozen def makeInvulnerable(self): """Makes the ball invulnerable.""" self.invulnerableSprite.stop() self._invulnerable = True self.invulnerableSprite.opacity = 255 def makeVulnerable(self): """Makes the ball vulnerable after an animation.""" if self.isInvulnerable(): self.invulnerableSprite.stop() actions = FadeOut(0.2) + (FadeIn(0.2) + FadeOut(0.2)) * 4 + \ CallFunc(self._makeVulnerable) self.invulnerableSprite.do(actions) def isInvulnerable(self): """Returns whether the ball is invulnerable.""" return self._invulnerable def update(self, dt, mouseDelta: Vector2, keysPressed): # Move player according to mouse/keyboard if not self.isFrozen(): self.position += mouseDelta self.position += Player._keyboardDelta(keysPressed) * Player.SPEED * dt self.ensureWithinBorders() # check borders def _makeVulnerable(self): self.invulnerableSprite.opacity = 0 self._invulnerable = False @staticmethod def _keyboardDelta(keysPressed): """ Returns a vector that points to the direction the arrow keys are pressed. Each coordinate of the vector will have the value -1, 0 or 1. @param keysPressed: the keys currently held down. @return: direction of the arraw keys pressed in the keyboard. """ delta = Vector2(0, 0) if window.key.LEFT in keysPressed: delta.x -= 1 if window.key.RIGHT in keysPressed: delta.x += 1 if window.key.UP in keysPressed: delta.y += 1 if window.key.DOWN in keysPressed: delta.y -= 1 return delta