Пример #1
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))
Пример #2
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))
Пример #3
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))
Пример #4
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,
    )
Пример #5
0
 def __init__(
     self,
     top_left: Point = Point(0.0, 0.0),
     width: float = 0.0,
     height: float = 0.0,
     velocity: float = 0.0,
     angle: Angle = Angle(0.0),
     gravity: float = 0.0,
 ):
     MoveableGameObject.__init__(self, top_left, width, height, velocity)
     self._angle = angle
     self._gravity = gravity
     self._is_active = False
Пример #6
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
Пример #7
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)
Пример #8
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
Пример #9
0
    def move(self, elapsed_time_in_ms: float):
        """
        Calculates were the ball moves in a timeframe.
        Considers velocity and gravity for calculation.
        """
        if not self._is_active:
            return

        new_pos = self.top_left

        if self.velocity != 0.0:
            new_pos = _calc_new_position(
                new_pos, self.velocity, self.angle, elapsed_time_in_ms
            )

        if self.gravity != 0.0:
            new_pos = _calc_new_position(
                new_pos, self.gravity, Angle(deg2rad(90.0)), elapsed_time_in_ms
            )

        self._top_left = new_pos
Пример #10
0
 def test_clamp_angle(self, input_angle: float, output_angle: float):
     angle = Angle(deg2rad(input_angle))
     output = _clamp_angle(angle)
     assert output.value == approx(deg2rad(output_angle))