def spawn_ball_copy(self, original: Ball, angle_delta: float): ball = self.spawn_ball(original.drawable.pos.clone(), original.drawable.size.clone()) velocity = original.velocity.clone() angle = velocity.angle magnitude = velocity.magnitude ball.velocity = Vector2.from_angle_magnitude(angle + angle_delta, magnitude)
def power_up_token_collision(self, token: PowerUpToken, paddle: Paddle): if isinstance(token, MultiBallPowerUpToken): ball = self.balls[0] # shoot main ball straight down ball.velocity = Vector2.from_angle_magnitude( math.pi / 2, ball.velocity.magnitude) self.spawn_ball_copy(ball, 2 * math.pi / 3) self.spawn_ball_copy(ball, -2 * math.pi / 3) self.remove_game_object(token)
def deflect(self, ball: Ball, direction: int): ballrect = ball.drawable.get_rect() paddlerect = self.drawable.get_rect() ballcenter = ballrect.vertical_center paddlecenter = paddlerect.vertical_center distance = ballcenter - paddlecenter distancenorm = max(min(distance / (paddlecenter - paddlerect.top), 1), -1) # clamp at (-1, 1) just in case - collision can cause us to be above the paddle's bounds magnitude = ball.velocity.magnitude straightangle = (direction - 1) * 0.5 * math.pi angle = distancenorm * self.paddleMaxAngleDeflection * direction + straightangle ball.velocity = Vector2.from_angle_magnitude(angle, magnitude)