You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 12:53:01