From e1a3ca9c593ae2625b97a7fb34d5f126c933699f Mon Sep 17 00:00:00 2001 From: yuki Date: Sat, 15 Nov 2025 09:17:20 -0300 Subject: [PATCH] add basic camera --- scenes/level_camera/level_camera_2d.gd | 31 ++++++++++++++++++++++ scenes/level_camera/level_camera_2d.gd.uid | 1 + scenes/level_camera/level_camera_2d.tscn | 6 +++++ scenes/main.tscn | 6 ++++- 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 scenes/level_camera/level_camera_2d.gd create mode 100644 scenes/level_camera/level_camera_2d.gd.uid create mode 100644 scenes/level_camera/level_camera_2d.tscn diff --git a/scenes/level_camera/level_camera_2d.gd b/scenes/level_camera/level_camera_2d.gd new file mode 100644 index 0000000..1fa1f30 --- /dev/null +++ b/scenes/level_camera/level_camera_2d.gd @@ -0,0 +1,31 @@ +extends Camera2D + +enum FollowTarget { BALL, PLAYER1, PLAYER2 } + +@export_range(0, 1, 0.01) var ball_weight: float = 0.6 +@export_range(0, 1, 0.01) var player_weight: float = 0.2 +@export var follow_speed: float = 8.0 +@export var deadzone_margin: float = 100.0 + +@onready var ball: RigidBody2D = get_node("../Ball") +@onready var player1: CharacterBody2D = get_node("../Player1") +@onready var player2: CharacterBody2D = get_node("../Player2") + +var target_pos: Vector2 = Vector2.ZERO + +func _physics_process(delta: float) -> void: + var total_weight: float = ball_weight + player_weight * 2.0 + target_pos = ( + ball.global_position * ball_weight + + player1.global_position * player_weight + + player2.global_position * player_weight + ) / total_weight + + global_position = global_position.lerp(target_pos, follow_speed * delta) + + var spread: float = maxf( + absf(player1.global_position.x - player2.global_position.x), + absf(player1.global_position.y - player2.global_position.y) + ) + var target_zoom: Vector2 = Vector2.ONE * (600.0 / spread) + zoom = target_zoom.limit_length(1.5) diff --git a/scenes/level_camera/level_camera_2d.gd.uid b/scenes/level_camera/level_camera_2d.gd.uid new file mode 100644 index 0000000..b72781f --- /dev/null +++ b/scenes/level_camera/level_camera_2d.gd.uid @@ -0,0 +1 @@ +uid://bsvjinfmr1pek diff --git a/scenes/level_camera/level_camera_2d.tscn b/scenes/level_camera/level_camera_2d.tscn new file mode 100644 index 0000000..71752af --- /dev/null +++ b/scenes/level_camera/level_camera_2d.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://7nljh05o8b8e"] + +[ext_resource type="Script" uid="uid://bsvjinfmr1pek" path="res://scenes/level_camera/level_camera_2d.gd" id="1_rls2d"] + +[node name="LevelCamera2D" type="Camera2D"] +script = ExtResource("1_rls2d") diff --git a/scenes/main.tscn b/scenes/main.tscn index ace03fb..faaa0c3 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=4 uid="uid://d3c6aioatcy20"] +[gd_scene load_steps=5 format=4 uid="uid://d3c6aioatcy20"] [ext_resource type="TileSet" uid="uid://doja61ouvb77l" path="res://resources/tilesets/level.tres" id="1_uu6xs"] [ext_resource type="PackedScene" uid="uid://642nm6c4mpxx" path="res://scenes/player/player.tscn" id="2_r0du0"] [ext_resource type="PackedScene" uid="uid://cmgwv41ht3q4j" path="res://scenes/ball/ball.tscn" id="3_r0du0"] +[ext_resource type="PackedScene" uid="uid://7nljh05o8b8e" path="res://scenes/level_camera/level_camera_2d.tscn" id="4_jyhfs"] [node name="Main" type="Node"] @@ -26,3 +27,6 @@ id = 2 [node name="Ball" parent="." instance=ExtResource("3_r0du0")] position = Vector2(162, 115) + +[node name="LevelCamera2D" parent="." instance=ExtResource("4_jyhfs")] +ball_weight = 0.4