Пример #1
0
def reflect_from_game_objects(
        ball: Ball, game_objects: List[GameObject]) -> List[GameObject]:
    """
    Reflect from game objects if ball has hit them.

    Get intersections with game objects.
    Reflect from one or several game objects.
    Return game objects which were hit.
    If brick was hit decrease hitpoints.
    """
    object_intersection_pairs = _get_object_intersection_pairs(
        ball, game_objects)
    if len(object_intersection_pairs) == 1:
        _reflect_from_single_object(
            ball=ball,
            game_object=object_intersection_pairs[0][0],
            intersection=object_intersection_pairs[0][1],
        )
        ball.angle = _clamp_angle(ball.angle)

        return [object_intersection_pairs[0][0]]
    if len(object_intersection_pairs) > 1:
        _reflect_from_multiple_objects(
            ball=ball, object_intersection_pairs=object_intersection_pairs)
        ball.angle = _clamp_angle(ball.angle)

        hit_objects: List[GameObject] = []
        for object_intersection_pair in object_intersection_pairs:
            hit_objects.append(object_intersection_pair[0])
        return hit_objects
    return []
Пример #2
0
    def test_gravity(self):
        obj = Ball(
            top_left=Point(8.2, 1.3),
            width=3.1,
            height=4.2,
            velocity=2.4,
            angle=Angle(deg2rad(30.0)),
            gravity=9.8,
        )
        assert obj.gravity == 9.8

        obj.gravity = 4.5
        assert obj.gravity == 4.5
Пример #3
0
    def test_angle(self):
        obj = Ball(
            top_left=Point(8.2, 1.3),
            width=3.1,
            height=4.2,
            velocity=2.4,
            angle=Angle(deg2rad(30.0)),
            gravity=9.8,
        )
        assert obj.angle.value == approx(deg2rad(30.0))

        obj.angle = Angle(deg2rad(65))
        assert obj.angle.value == approx(deg2rad(65.0))
Пример #4
0
    def test_move(self, active, velocity, degree, gravity, end_point):
        obj = Ball(
            top_left=Point(0.0, 0.0),
            width=3.1,
            height=4.2,
            velocity=velocity,
            angle=Angle(deg2rad(degree)),
            gravity=gravity,
        )
        obj.is_active = active
        time_in_ms = 1000
        obj.move(time_in_ms)

        assert obj.top_left.x == approx(end_point.x)
        assert obj.top_left.y == approx(end_point.y)
Пример #5
0
    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))
Пример #6
0
    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))
Пример #7
0
    def test_init_default(self):
        obj = Ball()

        assert obj.top_left.x == 0.0
        assert obj.top_left.y == 0.0
        assert obj.width == 0.0
        assert obj.height == 0.0
        assert obj.velocity == 0.0
        assert obj.angle.value == 0.0
        assert obj.gravity == 0.0
        assert obj.is_active == False
Пример #8
0
def _make_ball(velocity: float, gravity: float, grid_width: int,
               grid_height: int) -> Ball:
    point = _ball_init_position(grid_width=grid_width, grid_height=grid_height)

    return Ball(
        top_left=point,
        width=BALL_WIDTH,
        height=BALL_HEIGHT,
        velocity=velocity,
        angle=Angle(BALL_ANGLE),
        gravity=gravity,
    )
Пример #9
0
def reflect_from_platform(ball: Ball, platform: Platform) -> bool:
    """
    Reflect from platform if ball has hit it.
    
    Get intersections with platform.
    If intersections exists reflect from the platform.
    Return True to indicate reflection.
    """
    intersection = _get_intersection(ball, platform)
    if intersection == _Intersection.NONE:
        return False
    _reflect_from_single_object(ball, platform, intersection)
    ball.angle = _clamp_angle(ball.angle)
    return True
Пример #10
0
    def test_init(self):
        obj = Ball(
            top_left=Point(8.2, 1.3),
            width=3.1,
            height=4.2,
            velocity=2.4,
            angle=Angle(deg2rad(90.0)),
            gravity=9.8,
        )

        assert obj.top_left.x == 8.2
        assert obj.top_left.y == 1.3
        assert obj.width == 3.1
        assert obj.height == 4.2
        assert obj.velocity == 2.4
        assert obj.angle.value == approx(deg2rad(90.0))
        assert obj.gravity == 9.8
        assert obj.is_active == False
Пример #11
0
    def _handle_event_from_level_objects(
        self,
        event: _Event,
        elapsed_time_in_ms: float,
        left_wall: Wall,
        right_wall: Wall,
        ball: Ball,
        platform: Platform,
    ):
        if event == self._Event.p:
            self._is_paused = not self._is_paused
            self._changed_pause_state = True
            return
        self._changed_pause_state = False

        if event == self._Event.quit or event == self._Event.escape:
            self._is_quit = True
            return
        if event == self._Event.p:
            self._is_paused = not self._is_paused
            return

        if self._is_paused:
            return

        if event == self._Event.space:
            if not ball.is_active:
                ball.is_active = True
        elif event == self._Event.left:
            if _intersects_with_left_x(platform, left_wall):
                _put_before_intersects_with_left_x(platform, left_wall)
            else:
                _move_left(platform, elapsed_time_in_ms)
        elif event == self._Event.right:
            if _intersects_with_right_x(platform, right_wall):
                _put_before_intersects_with_right_x(platform, right_wall)
            else:
                _move_right(platform, elapsed_time_in_ms)
Пример #12
0
    def test_is_active(self):
        obj = Ball()
        assert obj.is_active == False

        obj.is_active = True
        assert obj.is_active == True