small racing game im working on
better minimap
bendn 2023-01-29
parent 01a534f · commit 5b89514
-rw-r--r--race.gd3
-rw-r--r--race.tscn11
-rw-r--r--ui/assets/flag.pngbin210 -> 213 bytes
-rw-r--r--ui/assets/ghost.pngbin0 -> 276 bytes
-rw-r--r--ui/assets/ghost.png.import34
-rw-r--r--ui/assets/line.pngbin97 -> 94 bytes
-rw-r--r--ui/assets/player_indicator.pngbin0 -> 225 bytes
-rw-r--r--ui/assets/player_indicator.png.import34
-rw-r--r--ui/map.gd50
9 files changed, 108 insertions, 24 deletions
diff --git a/race.gd b/race.gd
index 86dd023..ff1a3db 100644
--- a/race.gd
+++ b/race.gd
@@ -18,6 +18,7 @@ const saves := "user://%s.trackdata"
signal next_lap
signal created_car(car: Car)
+signal created_ghost(ghost: GhostCar)
signal finished
func mkghost() -> void:
@@ -27,7 +28,7 @@ func mkghost() -> void:
add_child(ghost)
ghost.global_position = best_time_data.loadshot(0)[0]
ghost.global_rotation = best_time_data.loadshot(0)[1]
- print("ghost created")
+ created_ghost.emit(ghost)
func _ready() -> void:
set_physics_process(false)
diff --git a/race.tscn b/race.tscn
index 622e5ba..ed914a0 100644
--- a/race.tscn
+++ b/race.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=26 format=3 uid="uid://cech6c4yrmcvq"]
+[gd_scene load_steps=28 format=3 uid="uid://cech6c4yrmcvq"]
[ext_resource type="Script" path="res://race.gd" id="1_ckbwd"]
[ext_resource type="Environment" uid="uid://biwshm46yl62v" path="res://default_env.tres" id="2_pnp7e"]
@@ -19,6 +19,8 @@
[ext_resource type="Script" path="res://ui/intro_cam.gd" id="14_yajvg"]
[ext_resource type="Script" path="res://ui/laps.gd" id="16_mxur4"]
[ext_resource type="Texture2D" uid="uid://b3nmp7eyu0hjk" path="res://ui/assets/flag.png" id="16_rp311"]
+[ext_resource type="Texture2D" uid="uid://b6ad1yrgtg6qk" path="res://ui/assets/player_indicator.png" id="17_ptq57"]
+[ext_resource type="Texture2D" uid="uid://dkbrx7rpa8dvc" path="res://ui/assets/ghost.png" id="18_v7a53"]
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_tkhh8"]
@@ -196,7 +198,7 @@ script = ExtResource("9_dn61b")
[node name="MiniMap" type="Line2D" parent="CanvasLayer" node_paths=PackedStringArray("track")]
texture_repeat = 2
-points = PackedVector2Array(96, 29, -44, 43, 27, -54, 183, 9)
+width = 40.0
default_color = Color(0.854902, 0.854902, 0.854902, 1)
gradient = SubResource("Gradient_2kvil")
texture = ExtResource("14_n0r0n")
@@ -204,8 +206,10 @@ texture_mode = 1
antialiased = true
script = ExtResource("10_58kgt")
track = NodePath("../../Track")
-player_color = Color(1, 0.388235, 0.321569, 0.803922)
+player_color = Color(1, 0.388235, 0.321569, 1)
finish_indicator = ExtResource("16_rp311")
+player_indicator = ExtResource("17_ptq57")
+ghost_indicator = ExtResource("18_v7a53")
[node name="Splits" parent="CanvasLayer" instance=ExtResource("14_ge1w6")]
visible = false
@@ -271,5 +275,6 @@ libraries = {
[connection signal="created_car" from="." to="CanvasLayer/HBoxContainer/Panel/Speedometer" method="_on_race_created_car"]
[connection signal="created_car" from="." to="CanvasLayer/MiniMap" method="_on_race_created_car"]
[connection signal="created_car" from="." to="IntroCamera" method="_on_race_created_car"]
+[connection signal="created_ghost" from="." to="CanvasLayer/MiniMap" method="_on_race_created_ghost"]
[connection signal="next_lap" from="." to="CanvasLayer/Laps" method="increment"]
[connection signal="race_started" from="IntroCamera" to="." method="_on_intro_camera_race_started"]
diff --git a/ui/assets/flag.png b/ui/assets/flag.png
index dd3c63d..7ee681e 100644
--- a/ui/assets/flag.png
+++ b/ui/assets/flag.png
Binary files differ
diff --git a/ui/assets/ghost.png b/ui/assets/ghost.png
new file mode 100644
index 0000000..e98f5a1
--- /dev/null
+++ b/ui/assets/ghost.png
Binary files differ
diff --git a/ui/assets/ghost.png.import b/ui/assets/ghost.png.import
new file mode 100644
index 0000000..b9f6c13
--- /dev/null
+++ b/ui/assets/ghost.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkbrx7rpa8dvc"
+path="res://.godot/imported/ghost.png-610c2abac161623bca06478a79c589c4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/ghost.png"
+dest_files=["res://.godot/imported/ghost.png-610c2abac161623bca06478a79c589c4.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/ui/assets/line.png b/ui/assets/line.png
index 92fc568..05947a2 100644
--- a/ui/assets/line.png
+++ b/ui/assets/line.png
Binary files differ
diff --git a/ui/assets/player_indicator.png b/ui/assets/player_indicator.png
new file mode 100644
index 0000000..2b07070
--- /dev/null
+++ b/ui/assets/player_indicator.png
Binary files differ
diff --git a/ui/assets/player_indicator.png.import b/ui/assets/player_indicator.png.import
new file mode 100644
index 0000000..34563c5
--- /dev/null
+++ b/ui/assets/player_indicator.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b6ad1yrgtg6qk"
+path="res://.godot/imported/player_indicator.png-0f15ec53c35e919f51b0b4bca1cac4e5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/player_indicator.png"
+dest_files=["res://.godot/imported/player_indicator.png-0f15ec53c35e919f51b0b4bca1cac4e5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0
diff --git a/ui/map.gd b/ui/map.gd
index d1af9ce..cdde4f9 100644
--- a/ui/map.gd
+++ b/ui/map.gd
@@ -1,50 +1,60 @@
extends Line2D
class_name MiniMap
-var car: Node3D
+var path := Path2D.new()
@export var track: TrackLoader
@export var player_color: Color
@export var finish_indicator: Texture
+@export var player_indicator: Texture
+@export var ghost_indicator: Texture
+
+var followers: Array = [] # Array[[PathFollow2D, Node3D]]
func _ready() -> void:
- set_process(false)
clear_points()
width = track.track.track_width
if !track.track.is_loop:
end_cap_mode = LINE_CAP_ROUND
begin_cap_mode = LINE_CAP_ROUND
+ var curve := Curve2D.new()
+ curve.bake_interval = 200 # already baked
var box := Rect2()
for point_3d in track.curve.get_baked_points():
var p := flatten(point_3d)
+ curve.add_point(p)
box = box.expand(p)
add_point(p)
+ path.curve = curve
+ add_child(path)
global_position = -box.position + Vector2(50, 50)
-
+ mkfollower(track.finish, finish_indicator)
func _process(_delta: float) -> void:
- queue_redraw()
-
-func _draw() -> void:
- if !car: return
-
- draw_player()
- draw_finish()
-
-func draw_player() -> void:
- var point := flatten(track.curve.get_closest_point(car.global_position))
- draw_circle(point, (width - 2) / 2, player_color)
-
-func draw_finish() -> void:
- draw_texture(finish_indicator, flatten(track.curve.get_closest_point(track.finish.global_position)) + Vector2.UP * 14)
+ for follower in followers:
+ (follower[0] as PathFollow2D).progress = track.curve.get_closest_offset((follower[1] as Node3D).global_position)
func vec(xy: float) -> Vector2:
return Vector2(xy, xy)
+func mkfollower(node: Node3D, tex: Texture, mod := Color.WHITE, back := false):
+ var follower := PathFollow2D.new()
+ path.add_child(follower)
+ var sprite := Sprite2D.new()
+ sprite.modulate = mod
+ sprite.texture = tex
+ follower.add_child(sprite)
+ if back:
+ followers.push_front([follower, node])
+ else:
+ followers.push_back([follower, node])
+
+
func flatten(v: Vector3) -> Vector2:
return Vector2(v.x, v.z)
-func _on_race_created_car(_car) -> void:
- car = _car.ball
- set_process(true)
+func _on_race_created_car(car) -> void:
+ mkfollower(car.ball, player_indicator, player_color)
+func _on_race_created_ghost(ghost: GhostCar) -> void:
+ mkfollower(ghost, ghost_indicator, Color.WHITE, true)