Files
mtgodot-poc/project/game_camera_test.gd
T
shenandshen c93894313a fix: 装备属性面板避让逻辑 + 多项功能更新
- item_tooltip_view.gd: 新增 avoid_rect 属性,tooltip 与装备窗口重叠时自动推到左侧
- inventory_ui.gd: 悬停装备时传入窗口矩形作为避让区域
- 包含其他累积的功能开发和测试文件
2026-09-21 16:38:59 -07:00

90 lines
3.5 KiB
GDScript

# 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")
_ck(is_equal_approx(camera._look_target().y, actor.position.y + 1.2065217),
"target height follows CameraProcedure distance interpolation")
var wheel := InputEventMouseButton.new()
wheel.button_index = MOUSE_BUTTON_WHEEL_UP
wheel.factor = 1.0
wheel.pressed = true
var before_wheel: float = camera.dist
camera._unhandled_input(wheel)
camera._process(1.0 / 60.0)
_ck(camera.dist < before_wheel, "wheel up zooms in")
var after_first_wheel: float = camera.dist
camera._process(1.0 / 60.0)
_ck(camera.dist < after_first_wheel, "wheel zoom uses damped velocity")
camera._wheel_zoom_velocity_cm = 0.0
camera.dist = 10.0
camera.set_key_zoom(1)
camera._process(1.0 / 60.0)
camera.set_key_zoom(0)
_ck(is_equal_approx(camera.dist, 10.5),
"keyboard zoom applies the 40250 0.05 ratio")
camera.dist = camera.min_dist
_ck(is_equal_approx(camera._look_target().y, actor.position.y + 1.5),
"target height reaches face height at minimum distance")
camera.dist = camera.max_dist
_ck(is_equal_approx(camera._look_target().y, actor.position.y + 1.0),
"target height reaches standard height at maximum distance")
camera.dist = 15.5
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()