From 9ed5afa0929bd5472a792122545cab28a25aefae Mon Sep 17 00:00:00 2001 From: Josh Creek <8179928+jcreek@users.noreply.github.com> Date: Sun, 13 Jul 2025 21:14:51 +0100 Subject: [PATCH] feat(*): Add basic flight data to HUD --- Game/objects/ship.tscn | 46 +++++++++++++++++++++++++++++++++++ Game/scripts/ship.gd | 54 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/Game/objects/ship.tscn b/Game/objects/ship.tscn index a682156..5fcb33e 100644 --- a/Game/objects/ship.tscn +++ b/Game/objects/ship.tscn @@ -46,3 +46,49 @@ offset_bottom = 62.0 grow_horizontal = 2 label_settings = SubResource("LabelSettings_efag7") horizontal_alignment = 1 + +[node name="InfoPanel" type="VBoxContainer" parent="HUD/Control"] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 10.0 +offset_top = -200.0 +offset_right = 300.0 +offset_bottom = -10.0 +grow_vertical = 0 + +[node name="SpeedLabel" type="Label" parent="HUD/Control/InfoPanel"] +layout_mode = 2 +text = "Speed: 0.0 m/s" +label_settings = SubResource("LabelSettings_efag7") + +[node name="AltitudeLabel" type="Label" parent="HUD/Control/InfoPanel"] +layout_mode = 2 +text = "Altitude: 0.0 m" +label_settings = SubResource("LabelSettings_efag7") + +[node name="AngularVelLabel" type="Label" parent="HUD/Control/InfoPanel"] +layout_mode = 2 +text = "Angular Vel: 0.0 rad/s" +label_settings = SubResource("LabelSettings_efag7") + +[node name="CameraModeLabel" type="Label" parent="HUD/Control/InfoPanel"] +layout_mode = 2 +text = "Camera: Ball Cam" +label_settings = SubResource("LabelSettings_efag7") + +[node name="AttitudeLabel" type="Label" parent="HUD/Control/InfoPanel"] +layout_mode = 2 +text = "Pitch: 0° Roll: 0°" +label_settings = SubResource("LabelSettings_efag7") + +[node name="HeadingLabel" type="Label" parent="HUD/Control/InfoPanel"] +layout_mode = 2 +text = "Heading: 0°" +label_settings = SubResource("LabelSettings_efag7") + +[node name="ThrustLabel" type="Label" parent="HUD/Control/InfoPanel"] +layout_mode = 2 +text = "Thrust: 0%" +label_settings = SubResource("LabelSettings_efag7") diff --git a/Game/scripts/ship.gd b/Game/scripts/ship.gd index cd40210..5dba3b4 100644 --- a/Game/scripts/ship.gd +++ b/Game/scripts/ship.gd @@ -6,7 +6,7 @@ extends RigidBody3D @export var maneuvering_thrust = 75.0 # Side/vertical thruster power @export var vertical_thrust = 120.0 # Up/down thruster power @export var turbo_multiplier = 2.5 # Turbo boost multiplier -@export var max_speed = 25.0 # Maximum velocity +@export var max_speed = 35.0 # Maximum velocity @export var rotation_power = 20.0 # Angular thrust power @export var max_angular_speed = 3.0 # Maximum rotation speed @export var drag_coefficient = 0.98 # Linear drag (air resistance) @@ -19,7 +19,16 @@ var camera_smoothing = 10.0 @onready var camera : Camera3D = get_node("Camera3D") @onready var ball = get_parent().get_node("Ball") + +# HUD Nodes @onready var timer_label = get_node("HUD/Control/TimerLabel") +@onready var speed_label = get_node("HUD/Control/InfoPanel/SpeedLabel") +@onready var altitude_label = get_node("HUD/Control/InfoPanel/AltitudeLabel") +@onready var angular_vel_label = get_node("HUD/Control/InfoPanel/AngularVelLabel") +@onready var camera_mode_label = get_node("HUD/Control/InfoPanel/CameraModeLabel") +@onready var attitude_label = get_node("HUD/Control/InfoPanel/AttitudeLabel") +@onready var heading_label = get_node("HUD/Control/InfoPanel/HeadingLabel") +@onready var thrust_label = get_node("HUD/Control/InfoPanel/ThrustLabel") var ball_cam_enabled = true @@ -68,6 +77,7 @@ func _on_timer_updated(minutes: int, seconds: int): func _physics_process(delta): if camera: _update_camera(delta) + _update_hud() func _update_camera(delta): if ball_cam_enabled and ball: @@ -272,3 +282,45 @@ func apply_drag_and_limits(state: PhysicsDirectBodyState3D, rotation_input: Vect # Same concept for angular velocity # Physics: ω̂ = ω / |ω|, ω_limited = ω̂ * ω_max state.angular_velocity = state.angular_velocity.normalized() * max_angular_speed + +func _update_hud(): + # Update speed display + # Physics: |v| = √(vₓ² + vᵧ² + vᵤ²) (magnitude of velocity vector) + var current_speed = linear_velocity.length() + speed_label.text = "Speed: %.1f m/s" % current_speed + + # Update altitude (Y position relative to ground level) + # Physics: Height measurement from reference point (y = 0) + var current_altitude = global_transform.origin.y + altitude_label.text = "Altitude: %.1f m" % current_altitude + + # Update angular velocity + # Physics: |ω| = √(ωₓ² + ωᵧ² + ωᵤ²) (magnitude of angular velocity vector) + var angular_speed = angular_velocity.length() + angular_vel_label.text = "Angular Vel: %.2f rad/s" % angular_speed + + # Update camera mode + var camera_mode = "Ball Cam" if ball_cam_enabled else "Ship Cam" + camera_mode_label.text = "Camera: %s" % camera_mode + + # Calculate attitude (pitch and roll from ship orientation) + # Physics: Euler angles from rotation matrix + # Pitch = rotation around X-axis, Roll = rotation around Z-axis + var ship_rotation = global_transform.basis.get_euler(EULER_ORDER_XYZ) + var pitch_deg = rad_to_deg(ship_rotation.x) + var roll_deg = rad_to_deg(ship_rotation.z) + attitude_label.text = "Pitch: %.0f° Roll: %.0f°" % [pitch_deg, roll_deg] + + # Calculate heading (yaw - direction ship is facing) + # Physics: Yaw = rotation around Y-axis (compass heading) + # Convert to 0-360° range for traditional compass display + var yaw_deg = rad_to_deg(ship_rotation.y) + var heading = fmod(yaw_deg + 360.0, 360.0) # Normalize to 0-360° + heading_label.text = "Heading: %.0f°" % heading + + # Calculate current thrust percentage + # Physics: Thrust output as percentage of maximum available thrust + var thrust_input = get_thrust_input() + var thrust_magnitude = thrust_input.length() + var thrust_percent = thrust_magnitude * 100.0 + thrust_label.text = "Thrust: %.0f%%" % thrust_percent