def test_reflect_vertical( self, ball_top_left: Point, ball_angle: float, ball_result_top_left: Point, ball_result_angle: float, hit_objects_count: int, ): ball = Ball( top_left=ball_top_left, width=2.5, height=3.0, velocity=1.0, angle=Angle(deg2rad(ball_angle)), ) bricks = [ Brick(top_left=Point(1.0, 3.0), width=4.0, height=4.0), Brick(top_left=Point(5.0, 3.0), width=4.0, height=4.0), Brick(top_left=Point(9.0, 3.0), width=4.0, height=4.0), ] hit_objects = reflect_from_game_objects(ball, bricks) assert len(hit_objects) == hit_objects_count assert ball.top_left.x == ball_result_top_left.x assert ball.top_left.y == ball_result_top_left.y assert ball.angle.value == approx(deg2rad(ball_result_angle))
def test_reflect_from_three_objects_in_corner( self, brick1_top_left: Point, brick2_top_left: Point, brick3_top_left: Point, ball_top_left: Point, ball_angle: float, ball_result_top_left: Point, ball_result_angle: float, ): ball = Ball( top_left=ball_top_left, width=2.0, height=2.0, velocity=1.0, angle=Angle(deg2rad(ball_angle)), ) bricks = [ Brick(top_left=brick1_top_left, width=3.0, height=3.0), Brick(top_left=brick2_top_left, width=3.0, height=3.0), Brick(top_left=brick3_top_left, width=3.0, height=3.0), ] hit_objects = reflect_from_game_objects(ball, bricks) assert len(hit_objects) == 3 assert ball.top_left.x == ball_result_top_left.x assert ball.top_left.y == ball_result_top_left.y assert ball.angle.value == approx(deg2rad(ball_result_angle))
def _handle_ball_collisions(self): hit_objects = reflect_from_game_objects( ball=self._level.ball, game_objects=[self._level.left_wall] + [self._level.right_wall] + [self._level.top_wall] + self._level.bricks + self._level.indestructible_bricks, ) for hit_object in hit_objects: if not isinstance(hit_object, Brick): continue if hit_object.is_destroyed(): play_destroy_brick(self._audio_device) self._score += self._get_brick_score(hit_object) self._award_extra_life_it_threshold_reached() self._update_values_in_title_bar() else: play_hit_brick(self._audio_device) if reflect_from_platform(self._level.ball, self._level.platform): play_hit_platform(self._audio_device)