godot-shooter / commit
Fixed issue with enemies not following the player.
README.md | 7 ++++--- actors/Enemy.gd | 18 ++++++++++++------ actors/Enemy.tscn | 5 ++--- scenes/World.gd | 3 +-- scenes/World.tscn | 2 -- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 401373b..e21818c 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Tap on the screen or move the mouse to set the destination of the ship. The ship ## TODOs 1. Add shields -2. Add powerups -3. Add more enemies -4. Add shooting enemies +2. Add more enemies +3. Add shooting enemies +4. Add beam attack, [from here](https://www.youtube.com/watch?v=dg0CQ6NPDn8) +5. Add navigation logic so actors can move around without colliding with each other diff --git a/actors/Enemy.gd b/actors/Enemy.gd index cbf76fe..8dfed65 100644 --- a/actors/Enemy.gd +++ b/actors/Enemy.gd @@ -10,11 +10,13 @@ const Damage = preload("res://effects/Damage.tscn") const Constants = preload("res://utils/Constants.gd") export var move_speed = Constants.SPEED * 1.05 -export var turn_rate = 0.01 +export var turn_rate = 0.03 export var health = -1 export var max_health = 100 export var is_targeted = false export var is_invincible = false +export var target: Vector2 +export var follow_target = false signal enemy_killed(position) var velocity = Vector2.ZERO @@ -54,6 +56,13 @@ func _physics_process(_delta: float) -> void: velocity = move_and_slide(velocity) global_rotation = velocity.angle() + PI/2.0 + + if self.follow_target: + var to_dir = (target - global_position).normalized() + var curr_dir = velocity.normalized() + var dir_diff = to_dir - curr_dir + var change = dir_diff * turn_rate * move_speed + velocity = (velocity + change).normalized() * move_speed var ray_length = ray_cast_2d.cast_to.length() if ray_cast_2d.is_colliding(): @@ -68,11 +77,8 @@ func _physics_process(_delta: float) -> void: kill() func turn_towards(pos: Vector2): - var to_dir = (pos - global_position).normalized() - var curr_dir = velocity.normalized() - var dir_diff = to_dir - curr_dir - var change = dir_diff * turn_rate * move_speed - velocity = (velocity + change).normalized() * move_speed + self.target = pos + self.follow_target = true func _ensure_smoke_exists() -> void: var max_smoke_count = $DamagePoints.get_child_count() diff --git a/actors/Enemy.tscn b/actors/Enemy.tscn index f887843..6246ee2 100644 --- a/actors/Enemy.tscn +++ b/actors/Enemy.tscn @@ -19,7 +19,6 @@ length = 3.0 [sub_resource type="Animation" id=3] resource_name = "fade_in" -length = 3.0 tracks/0/type = "value" tracks/0/path = NodePath(".:modulate") tracks/0/interp = 1 @@ -27,7 +26,7 @@ tracks/0/loop_wrap = true tracks/0/imported = false tracks/0/enabled = true tracks/0/keys = { -"times": PoolRealArray( 0, 3 ), +"times": PoolRealArray( 0, 1 ), "transitions": PoolRealArray( 1, 1 ), "update": 0, "values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ] @@ -39,7 +38,7 @@ tracks/1/loop_wrap = true tracks/1/imported = false tracks/1/enabled = true tracks/1/keys = { -"times": PoolRealArray( -0.2, 3 ), +"times": PoolRealArray( -0.2, 1 ), "transitions": PoolRealArray( 1, 1 ), "update": 0, "values": [ Vector2( 0.01, 0.01 ), Vector2( 1, 1 ) ] diff --git a/scenes/World.gd b/scenes/World.gd index 3ccf6fe..8765773 100644 --- a/scenes/World.gd +++ b/scenes/World.gd @@ -24,7 +24,6 @@ var is_dragging = false func enemy_killed(_position: Vector2): player.score += 5 - player.show_message("Enemy killed!", 1) func health_consumed(_data): player.heal(10) player.score += 1 @@ -222,7 +221,7 @@ func _on_UpdateTimer_timeout() -> void: var filteredEnemies = Utils.filter(funcref(self,"filter_invalid_enemies"), enemies) for e in filteredEnemies: var enemy: Enemy = e - enemy.set_target($Player.position) + enemy.turn_towards($Player.position) var diff = enemy.global_position - player.global_position var dist = diff.length() var is_too_far = dist > item_replacement_distance diff --git a/scenes/World.tscn b/scenes/World.tscn index dcd0cf3..5fe84f8 100644 --- a/scenes/World.tscn +++ b/scenes/World.tscn @@ -76,8 +76,6 @@ antialiased = true wait_time = 0.1 autostart = true -[node name="NavigationPolygonInstance" type="NavigationPolygonInstance" parent="."] - [connection signal="body_entered" from="Destination" to="." method="_on_Destination_body_entered"] [connection signal="debug" from="Player" to="." method="_on_Player_debug"] [connection signal="destination_set" from="Player" to="." method="_on_Player_destination_set"]