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))
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 _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, )
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
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
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)
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
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
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))