Godot4:Tilemap地图上移动相机时出现抖动问题
Camera2D移动时Tilemap纹理显示异常的解决方法
我正在开发一款游戏,玩家通过移动Camera2D在Tilemap地图上进行导航,但相机移动时纹理显示异常,不清楚如何让纹理保持清晰。
相机场景代码如下:
extends Camera2D # Zoom variables var min_zoom = Vector2(1, 1) var max_zoom = Vector2(2, 2) var desired_zoom = zoom # Movement variables var camera_speed = 500 # Map boundaries var min_x_pos = 0 var max_x_pos = 2560 var min_y_pos = 0 var max_y_pos = 1360 func _physics_process(delta): if global_position != get_camera_position(delta): global_position = get_camera_position(delta) # var tween = create_tween() # tween.tween_property(self, "global_position", get_camera_position(delta), .2) func _unhandled_input(event): if event.is_action_pressed("zoom_in"): desired_zoom = zoom + Vector2(.25, .25) if desired_zoom <= max_zoom and desired_zoom >= min_zoom: var tween = create_tween() tween.tween_property(self, "zoom", desired_zoom, .08) elif event.is_action_pressed("zoom_out"): desired_zoom = zoom - Vector2(.25, .25) if desired_zoom <= max_zoom and desired_zoom >= min_zoom: var tween = create_tween() tween.tween_property(self, "zoom", desired_zoom, .08) func get_camera_position(delta): var new_camera_position = global_position if Input.is_action_pressed("ui_right") and new_camera_position.x <= 1984: new_camera_position.x += camera_speed * delta if Input.is_action_pressed("ui_left") and new_camera_position.x >= 400: new_camera_position.x -= camera_speed * delta if Input.is_action_pressed("ui_up") and new_camera_position.y >= 292: new_camera_position.y -= camera_speed * delta if Input.is_action_pressed("ui_down") and new_camera_position.y <= 1068: new_camera_position.y += camera_speed * delta return new_camera_position
实用解决步骤
对齐相机到整数像素:亚像素位置会导致纹理采样异常,修改
_physics_process方法,将目标位置取整后赋值:func _physics_process(delta): var target_pos = get_camera_position(delta) # 对齐到整数像素 target_pos = target_pos.floor() if global_position != target_pos: global_position = target_pos若Tile有固定尺寸(如16x16),也可对齐到Tile倍数:
var tile_size = Vector2(16,16) target_pos = (target_pos / tile_size).floor() * tile_size修改纹理过滤模式:选中Tilemap使用的纹理,在Inspector面板中将Filter设置为
Nearest,避免缩放时出现模糊。启用相机像素捕捉:在Camera2D的Inspector中勾选Pixel Snap选项,引擎会自动将相机位置对齐到像素边界。
优化缩放逻辑:确保缩放值为合理的整数或 Tile 比例倍数,避免非整数倍缩放导致的纹理错位。你当前的0.25步长可保留,但需确保缩放后相机视口与纹理尺寸匹配。
平滑相机移动:启用代码中注释的Tween平滑移动,避免位置突变引发的显示波动:
func _physics_process(delta): var target_pos = get_camera_position(delta) target_pos = target_pos.floor() if global_position != target_pos: var tween = create_tween() tween.tween_property(self, "global_position", target_pos, 0.2)
内容的提问来源于stack exchange,提问作者Gabriel Zuser
相关产品推荐
相关产品推荐

