fuzzyworld

godot-shooter / commit

Added radar support.

f6120dbab939cda024e36a558a70b2ba109a062b · Pavel Safronov · 2023-11-08 15:18:17 -0800 · parents db2a699d68ad

Added radar support.
 Enemy.gd    |  5 ++---
 Player.gd   | 31 ++++++++++++++++++++++++++++---
 Player.tscn | 15 ++++++++++++---
 Utils.gd    | 10 ++++++++++
 World.gd    |  5 +++--
 5 files changed, 55 insertions(+), 11 deletions(-)

diff --git a/Enemy.gd b/Enemy.gd
index 69f9fc4..84b1d9c 100644
--- a/Enemy.gd
+++ b/Enemy.gd
@@ -45,7 +45,7 @@ func _physics_process(_delta: float) -> void:
 	var ray_length = ray_cast_2d.cast_to.length()
 	if ray_cast_2d.is_colliding():
 		var players = get_tree().get_nodes_in_group("player")
-		var player: Player = players[0]
+		var player = players[0]
 		var dist_to_player = global_position.distance_to(player.global_position)
 		if ray_cast_2d.get_collider() == player and dist_to_player < (ray_length + 5):
 			player.hurt(2)
@@ -98,7 +98,7 @@ func remove_thyself():
 
 func _on_Area2D_body_entered(body: Node) -> void:
 	var players = get_tree().get_nodes_in_group("player")
-	var player: Player = players[0]
+	var player = players[0]
 	var is_player = body == player
 	if is_player:
 		player.hurt(2)
@@ -106,4 +106,3 @@ func _on_Area2D_body_entered(body: Node) -> void:
 		explosion.transform = transform
 		get_parent().add_child(explosion)
 		kill()
-
diff --git a/Player.gd b/Player.gd
index 9018241..44db529 100644
--- a/Player.gd
+++ b/Player.gd
@@ -10,9 +10,14 @@ export var is_invincible = false
 export var turn_rate = 0.03
 export var shooting_range = 500
 export var shield_active = true
+export var radar_min_radius = 300
+export var radar_max_radius = 2000
 #export var shield_restart_period_seconds = 5
 
-var PopupControl = preload("res://Popup.tscn")
+onready var radar_sprite = $Graphics/Alive/StaticControls/RadarSprite
+onready var radar_container = $Graphics/Alive/StaticControls/Radar
+const Utils = preload("res://Utils.gd")
+const PopupControl = preload("res://Popup.tscn")
 
 var dead = false
 var velocity = Vector2.UP * move_speed
@@ -29,8 +34,8 @@ func _ready() -> void:
 func _process(_delta: float) -> void:
 	if dead:
 		return
-	$Graphics/Alive/Control/HealthLabel.text = "%s / %s" % [health, max_health]
-	$Graphics/Alive/Control.global_rotation = 0
+	$Graphics/Alive/StaticControls/HealthLabel.text = "%s / %s" % [health, max_health]
+	$Graphics/Alive/StaticControls.global_rotation = 0
 	$Graphics/Alive/Trails.add_position(global_position)
 	$ShieldCollisionShape.disabled = !shield_active
 	$ShipCollisionShape.disabled = shield_active
@@ -41,6 +46,26 @@ func _physics_process(_delta: float) -> void:
 	velocity = move_and_slide(velocity)
 	global_rotation = velocity.angle() + PI/2.0
 
+func update_radar(enemies: Array):
+	radar_sprite.modulate = Color(1,1,1,0)
+	# remove all existing radar items
+	var children = radar_container.get_children()
+	for child in children:
+		radar_container.remove_child(child)
+
+	for e in enemies:
+		var enemy: Enemy = e
+		var diff = enemy.global_position - global_position
+		var dist = diff.length()
+		var ratio = Utils.dist_to_ratio(dist, radar_min_radius, radar_max_radius)
+		if dist < radar_min_radius:
+			ratio = 0
+		var angle_to = Vector2.UP.angle_to(diff)
+		var item: Sprite = radar_sprite.duplicate()
+		item.rotate(angle_to)
+		item.modulate = Color(1,0,0,ratio * .5)
+		radar_container.add_child(item)
+
 func restart():
 	var _error = get_tree().reload_current_scene()
 
diff --git a/Player.tscn b/Player.tscn
index 9fff587..61077c7 100644
--- a/Player.tscn
+++ b/Player.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=16 format=2]
+[gd_scene load_steps=17 format=2]
 
 [ext_resource path="res://assets/kenney_simple-space/PNG/Default/ship_sidesA.png" type="Texture" id=1]
 [ext_resource path="res://Explosion.tscn" type="PackedScene" id=2]
@@ -7,6 +7,7 @@
 [ext_resource path="res://CharacterTheme.tres" type="Theme" id=5]
 [ext_resource path="res://Trails.tscn" type="PackedScene" id=6]
 [ext_resource path="res://assets/kenney_crosshair-pack/PNG/White Retina/crosshair120.png" type="Texture" id=7]
+[ext_resource path="res://assets/kenney_simple-space/PNG/Retina/ship_A.png" type="Texture" id=8]
 
 [sub_resource type="CircleShape2D" id=7]
 radius = 36.0
@@ -182,9 +183,9 @@ gradient = SubResource( 2 )
 modulate = Color( 0, 1, 0, 1 )
 texture = ExtResource( 1 )
 
-[node name="Control" type="Node2D" parent="Graphics/Alive"]
+[node name="StaticControls" type="Node2D" parent="Graphics/Alive"]
 
-[node name="HealthLabel" type="Label" parent="Graphics/Alive/Control"]
+[node name="HealthLabel" type="Label" parent="Graphics/Alive/StaticControls"]
 margin_left = -48.0051
 margin_top = 30.992
 margin_right = 48.9949
@@ -194,6 +195,14 @@ text = "HEALTH"
 align = 1
 uppercase = true
 
+[node name="RadarSprite" type="Sprite" parent="Graphics/Alive/StaticControls"]
+modulate = Color( 1, 0, 0, 0.517647 )
+scale = Vector2( 0.4, 0.4 )
+texture = ExtResource( 8 )
+offset = Vector2( 0, -300 )
+
+[node name="Radar" type="Node2D" parent="Graphics/Alive/StaticControls"]
+
 [node name="Trails" parent="Graphics/Alive" instance=ExtResource( 6 )]
 modulate = Color( 1, 0, 0, 1 )
 gradient = SubResource( 1 )
diff --git a/Utils.gd b/Utils.gd
index 253ddea..9ffae69 100644
--- a/Utils.gd
+++ b/Utils.gd
@@ -33,3 +33,13 @@ static func get_stack_string() -> String:
 		index += 1
 	return result
 	
+# Takes a distance and returns a 0-1 ratio based on:
+# dist < min_dist => 1
+# min_dist < dist < max_dist => 0-1, according to a particular curve
+# dist > max_dist => 0
+static func dist_to_ratio(dist: float, min_dist: float, max_dist: float) -> float:
+	var t = clamp((dist - min_dist) / (max_dist - min_dist), 0.0, 1.0)
+	var linear_curve = 1.0 - t
+#	var exponential_decay_curve = 1.0 - exp(-t * 5.0)
+#	var inverse_exponential_curve = 1.0 - (1.0 - exp(-t * 5.0))
+	return linear_curve
diff --git a/World.gd b/World.gd
index d3403c3..a6707ae 100644
--- a/World.gd
+++ b/World.gd
@@ -9,13 +9,13 @@ var height = ProjectSettings.get("display/window/size/height")
 var destination: Vector2
 var is_destination_set = false
 var generators = [
-	LevelItemGenerator.new(4, "create_enemy", self, "enemies", 2),
+	LevelItemGenerator.new(5, "create_enemy", self, "enemies", 2),
 	LevelItemGenerator.new(10, "create_health", self, "health", 10),
 	LevelItemGenerator.new(3, "create_shield", self, "shields", 3),
 	LevelItemGenerator.new(5, "create_gold", self, "gold", 5),
 ]
 var completed_objectives = 0
-var max_objectives = 4
+var max_objectives = 5
 
 func enemy_killed(_position: Vector2):
 	$UI/HUD.score += 1
@@ -112,6 +112,7 @@ func _process(_delta: float) -> void:
 	for e in filteredEnemies:
 		var enemy: Enemy = e
 		enemy.turn_towards($Player.position)
+	$Player.update_radar(filteredEnemies)
 
 func pause():
 	get_tree().paused = true