From 2365ba765ca87604be7c40da2416c916ef6bde98 Mon Sep 17 00:00:00 2001 From: Dustin Date: Fri, 4 Apr 2025 18:01:48 -0700 Subject: [PATCH] finally an almost working camera model! --- Main.tscn | 6 ++--- project.godot | 2 ++ src/camera_control.gd | 38 ++++++++++++++++++++++++------- src/game_camera.gd | 52 ++++++++++++++++++++++++++++++++++++------- 4 files changed, 79 insertions(+), 19 deletions(-) diff --git a/Main.tscn b/Main.tscn index 8b7a2ed..29f8783 100644 --- a/Main.tscn +++ b/Main.tscn @@ -29,8 +29,8 @@ extents = Vector2( 160, 90 ) [node name="ViewportContainer" type="ViewportContainer" parent="."] material = SubResource( 3 ) -margin_right = 320.0 -margin_bottom = 180.0 +margin_right = 322.0 +margin_bottom = 182.0 rect_scale = Vector2( 2, 2 ) [node name="Viewport" type="Viewport" parent="ViewportContainer"] @@ -54,10 +54,10 @@ position = Vector2( 112, 56 ) position = Vector2( 160, 90 ) collision_layer = 0 collision_mask = 256 +collision/safe_margin = 0.25 script = ExtResource( 5 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="ViewportContainer/Viewport/KinematicBody2D"] -visible = false shape = SubResource( 1 ) [node name="Camera2D" type="Camera2D" parent="ViewportContainer/Viewport"] diff --git a/project.godot b/project.godot index ff4120c..8fe545b 100644 --- a/project.godot +++ b/project.godot @@ -293,4 +293,6 @@ common/physics_interpolation=true [rendering] quality/driver/driver_name="GLES2" +2d/snapping/use_gpu_pixel_snap=true vram_compression/import_etc=true +batching/precision/uv_contract=true diff --git a/src/camera_control.gd b/src/camera_control.gd index e8251e6..1f7f843 100644 --- a/src/camera_control.gd +++ b/src/camera_control.gd @@ -13,18 +13,40 @@ func _ready(): pass # Replace with function body. var flip_tracker = 0.0 +var stuck_check: bool func _physics_process(delta): var pos = global_position #pos = pos.move_toward(PlayerInfo.player_position, delta) - pos = lerp(pos, PlayerInfo.player_position, delta ) - var dir_to = pos.direction_to(PlayerInfo.player_position) - -# UiManager.debug_text = ("PP: " + str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) + -# "\nKB: " + str(global_position.snapped(Vector2(0.01,0.01))) + -# "\nCP: " + str (dir_to) -# ) + #pos = lerp(pos, PlayerInfo.player_position, delta ) + var dir_to = Vector2(0,0) - move_and_slide(dir_to * 90.0 ) + # Calculate how far the player is from object + var diff_to = (PlayerInfo.player_position - pos) + var dist_to = (PlayerInfo.player_position - pos).length() + + # Determine the chase direction of player is past the threshold + # Try to prevent bounce + if (is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.x) > 10: + dir_to = pos.direction_to(PlayerInfo.player_position) + elif !(is_on_wall() or is_on_floor() or is_on_ceiling()) and abs(diff_to.y) > 10: + dir_to = pos.direction_to(PlayerInfo.player_position) + + +# UiManager.debug_text = ( UiManager.debug_text + +# # str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) + +# "\n" + str(is_on_ceiling()) + str(is_on_floor()) + str(is_on_wall()) + +# "\nPP: {0}, {1}".format({"0":"%7.2f" % PlayerInfo.player_position.x, "1":"%7.2f" % PlayerInfo.player_position.y}) + +# #"\nKB: " + str(global_position.snapped(Vector2(0.01,0.01))) + +# "\nKB: {0}, {1}".format({"0":"%7.2f" % global_position.x, "1":"%7.2f" % global_position.y}) + +# "\nDir to: {0}, {1}".format({"0":"%7.2f" % dir_to.x, "1":"%7.2f" % dir_to.y}) + +# "\nPoint to: {0}, {1}".format({"0":"%7.2f" % diff_to.x, "1":"%7.2f" % diff_to.y}) +# #"\nDT: %7.2f" % dist_to +# ) + +# "Hi, {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114}) +#"Hi, {0} v{1}".format(["Godette", "3.0"], "{_}") + + move_and_slide(dir_to * 180.0 ) # flip_tracker += delta # if flip_tracker < 10: diff --git a/src/game_camera.gd b/src/game_camera.gd index f064589..cf29142 100644 --- a/src/game_camera.gd +++ b/src/game_camera.gd @@ -10,31 +10,67 @@ onready var window_scale :float = (OS.window_size / game_size).x onready var actual_cam_pos := global_position +export var acceleration := 2 +export var deceleration := 800.0 +export var max_speed := 60.0 +export var snap_unit := 10 + export var tracking_node_path :NodePath var _tracking_node :KinematicBody2D func _ready(): _tracking_node = get_node(tracking_node_path) +var velocity :float = 0 +var tracking_pos := Vector2(0,0) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): #var tracking_pos = PlayerInfo.player_position # var tracking_pos = lerp(global_position, _tracking_node.global_position , 0.7) - var tracking_pos = _tracking_node.global_position.round() + #var tracking_pos = _tracking_node.global_position.round() + var tp = _tracking_node.global_position.floor() + + var snapped_target_pos = Vector2( + round(tp.x / snap_unit) * snap_unit, + round(tp.y / snap_unit) * snap_unit + ) + +# if tracking_pos.distance_to(tp) >= 4: # tile width? +# tracking_pos = tp.snapped(Vector2(2,2)) + tracking_pos = snapped_target_pos # actual_cam_pos = lerp(actual_cam_pos, tracking_pos, delta * 5) - actual_cam_pos = lerp(actual_cam_pos, tracking_pos, delta * 5) - #position = actual_cam_pos - var cam_subpixel_pos = actual_cam_pos.round() - actual_cam_pos + #actual_cam_pos = lerp(actual_cam_pos, tracking_pos, .2) + var distance_to := global_position.distance_to(tracking_pos) -# LevelInfo.viewport_container.material.set_shader_param("cam_offset", cam_subpixel_pos ) + if distance_to < snap_unit: + velocity = 1 + else: + velocity += delta * distance_to - global_position = actual_cam_pos.round() + + # Clamp to max speed + if velocity > max_speed: + velocity = max_speed + + actual_cam_pos = actual_cam_pos.move_toward(tracking_pos, velocity) + #actual_cam_pos = global_position + #actual_cam_pos = tracking_pos.floor() + #position = actual_cam_pos + #var cam_subpixel_pos = actual_cam_pos.round() - actual_cam_pos + var cam_subpixel_pos :Vector2 = global_position - tracking_pos + #cam_subpixel_pos = cam_subpixel_pos.snapped(Vector2(0.2,0.2)) + global_position = actual_cam_pos.floor() + + #LevelInfo.viewport_container.material.set_shader_param("cam_offset", cam_subpixel_pos ) + + #global_position = actual_cam_pos.round() UiManager.debug_text = ("SP: " + str(cam_subpixel_pos.snapped(Vector2(0.01,0.01))) + - "\nCP: " + str (position.snapped(Vector2(0.01,0.01))) + - "\nTP: " + str(tracking_pos.snapped(Vector2(0.01,0.01))) + "\nCP: " + str (global_position.snapped(Vector2(0.1,0.1))) + + "\nTP: " + str(tracking_pos) + + "\nDT: " + str(distance_to) )