From 19b18532db0735836aefc791d88eea5d2c1d0453 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 14 Feb 2026 22:17:23 -0500 Subject: [PATCH] cleaned up player code, file organization; implemented simple-ish physics --- project.godot | 2 + ball.tscn => scenes/ball.tscn | 8 +- court.tscn => scenes/court.tscn | 2 + game.tscn => scenes/game.tscn | 6 +- hoop.tscn => scenes/hoop.tscn | 0 player.tscn => scenes/player.tscn | 16 +++- team.tscn => scenes/team.tscn | 0 .../ui/player_label.tscn | 0 scripts/ball.gd | 2 +- scripts/court.gd | 25 +++++ scripts/custom resources/player_attributes.gd | 1 + scripts/game_manager.gd | 5 +- scripts/player.gd | 91 ++++++++++++------- scripts/team.gd | 1 + teams/blue_team.tscn | 4 +- teams/orange_team.tscn | 9 +- 16 files changed, 118 insertions(+), 54 deletions(-) rename ball.tscn => scenes/ball.tscn (60%) rename court.tscn => scenes/court.tscn (97%) rename game.tscn => scenes/game.tscn (95%) rename hoop.tscn => scenes/hoop.tscn (100%) rename player.tscn => scenes/player.tscn (84%) rename team.tscn => scenes/team.tscn (100%) rename player_label.tscn => scenes/ui/player_label.tscn (100%) diff --git a/project.godot b/project.godot index 88ee73f..39c8f24 100644 --- a/project.godot +++ b/project.godot @@ -35,6 +35,8 @@ end_turn={ [physics] 3d/physics_engine="Jolt Physics" +2d/default_gravity=0.0 +2d/default_gravity_vector=Vector2(0, 0) [rendering] diff --git a/ball.tscn b/scenes/ball.tscn similarity index 60% rename from ball.tscn rename to scenes/ball.tscn index 0ec27d7..5aa53c1 100644 --- a/ball.tscn +++ b/scenes/ball.tscn @@ -3,8 +3,14 @@ [ext_resource type="Script" uid="uid://3c5arbqbgr2l" path="res://scripts/ball.gd" id="1_x8fbi"] [ext_resource type="Texture2D" uid="uid://vfxgx3oc6nm1" path="res://assets/ball/ball-kenney-accurate.png" id="2_41u45"] -[node name="Ball" type="Node2D" unique_id=1245529605] +[sub_resource type="CircleShape2D" id="CircleShape2D_cxlvu"] +radius = 13.0 + +[node name="Ball" type="RigidBody2D" unique_id=1681382008] script = ExtResource("1_x8fbi") [node name="BallSprite" type="Sprite2D" parent="." unique_id=982207895] texture = ExtResource("2_41u45") + +[node name="BallShape" type="CollisionShape2D" parent="." unique_id=754296158] +shape = SubResource("CircleShape2D_cxlvu") diff --git a/court.tscn b/scenes/court.tscn similarity index 97% rename from court.tscn rename to scenes/court.tscn index e645d55..df5b6f3 100644 --- a/court.tscn +++ b/scenes/court.tscn @@ -29,6 +29,7 @@ centered = false navigation_polygon = SubResource("NavigationPolygon_klx28") [node name="KeyArea" type="Area2D" parent="." unique_id=538903225] +unique_name_in_owner = true position = Vector2(755, 292) [node name="CollisionShape2D" type="CollisionShape2D" parent="KeyArea" unique_id=1398173864] @@ -36,6 +37,7 @@ shape = SubResource("RectangleShape2D_ih5bv") debug_color = Color(1, 1, 0, 0.41960785) [node name="TwoPointArea" type="Area2D" parent="." unique_id=1591376341] +unique_name_in_owner = true position = Vector2(760, 162.5) [node name="TwoPointArc" type="CollisionShape2D" parent="TwoPointArea" unique_id=704197509] diff --git a/game.tscn b/scenes/game.tscn similarity index 95% rename from game.tscn rename to scenes/game.tscn index 282dfb6..6e386a6 100644 --- a/game.tscn +++ b/scenes/game.tscn @@ -1,11 +1,11 @@ [gd_scene format=3 uid="uid://bhn3vm462n1rv"] [ext_resource type="Script" uid="uid://0xvlu81d8a01" path="res://scripts/game_manager.gd" id="1_7jktm"] -[ext_resource type="PackedScene" uid="uid://cxbu51aedxg3c" path="res://court.tscn" id="1_e2o6t"] -[ext_resource type="PackedScene" uid="uid://i0ijmmchb3s1" path="res://hoop.tscn" id="4_215e1"] +[ext_resource type="PackedScene" uid="uid://cxbu51aedxg3c" path="res://scenes/court.tscn" id="1_e2o6t"] +[ext_resource type="PackedScene" uid="uid://i0ijmmchb3s1" path="res://scenes/hoop.tscn" id="4_215e1"] [ext_resource type="PackedScene" uid="uid://b7js4xq85ajf7" path="res://teams/orange_team.tscn" id="6_eow3j"] [ext_resource type="PackedScene" uid="uid://dndfw477wwjog" path="res://teams/blue_team.tscn" id="6_j5wjh"] -[ext_resource type="PackedScene" uid="uid://cbqaj6trvqat0" path="res://ball.tscn" id="6_ryrav"] +[ext_resource type="PackedScene" uid="uid://cbqaj6trvqat0" path="res://scenes/ball.tscn" id="6_ryrav"] [node name="Game" type="Node2D" unique_id=980666470 node_paths=PackedStringArray("ball", "court", "home_team", "away_team")] script = ExtResource("1_7jktm") diff --git a/hoop.tscn b/scenes/hoop.tscn similarity index 100% rename from hoop.tscn rename to scenes/hoop.tscn diff --git a/player.tscn b/scenes/player.tscn similarity index 84% rename from player.tscn rename to scenes/player.tscn index 97fb907..a2d164e 100644 --- a/player.tscn +++ b/scenes/player.tscn @@ -2,12 +2,15 @@ [ext_resource type="Script" uid="uid://bs8r5rqnt33rf" path="res://scripts/player.gd" id="1_onrkg"] [ext_resource type="Texture2D" uid="uid://ctakygdw82fs2" path="res://assets/players/top-down/orange-45.png" id="2_onrkg"] -[ext_resource type="PackedScene" uid="uid://nbb3fdh08hbk" path="res://player_label.tscn" id="3_i3pqv"] +[ext_resource type="PackedScene" uid="uid://nbb3fdh08hbk" path="res://scenes/ui/player_label.tscn" id="3_i3pqv"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_i3pqv"] radius = 11.0 height = 46.0 +[sub_resource type="CircleShape2D" id="CircleShape2D_qhqgy"] +radius = 75.0 + [sub_resource type="Gradient" id="Gradient_i3pqv"] offsets = PackedFloat32Array(0, 0.74882627) colors = PackedColorArray(1, 1, 1, 0.5019608, 0, 0, 0, 0) @@ -17,8 +20,6 @@ gradient = SubResource("Gradient_i3pqv") fill = 1 fill_from = Vector2(0.5, 0.5) -[sub_resource type="Shortcut" id="Shortcut_hqtel"] - [node name="Player" type="CharacterBody2D" unique_id=1353719775] motion_mode = 1 script = ExtResource("1_onrkg") @@ -32,6 +33,11 @@ position = Vector2(1, 0) shape = SubResource("CapsuleShape2D_i3pqv") debug_color = Color(0.23987567, 0.6988715, 0.40862384, 0.41960785) +[node name="PlayerReachArea" type="Area2D" parent="." unique_id=1000158753] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerReachArea" unique_id=1228042585] +shape = SubResource("CircleShape2D_qhqgy") + [node name="PlayerCamera" type="Camera2D" parent="." unique_id=1839930911] zoom = Vector2(1.5, 1.5) editor_draw_screen = false @@ -42,7 +48,7 @@ radius = 25.0 max_speed = 100000.0 debug_enabled = true -[node name="NavTarget" type="Sprite2D" parent="." unique_id=1224616450] +[node name="NavTargetSprite" type="Sprite2D" parent="." unique_id=1224616450] z_index = 10 texture = SubResource("GradientTexture2D_hqtel") @@ -53,6 +59,7 @@ offset_right = -60.0 offset_bottom = 30.0 [node name="PlayerUI" type="CanvasLayer" parent="." unique_id=742234296] +visible = false [node name="CenterContainer" type="CenterContainer" parent="PlayerUI" unique_id=964838525] anchors_preset = 15 @@ -71,5 +78,4 @@ layout_mode = 2 [node name="EndTurnButton" type="Button" parent="PlayerUI/CenterContainer/VBoxContainer" unique_id=1003182030] unique_name_in_owner = true layout_mode = 2 -shortcut = SubResource("Shortcut_hqtel") text = "End Turn (E)" diff --git a/team.tscn b/scenes/team.tscn similarity index 100% rename from team.tscn rename to scenes/team.tscn diff --git a/player_label.tscn b/scenes/ui/player_label.tscn similarity index 100% rename from player_label.tscn rename to scenes/ui/player_label.tscn diff --git a/scripts/ball.gd b/scripts/ball.gd index 75bbfa7..6283cc1 100644 --- a/scripts/ball.gd +++ b/scripts/ball.gd @@ -1,3 +1,3 @@ @icon("res://assets/icons/ball.svg") class_name Ball -extends Node2D +extends RigidBody2D diff --git a/scripts/court.gd b/scripts/court.gd index 093df10..23f7c03 100644 --- a/scripts/court.gd +++ b/scripts/court.gd @@ -1,3 +1,28 @@ @icon("res://assets/icons/court.svg") class_name Court extends Node2D + +@onready var key_area: Area2D = %KeyArea +@onready var two_point_area: Area2D = %TwoPointArea + +func _ready() -> void: + key_area.connect("body_entered", on_key_area_entered) + two_point_area.connect("body_entered", on_two_point_area_entered) + key_area.connect("body_exited", on_key_area_exited) + two_point_area.connect("body_exited", on_two_point_area_exited) + +func on_key_area_entered(body: PhysicsBody2D) -> void: + if body is Player: + print_debug(str(body.attributes.player_name) + " has entered the key") + +func on_two_point_area_entered(body: PhysicsBody2D) -> void: + if body is Player: + print_debug(str(body.attributes.player_name) + " has entered the two-point area") + +func on_key_area_exited(body: PhysicsBody2D) -> void: + if body is Player: + print_debug(str(body.attributes.player_name) + " has exited the key") + +func on_two_point_area_exited(body: PhysicsBody2D) -> void: + if body is Player: + print_debug(str(body.attributes.player_name) + " has exited the two-point area") diff --git a/scripts/custom resources/player_attributes.gd b/scripts/custom resources/player_attributes.gd index 34d5438..66cdef5 100644 --- a/scripts/custom resources/player_attributes.gd +++ b/scripts/custom resources/player_attributes.gd @@ -7,6 +7,7 @@ extends Resource @export var player_name: String @export_range(0.0, 99.0, 1.0, "prefer_slider") var player_number: int @export var player_position: Globals.PlayerPosition +@export_range(150.0, 250.0, 1.0, "prefer_slider") var player_height: float ## Player height in centimetres; determines reach. @export_group("Abilities") @export var speed: float @export var reflexes: float diff --git a/scripts/game_manager.gd b/scripts/game_manager.gd index 90ef9ff..0e913a7 100644 --- a/scripts/game_manager.gd +++ b/scripts/game_manager.gd @@ -15,13 +15,10 @@ func _ready() -> void: players = get_tree().get_nodes_in_group("players") for player in players: player.connect("turn_finished", on_player_turn_finished) + player.is_active = false active_player = players[0] as Player -#func _input(event: InputEvent) -> void: - #if event.is_action_pressed("") - - ## Signal-handlers func on_player_turn_finished() -> void: print_debug("Moving to the next player in the turn order") diff --git a/scripts/player.gd b/scripts/player.gd index 1e6ec48..4599eef 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -1,5 +1,4 @@ @icon("res://assets/icons/player.svg") -#@tool class_name Player extends CharacterBody2D @@ -10,7 +9,7 @@ signal turn_finished @export var attributes: PlayerAttributes ## The attributes resource that defines the player's abilities, vitals etc. ## regular variables -var is_active: bool: set = set_active +var is_active: bool = false: set = set_active var player_label_offset: Vector2 ## 'onready' variables @@ -18,38 +17,35 @@ var player_label_offset: Vector2 @onready var player_camera: Camera2D = $PlayerCamera @onready var player_label: PlayerLabel = $PlayerLabel @onready var player_nav: NavigationAgent2D = $PlayerNav -@onready var nav_target: Sprite2D = $NavTarget +@onready var player_reach_area: Area2D = $PlayerReachArea +@onready var nav_target_sprite: Sprite2D = $NavTargetSprite @onready var player_sprite: Sprite2D = $PlayerSprite @onready var player_ui: CanvasLayer = $PlayerUI -@onready var end_turn_button: Button = %EndTurnButton +#@onready var end_turn_button: Button = %EndTurnButton +## Overrides func _ready() -> void: - ## signals - end_turn_button.connect("button_down", end_turn) - player_nav.connect("velocity_computed", on_velocity_computed) - - is_active = false + _connect_signals() + #set_player_attributes(attributes) if attributes: - player_label.player_name = attributes.player_name - player_label.player_number = attributes.player_number - player_label.player_position = attributes.player_position - player_sprite.texture = attributes.player_texture - + _set_player_label_values(attributes) + _set_player_sprite(attributes.player_texture) + player_label_offset = player_label.position func _process(_delta: float) -> void: - player_label.global_position = global_position + player_label_offset + _set_player_label_position() if is_active: - nav_target.global_position = get_global_mouse_position() + _set_nav_sprite_position() -func _physics_process(delta: float) -> void: - var desired_velocity: Vector2 = global_position.direction_to(player_nav.get_next_path_position()) * attributes.speed ## TODO: this doesn't seem to affect actual movement speed - player_nav.velocity = desired_velocity - #if player_nav.target_position: - #player_nav.velocity = global_position.direction_to(player_nav.get_next_path_position()) - ##var movement_direction = - ##translate(movement_direction) +func _physics_process(_delta: float) -> void: + _set_desired_velocity() + if get_last_slide_collision(): + var collision = get_last_slide_collision() + var collider = collision.get_collider() + if collider is Ball: + collider.apply_central_impulse(collision.get_normal() * -2.0) func _input(event: InputEvent) -> void: if event.is_action_pressed("end_turn"): @@ -60,33 +56,66 @@ func _input(event: InputEvent) -> void: player_nav.target_position = click_position_global var target_distance = player_nav.distance_to_target() print_debug("That's %s pixels/cm away" % target_distance) - look_at(player_nav.target_position) - ## Setters func set_active(active: bool) -> void: is_active = active if is_active: print_debug("%s says: 'My turn!'" % attributes.player_name) - player_ui.visible = true player_camera.enabled = true player_camera.make_current() - nav_target.visible = true + nav_target_sprite.visible = true set_process_input(true) else: print_debug("%s says: 'It's not my turn'" % attributes.player_name) - player_ui.visible = false player_camera.enabled = false - nav_target.visible = false + nav_target_sprite.visible = false set_process_input(false) -## Helper functions/signal handlers - +## Actions func end_turn() -> void: print_debug("%s says: I'd like my turn to end." % attributes.player_name) is_active = false turn_finished.emit() + +## Helper functions +func _connect_signals() -> void: + player_nav.connect("velocity_computed", on_velocity_computed) + player_reach_area.connect("body_entered", on_player_reach_area_body_entered) + player_reach_area.connect("body_exited", on_player_reach_area_body_exited) + +func _set_desired_velocity() -> void: + var desired_velocity: Vector2 = global_position.direction_to(player_nav.get_next_path_position()) * attributes.speed + player_nav.velocity = desired_velocity + +func _set_player_label_position() -> void: + player_label.global_position = global_position + player_label_offset + +func _set_nav_sprite_position() -> void: + nav_target_sprite.global_position = get_global_mouse_position() + +func _set_player_label_values(attributes_resource: PlayerAttributes) -> void: + player_label.player_name = attributes_resource.player_name + player_label.player_number = attributes_resource.player_number + player_label.player_position = attributes_resource.player_position + +func _set_player_sprite(texture: Texture2D) -> void: + player_sprite.texture = texture + +## Signal handlers +func on_player_reach_area_body_entered(body: PhysicsBody2D) -> void: + if body is Player: + print_debug((body.attributes.player_name) + " has entered %s's reach area" % attributes.player_name) + elif body is Ball: + print_debug("The ball has entered %s's reach area" % attributes.player_name) + +func on_player_reach_area_body_exited(body: PhysicsBody2D) -> void: + if body is Player: + print_debug((body.attributes.player_name) + " has exited %s's reach area" % attributes.player_name) + elif body is Ball: + print_debug("The ball has exited %s's reach area" % attributes.player_name) func on_velocity_computed(safe_velocity: Vector2) -> void: + look_at(player_nav.get_next_path_position()) velocity = safe_velocity move_and_slide() diff --git a/scripts/team.gd b/scripts/team.gd index 91a4cd6..3655174 100644 --- a/scripts/team.gd +++ b/scripts/team.gd @@ -3,3 +3,4 @@ class_name Team extends Node2D @export var attributes: TeamAttributes +@export var players: Array[Player] diff --git a/teams/blue_team.tscn b/teams/blue_team.tscn index c7b2a71..5d53dd8 100644 --- a/teams/blue_team.tscn +++ b/teams/blue_team.tscn @@ -1,8 +1,8 @@ [gd_scene format=3 uid="uid://dndfw477wwjog"] -[ext_resource type="PackedScene" uid="uid://cfq463kejcp2m" path="res://team.tscn" id="1_7xvty"] +[ext_resource type="PackedScene" uid="uid://cfq463kejcp2m" path="res://scenes/team.tscn" id="1_7xvty"] [ext_resource type="Script" uid="uid://c7dxj0ifl687s" path="res://scripts/custom resources/team_attributes.gd" id="2_rosww"] -[ext_resource type="PackedScene" uid="uid://boqs7k6ia532h" path="res://player.tscn" id="3_8v3ba"] +[ext_resource type="PackedScene" uid="uid://boqs7k6ia532h" path="res://scenes/player.tscn" id="3_8v3ba"] [ext_resource type="Texture2D" uid="uid://btwb84mew7whb" path="res://assets/players/top-down/blue-45.png" id="4_21h5f"] [ext_resource type="Script" uid="uid://bbey5ttwv5utd" path="res://scripts/custom resources/player_attributes.gd" id="5_bwj7y"] [ext_resource type="Texture2D" uid="uid://cf8i6dbhws3ig" path="res://assets/players/top-down/blue-50.png" id="6_21h5f"] diff --git a/teams/orange_team.tscn b/teams/orange_team.tscn index cbb4ec7..6b36fe6 100644 --- a/teams/orange_team.tscn +++ b/teams/orange_team.tscn @@ -1,8 +1,8 @@ [gd_scene format=3 uid="uid://b7js4xq85ajf7"] -[ext_resource type="PackedScene" uid="uid://cfq463kejcp2m" path="res://team.tscn" id="1_m0gtt"] +[ext_resource type="PackedScene" uid="uid://cfq463kejcp2m" path="res://scenes/team.tscn" id="1_m0gtt"] [ext_resource type="Script" uid="uid://c7dxj0ifl687s" path="res://scripts/custom resources/team_attributes.gd" id="2_qxtr2"] -[ext_resource type="PackedScene" uid="uid://boqs7k6ia532h" path="res://player.tscn" id="3_oxqyn"] +[ext_resource type="PackedScene" uid="uid://boqs7k6ia532h" path="res://scenes/player.tscn" id="3_oxqyn"] [ext_resource type="Texture2D" uid="uid://ctakygdw82fs2" path="res://assets/players/top-down/orange-45.png" id="4_dbbjc"] [ext_resource type="Script" uid="uid://bbey5ttwv5utd" path="res://scripts/custom resources/player_attributes.gd" id="5_ssmnd"] [ext_resource type="Texture2D" uid="uid://nwm6exs2vod6" path="res://assets/players/top-down/orange-50.png" id="6_dbbjc"] @@ -50,9 +50,6 @@ attributes = SubResource("Resource_hms1j") position = Vector2(6284.951, 0) attributes = SubResource("Resource_jsul0") -[node name="PlayerNav" parent="Orange1" index="3" unique_id=1205813043] -debug_use_custom = true - [node name="Orange2" parent="." index="1" unique_id=1623179654 instance=ExtResource("3_oxqyn")] position = Vector2(3503.8748, 0) attributes = SubResource("Resource_ufsyq") @@ -60,5 +57,3 @@ attributes = SubResource("Resource_ufsyq") [node name="Orange3" parent="." index="2" unique_id=964363928 instance=ExtResource("3_oxqyn")] position = Vector2(4278.757, 0) attributes = SubResource("Resource_nbn31") - -[editable path="Orange1"]