godot-shooter / commit
Merge branch 'main' into 'weapons'
Enemy.gd | 5 ++--- Player.gd | 31 ++++++++++++++++++++++++++++--- Player.tscn | 13 +++++++++++-- Utils.gd | 10 ++++++++++ World.gd | 5 +++-- 5 files changed, 54 insertions(+), 10 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 b543522..7f7308c 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 weapon: Weapon = Weapons.create_basic_gun(1) var dead = false @@ -30,8 +35,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 @@ -42,6 +47,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 8286aa2..7ca3658 100644 --- a/Player.tscn +++ b/Player.tscn @@ -6,6 +6,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 @@ -180,9 +181,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 @@ -192,6 +193,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 a44bdc5..f953c79 100644 --- a/World.gd +++ b/World.gd @@ -9,14 +9,14 @@ 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), LevelItemGenerator.new(5, "create_weapon", self, "weapon", 5), ] var completed_objectives = 0 -var max_objectives = 4 +var max_objectives = 5 func enemy_killed(_position: Vector2): $UI/HUD.score += 1 @@ -120,6 +120,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