extends SceneTree var failures: Array[String] = [] func _init() -> void: var scene: PackedScene = load("res://scenes/characters/player.tscn") if scene == null: push_error("Could not load player.tscn") quit(1) return var player: Node = scene.instantiate() var sprite: Sprite2D = player.get_node("CharacterSprite") as Sprite2D var collision: CollisionShape2D = player.get_node("CollisionShape2D") as CollisionShape2D var camera: Camera2D = player.get_node("Camera2D") as Camera2D var animation_player: AnimationPlayer = player.get_node("AnimationPlayer") as AnimationPlayer _expect_vector((player as Node2D).scale, Vector2(4, 4), "Player root scale") _expect_vector(sprite.scale, Vector2.ONE, "CharacterSprite local scale should keep anchor") _expect_vector(sprite.offset, Vector2(-24, -40), "CharacterSprite visible foot offset") _expect_vector(collision.scale, Vector2.ONE, "CollisionShape2D local scale should keep anchor") _expect_vector(collision.position, Vector2(0, -18), "CollisionShape2D local position should keep anchor") _expect_vector(camera.position, Vector2(0, -37.5), "Camera2D position should compensate player scale") _expect_vector(camera.scale, Vector2(0.25, 0.25), "Camera2D scale should compensate player scale") _expect_animation_offset(animation_player, "idle", Vector2(-24, -40)) _expect_animation_offset(animation_player, "jump", Vector2(-24, -44)) _expect_animation_offset(animation_player, "挥砍", Vector2(-40, -48)) player.free() if failures.is_empty(): print("PASS player scale") quit(0) else: for failure: String in failures: push_error(failure) quit(1) func _expect_vector(actual: Vector2, expected: Vector2, label: String) -> void: if not actual.is_equal_approx(expected): failures.append("%s: expected %s, got %s" % [label, expected, actual]) func _expect_animation_offset(animation_player: AnimationPlayer, animation_name: String, expected: Vector2) -> void: var animation: Animation = animation_player.get_animation(animation_name) if animation == null: failures.append("Missing animation: %s" % animation_name) return for track_index: int in range(animation.get_track_count()): if animation.track_get_path(track_index) == NodePath("CharacterSprite:offset"): var actual: Vector2 = animation.track_get_key_value(track_index, 0) _expect_vector(actual, expected, "%s CharacterSprite offset" % animation_name) return failures.append("Missing CharacterSprite offset track: %s" % animation_name)