def test_transfromation_movement( vp_width, vp_height, pixel_ratio, cam_pos, point, delta, ): cam = Camera( viewport=(0, 0, vp_width, vp_height), pixel_ratio=pixel_ratio, ) cam.position = cam_pos assume(delta.length != 0) point_moved = point + delta assume(point_moved != point) # This will happen when delta is too small to make an effect note(f"point moved: {point_moved}") diff = cam.translate_to_frame(point_moved) - cam.translate_to_frame(point) note(f"frame diff: {diff}") assert isclose(delta.length, pixel_ratio * diff.length, rel_tol=1e-4) diff = cam.translate_to_viewport(point_moved) - cam.translate_to_viewport( point) note(f"viewport diff: {diff}") assert isclose(diff.length, pixel_ratio * delta.length, rel_tol=1e-4)
def test_transfromation_roundtrip(vp_width, vp_height, pixel_ratio, cam_pos, point): cam = Camera( viewport=(0, 0, vp_width, vp_height), pixel_ratio=pixel_ratio, ) cam.position = cam_pos note( f"frame: ({cam.frame_left}, {cam.frame_bottom}) -> ({cam.frame_right}, {cam.frame_top})" ) # Some underflow/loss of precision problems assume(cam.frame_left != cam.frame_right) assume(cam.frame_top != cam.frame_bottom) note(f"point: {point}") point_frame = cam.translate_to_frame(point) note(f"point->frame: {point_frame}") point_viewport = cam.translate_to_viewport(point_frame) note(f"point->frame->viewport: {point_viewport}") assert point_viewport.isclose(point, rel_tol=1e-5, rel_to=[cam.position]) point_viewport = cam.translate_to_viewport(point) note(f"point->viewport: {point_viewport}") point_frame = cam.translate_to_frame(point_viewport) note(f"point->viewport->frame: {point_frame}") assert point_frame.isclose(point, rel_tol=1e-5, rel_to=[cam.position])
def test_camera_translate_to_viewport(): cam = Camera(viewport=(0, 0, 800, 600), pixel_ratio=80) assert cam.position == Vector(0, 0) assert cam.translate_to_viewport(Vector(0, 0)) == Vector(400, 300) assert cam.translate_to_viewport(Vector(2, -1)) == Vector(560, 220) cam.position = Vector(5, 5) assert cam.translate_to_viewport(Vector(5, 5)) == Vector(400, 300) assert cam.translate_to_viewport(Vector(7, 4)) == Vector(560, 220)
def test_main_camera(scene): assert scene.main_camera is None new_cam = Camera(None, 25, (800, 600)) scene.main_camera = new_cam assert scene.main_camera == new_cam assert new_cam in scene
def test_main_camera(scene): assert isinstance(scene.main_camera, Camera) old_cam = scene.main_camera new_cam = Camera() scene.main_camera = new_cam assert scene.main_camera == new_cam assert old_cam not in scene assert new_cam in scene
def __init__(self, *, set_up: Callable = None, pixel_ratio: Number = 64, **kwargs): super().__init__() for k, v in kwargs.items(): setattr(self, k, v) self.game_objects = self.container_class() self.main_camera = Camera(pixel_ratio=pixel_ratio) if set_up is not None: set_up(self)
def test_camera_translate_to_frame(): cam = Camera(viewport=(0, 0, 800, 600), pixel_ratio=80) assert cam.position == Vector(0, 0) assert cam.frame_top == 3.75 assert cam.frame_bottom == -3.75 assert cam.frame_left == -5 assert cam.frame_right == 5 assert cam.translate_to_frame(Vector(400, 300)) == Vector(0, 0) assert cam.translate_to_frame(Vector(560, 220)) == Vector(2, 1) cam.position = Vector(5, 5) assert cam.translate_to_frame(Vector(400, 300)) == Vector(5, 5) assert cam.translate_to_frame(Vector(560, 220)) == Vector(7, 6)
def __init__(self, engine, *, background_color: Sequence[int] = (0, 0, 100), container_class: Type = GameObjectCollection, set_up: Callable = None, pixel_ratio: Union[int, float] = 80, **kwargs): super().__init__(engine) self.background_color = background_color self.background = None self.game_objects = container_class() self.main_camera = Camera(pixel_ratio=pixel_ratio) if set_up is not None: set_up(self)
def test_sprite_in_viewport(): cam = Camera(viewport=(0, 0, 800, 600)) class Thing(BaseSprite): def __init__(self, position=Vector(2, 2)): super().__init__() self.game_unit_size = 2 self.position = position sprite_in = Thing(Vector(-3, -1)) sprite_half_in = Thing(Vector(5, -2)) sprite_out = Thing(Vector(2, 5)) assert not cam.in_frame(sprite_out) assert cam.in_frame(sprite_in) assert cam.in_frame(sprite_half_in)
def test_sprite_in_viewport(): # Added the expected pixel ratio due to change in default breaking this test. # 80 is the legacy value. cam = Camera(viewport=(0, 0, 800, 600), pixel_ratio=80) class Thing(BaseSprite): def __init__(self, position=Vector(2, 2)): super().__init__() self.size = 2 self.position = position sprite_in = Thing(Vector(-3, -1)) sprite_half_in = Thing(Vector(5, -2)) sprite_out = Thing(Vector(2, 5)) assert not cam.in_frame(sprite_out) assert cam.in_frame(sprite_in) assert cam.in_frame(sprite_half_in)
def test_transformation_roundtrip(vp_width, vp_height, target_width, cam_pos, point): cam = Camera(None, target_width, (vp_width, vp_height)) cam.position = cam_pos note(f"frame: ({cam.left}, {cam.bottom}) -> ({cam.right}, {cam.top})") # Some underflow/loss of precision problems assume(cam.left != cam.right) assume(cam.top != cam.bottom) note(f"point: {point}") point_frame = cam.translate_point_to_screen(point) note(f"point->frame: {point_frame}") point_viewport = cam.translate_point_to_game_space(point_frame) note(f"point->frame->viewport: {point_viewport}") assert point_viewport.isclose(point, rel_tol=1e-5, rel_to=[cam.position]) point_viewport = cam.translate_point_to_game_space(point) note(f"point->viewport: {point_viewport}") point_frame = cam.translate_point_to_screen(point_viewport) note(f"point->viewport->frame: {point_frame}") assert point_frame.isclose(point, rel_tol=1e-5, rel_to=[cam.position])
def test_camera_translate_to_viewport_2(): cam = Camera(viewport=(0, 0, 800, 600), pixel_ratio=1) assert cam.position == Vector(0, 0) assert cam.translate_to_viewport(Vector(0, 0)) == Vector(400, 300) assert cam.translate_to_viewport(Vector(100, 100)) == Vector(500, 200) assert cam.translate_to_viewport(Vector(-150, -500)) == Vector(250, 800)
def test_viewport_change_affects_frame_height(): cam = Camera(viewport=(0, 0, 800, 600), pixel_ratio=80) assert cam.frame_left == -5 cam.viewport_width = 400 assert cam.frame_left == -2.5
def test_camera_move(): cam = Camera() cam.position = Vector(500, 500) assert cam.position == Vector(500, 500) cam.position += Vector(100, 100) assert cam.position == Vector(600, 600)
def camera(): return Camera(None, 10, (800, 600))
def test_camera_point_in_viewport_not_at_origin(): cam = Camera(viewport=(100, 100, 800, 600)) assert cam.point_in_viewport(Vector(150, 650)) assert cam.point_in_viewport(Vector(899, 300)) assert not cam.point_in_viewport(Vector(50, 50)) assert not cam.point_in_viewport(Vector(901, 600))
def test_camera_viewport(): cam = Camera(viewport=(0, 0, 800, 600)) assert cam.point_in_viewport(Vector(400, 400)) assert not cam.point_in_viewport(Vector(900, 600)) assert cam.viewport_offset == Vector(400, 300)