Godot中Camera2D超出Node2D范围后失去控制的缩放问题求助
Godot中Camera2D超出Node2D范围后失去控制的缩放问题求助
我在Godot里写的Camera2D控制逻辑本身运行正常,但遇到了一个完全没预料到的问题——当相机超出某个Node2D节点的范围后,Camera2D的缩放控制就失效了。
我录制了一段视频来展示这个问题,能帮你更直观地理解异常现象。
我想要修复这个缩放异常的问题,而且我觉得问题应该不在我的相机控制脚本本身。下面是我的Camera2D代码:
extends Camera2D # Player reference var player # Camera settings var default_zoom = Vector2(0.4, 0.4) # Default zoom level var camera_offset = Vector2(0, 0) # Offset between player and camera var follow_speed = 0.7 # Speed of camera following var zoom_speed = 0.2 # Speed of zooming while moving var zoom_step = 0.1 # Zoom step when moving or jumping # Track player's previous position to determine movement var prev_player_position = Vector2.ZERO func _ready(): # Attempt to find the player node dynamically with a maximum number of attempts var max_attempts = 10 var current_attempt = 0 while player == null and current_attempt < max_attempts: player = get_node_or_null("/root/Game/Player") current_attempt += 1 if player == null: print("Player node not found. Retrying in 1 second...") yield(get_tree().create_timer(1.0), "timeout") if player == null: print("Player node not found after multiple attempts.") # Set the initial zoom to the default value set_zoom(default_zoom) func _process(_delta): # Rest of the code remains unchanged if player: var target_pos = player.global_position + camera_offset position = position.linear_interpolate(target_pos, follow_speed) clamp_to_scene_bounds() apply_zoom_step() func clamp_to_scene_bounds(): # Optionally, you can add code here to clamp the camera position to the scene bounds # For example: var viewport_rect = get_viewport_rect() position.x = clamp(position.x, viewport_rect.position.x, viewport_rect.size.x) position.y = clamp(position.y, viewport_rect.position.y, viewport_rect.size.y) func apply_zoom_step(): if player.global_position != prev_player_position: # Player is moving or jumping var distance_to_player = position.distance_to(player.position) var target_zoom = clamp(1.0 / (distance_to_player * zoom_speed), 0.5, 2.0) # Apply zoom step var new_zoom = Vector2(default_zoom.x * target_zoom, default_zoom.y * target_zoom) new_zoom = new_zoom.linear_interpolate(get_zoom(), zoom_step) set_zoom(new_zoom) # Update the previous player position for the next frame prev_player_position = player.global_position
备注:内容来源于stack exchange,提问作者MD. SABBIR HOSHN HOWLADR
相关产品推荐
相关产品推荐

