diff --git a/assets/gauge.png b/assets/gauge.png new file mode 100644 index 0000000..995799e Binary files /dev/null and b/assets/gauge.png differ diff --git a/assets/gauge.png.import b/assets/gauge.png.import new file mode 100644 index 0000000..e2687a1 --- /dev/null +++ b/assets/gauge.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/gauge.png-9154e7a04792a5507193a3fa8e514e90.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gauge.png" +dest_files=[ "res://.import/gauge.png-9154e7a04792a5507193a3fa8e514e90.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/assets/needle.png b/assets/needle.png new file mode 100644 index 0000000..6fd666c Binary files /dev/null and b/assets/needle.png differ diff --git a/assets/needle.png.import b/assets/needle.png.import new file mode 100644 index 0000000..28b9b97 --- /dev/null +++ b/assets/needle.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/needle.png-0f8fd3822e6cc0a1cd19175fda72da7b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/needle.png" +dest_files=[ "res://.import/needle.png-0f8fd3822e6cc0a1cd19175fda72da7b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/player/gui.gd b/player/gui.gd new file mode 100644 index 0000000..59c5c71 --- /dev/null +++ b/player/gui.gd @@ -0,0 +1,26 @@ +extends MarginContainer + + +onready var rpm_needle = $HBoxContainer/RPMGauge/RPMNeedle +onready var speed_needle = $HBoxContainer/SpeedGauge/SpeedNeedle +onready var gear_label = $HBoxContainer/GearLabel + +var min_rotation = -85 +var max_rotation = 75 + +func _get_rotation(percent: float) -> float: + return min_rotation + (max_rotation - min_rotation) * percent + +func update_speed(speed_percent: float) -> void: + speed_needle.rect_rotation = _get_rotation(speed_percent) + +func update_rpm(rpm_percent: float) -> void: + rpm_needle.rect_rotation = _get_rotation(rpm_percent) + +func update_gear(gear: int) -> void: + if gear == -1: + gear_label.text = "R" + elif gear == 0: + gear_label.text = "N" + else: + gear_label.text = str(gear) diff --git a/player/gui.tscn b/player/gui.tscn new file mode 100644 index 0000000..f40ef24 --- /dev/null +++ b/player/gui.tscn @@ -0,0 +1,82 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://assets/gauge.png" type="Texture" id=1] +[ext_resource path="res://assets/needle.png" type="Texture" id=2] +[ext_resource path="res://player/gui.gd" type="Script" id=3] +[ext_resource path="res://assets/fonts/kenney-future-narrow.ttf" type="DynamicFontData" id=4] + +[sub_resource type="CanvasItemMaterial" id=3] + +[sub_resource type="DynamicFont" id=1] +size = 48 +font_data = ExtResource( 4 ) + +[node name="GUIContainer" type="MarginContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 20.0 +margin_top = 20.0 +margin_right = -20.0 +margin_bottom = -20.0 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +material = SubResource( 3 ) +margin_top = 432.0 +margin_right = 318.0 +margin_bottom = 560.0 +size_flags_horizontal = 0 +size_flags_vertical = 8 +custom_constants/separation = 20 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RPMGauge" type="TextureRect" parent="HBoxContainer"] +margin_right = 128.0 +margin_bottom = 128.0 +texture = ExtResource( 1 ) + +[node name="RPMNeedle" type="TextureRect" parent="HBoxContainer/RPMGauge"] +margin_left = 54.0 +margin_top = 11.0 +margin_right = 72.0 +margin_bottom = 66.0 +rect_pivot_offset = Vector2( 9, 50 ) +size_flags_horizontal = 5 +size_flags_vertical = 5 +texture = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SpeedGauge" type="TextureRect" parent="HBoxContainer"] +margin_left = 148.0 +margin_right = 276.0 +margin_bottom = 128.0 +texture = ExtResource( 1 ) + +[node name="SpeedNeedle" type="TextureRect" parent="HBoxContainer/SpeedGauge"] +margin_left = 54.0 +margin_top = 11.0 +margin_right = 72.0 +margin_bottom = 66.0 +rect_pivot_offset = Vector2( 9, 50 ) +size_flags_horizontal = 5 +size_flags_vertical = 5 +texture = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="GearLabel" type="Label" parent="HBoxContainer"] +margin_left = 296.0 +margin_top = 37.0 +margin_right = 318.0 +margin_bottom = 91.0 +custom_colors/font_color = Color( 0.282353, 0.0196078, 0.0196078, 1 ) +custom_fonts/font = SubResource( 1 ) +text = "1" diff --git a/scenes/menu/start_menu.gd b/scenes/menu/start_menu.gd index 5cebbe4..0722ce9 100644 --- a/scenes/menu/start_menu.gd +++ b/scenes/menu/start_menu.gd @@ -3,6 +3,7 @@ extends Panel const buggy = preload("res://vehicles/buggy.tscn") const beetle = preload("res://vehicles/beetlecar.tscn") const test_scene = preload("res://scenes/test_level.tscn") +const gui_scene = preload("res://player/gui.tscn") func _on_BuggyButton_pressed() -> void: _start_with_vehicle(buggy.instance()) @@ -11,8 +12,12 @@ func _on_BeetleButton_pressed() -> void: _start_with_vehicle(beetle.instance()) func _start_with_vehicle(vehicle: Node) -> void: + var gui = gui_scene.instance() var scene = test_scene.instance() - scene.call_deferred("spawn_player", vehicle) + vehicle.connect("speed_updated", gui, "update_speed") + vehicle.connect("rpm_updated", gui, "update_rpm") + vehicle.connect("gear_updated", gui, "update_gear") + scene.call_deferred("spawn_player", vehicle, gui) get_tree().root.call_deferred("add_child", scene) queue_free() diff --git a/scenes/test_level.gd b/scenes/test_level.gd index 46817de..bdae7c8 100644 --- a/scenes/test_level.gd +++ b/scenes/test_level.gd @@ -3,13 +3,16 @@ extends Spatial const camera = preload("res://player/camera.tscn") onready var spawn_point = $PlayerSpawnLocation var player_node: Node +var gui: Node func _ready() -> void: player_node.global_transform = spawn_point.global_transform add_child(player_node) + add_child(gui) var player_camera = camera.instance() player_camera.follow_target_path = player_node.get_path() add_child(player_camera) -func spawn_player(player_node: Node) -> void: +func spawn_player(player_node: Node, gui: Node) -> void: self.player_node = player_node + self.gui = gui diff --git a/vehicles/beetlecar.tscn b/vehicles/beetlecar.tscn index e26775a..57f976f 100644 --- a/vehicles/beetlecar.tscn +++ b/vehicles/beetlecar.tscn @@ -44,6 +44,7 @@ rings = 3 [node name="beetlecar" instance=ExtResource( 2 )] mass = 140.0 script = ExtResource( 1 ) +EXPECTED_MAX_SPEED = 180.0 gear_ratios = [ 2.95, 2.2, 1.76, 1.43, 1.25, 1.0 ] final_drive = 5.0 max_rpm = 8000.0 diff --git a/vehicles/buggy.gd b/vehicles/buggy.gd index 8664146..de27a4b 100644 --- a/vehicles/buggy.gd +++ b/vehicles/buggy.gd @@ -1,5 +1,9 @@ extends VehicleBody +signal speed_updated(speed_percent) +signal rpm_updated(rpm_percent) +signal gear_updated(gear) + export (float) var MAX_STEER_ANGLE = 25 export (float) var SPEED_STEER_ANGLE = 10 export (float) var MAX_STEER_SPEED = 100.0 @@ -15,6 +19,7 @@ export (float) var MAX_BRAKE_FORCE = 50.0 export (float) var THROTTLE_POWER = 6000.0 export (float) var MAX_RPM_LOSS_PS = 3000.0 export (float) var BASE_ENGINE_PITCH = 0.5 +export (float) var EXPECTED_MAX_SPEED = 200 export (Array) var gear_ratios = [ 3.4, 2.5, 2.0, 1.5, 1.25 ] export (float) var reverse_ratio = -3 @@ -69,10 +74,12 @@ func _handle_gear_switch(delta: float): if gear + 1 <= gear_ratios.size(): gear += 1 gear_timer = gear_switch_time * (2 - clutch_position) + emit_signal("gear_updated", gear) if Input.is_action_just_pressed("gear_down"): if gear - 1 >= -1: gear -= 1 gear_timer = gear_switch_time * (2 - clutch_position) + emit_signal("gear_updated", gear) func _has_traction(): for wheel in traction_wheels: @@ -132,6 +139,8 @@ func _physics_process(delta: float): rlwheel.brake = handbrake * MAX_BRAKE_FORCE / 2 var speed = wheel_rpm * 2.0 * PI * rrwheel.wheel_radius / 60.0 * 3600.0 / 1000.0 + emit_signal("speed_updated", speed / EXPECTED_MAX_SPEED) + emit_signal("rpm_updated", rpm_factor) $Info.text = "Gear: %d, KPH: %.0f, RPM: %.0f, WheelRPM: %.0f, FinalRPM: %.0f, TRPM: %.0f, Engine force: %.0f" % [ gear, speed, rpm, wheel_rpm, final_rpm, transmission_rpm, engine_force ] var steering_input = Input.get_action_strength("steer_left") - Input.get_action_strength("steer_right")