# game_camera_test —— CameraProcedure / PythonApplicationCamera 的离线状态回归。 extends SceneTree const GameCamera = preload("res://game_camera.gd") var _fail := 0 func _ck(condition: bool, message: String) -> void: if not condition: _fail += 1 printerr("FAIL: " + message) func _init() -> void: await _run() if _fail == 0: print("PASS: game_camera_test (NORMAL/STAND/BLEND + cm/degree conversion)") quit(0) else: printerr("%d check(s) failed" % _fail) quit(1) func _run() -> void: var root := Node3D.new() get_root().add_child(root) var actor := Node3D.new() actor.position = Vector3(10, 2, 20) root.add_child(actor) var camera: Camera3D = GameCamera.new() camera.target = actor root.add_child(camera) await process_frame _ck(camera.camera_mode == GameCamera.CameraMode.NORMAL, "starts in NORMAL mode") _ck(is_equal_approx(camera.dist, 15.5), "default distance is 1550cm") _ck(is_equal_approx(camera.pitch, deg_to_rad(27.0)), "default pitch is 27 degrees") var shot := {"x": 1000, "y": 2000, "z": 300, "distance": 500, "pitch": 40, "rot": 90, "up": 0, "view": 0, "cross": 0} camera.set_event_camera(shot) _ck(camera.camera_mode == GameCamera.CameraMode.STAND, "SET_CAMERA enters STAND") _ck(camera.is_event_locked(), "event camera locks orbit") var setting: Dictionary = camera.get_camera_setting() _ck(is_equal_approx(float(setting.distance), 500.0), "event distance remains centimetres") camera.snap_to_target() _ck(camera.global_position.distance_to(Vector3(13.830, 6.214, 20)) < 0.02, "event centre converts server x/y/z into world axes: %s" % camera.global_position) camera.blend_event_camera({"x": 3000, "y": 4000, "z": 500, "distance": 1000, "pitch": 60, "rot": 180}, 1.0) camera._process(0.5) var middle: Dictionary = camera.get_camera_setting() _ck(camera.camera_mode == GameCamera.CameraMode.BLEND, "blend remains BLEND before deadline") _ck(is_equal_approx(float(middle.distance), 750.0), "blend is linear at half duration") camera._process(0.6) _ck(camera.camera_mode == GameCamera.CameraMode.STAND, "blend settles into STAND") _ck(is_equal_approx(camera.dist, 10.0), "blend target distance applied") camera.set_default_camera() _ck(camera.camera_mode == GameCamera.CameraMode.NORMAL, "RESTORE_CAMERA enters NORMAL") _ck(is_equal_approx(camera.dist, 15.5), "RESTORE_CAMERA restores saved normal view") root.queue_free()