コード例 #1
0
ファイル: balls.py プロジェクト: brunonova/collision
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