cleaned up player code, file organization; implemented simple-ish physics

This commit is contained in:
Adam Burns 2026-02-14 22:17:23 -05:00
parent b525ffd024
commit 19b18532db
16 changed files with 118 additions and 54 deletions

View File

@ -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]

View File

@ -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")

View File

@ -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]

View File

@ -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")

View File

@ -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)"

View File

@ -1,3 +1,3 @@
@icon("res://assets/icons/ball.svg")
class_name Ball
extends Node2D
extends RigidBody2D

View File

@ -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")

View File

@ -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

View File

@ -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")

View File

@ -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()

View File

@ -3,3 +3,4 @@ class_name Team
extends Node2D
@export var attributes: TeamAttributes
@export var players: Array[Player]

View File

@ -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"]

View File

@ -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"]