fuzzyworld

godot-shooter / commit

starting to add enemy logic

3dea036b21aec9c09a6609c6cb1d90b48b235ca2 · Pavel Safronov · 2024-12-22 19:05:42 -0800 · parents 8cb9c2d15735

starting to add enemy logic
 actors/Enemy.gd   | 17 ++++++++++++++---
 actors/Enemy.tscn | 14 +++++++++++++-
 scenes/World.gd   | 10 ++++++----
 scenes/World.tscn |  3 +--
 4 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/actors/Enemy.gd b/actors/Enemy.gd
index b0bbf25..7c44006 100644
--- a/actors/Enemy.gd
+++ b/actors/Enemy.gd
@@ -3,7 +3,7 @@ class_name Enemy
 
 onready var damage_points = $DamagePoints
 onready var navigation_agent: NavigationAgent2D = $NavigationAgent2D
-onready var ship_collision_shape: CollisionPolygon2D = $ShipCollisionShape
+onready var viewcone_polygon2d: Polygon2D = $ViewconePolygon2D
 const Utils = preload("res://utils/Utils.gd")
 const Explosion = preload("res://effects/Explosion.tscn")
 const Smoke = preload("res://effects/Smoke.tscn")
@@ -21,12 +21,13 @@ export var target: Vector2
 export var follow_target = false
 signal enemy_killed(position)
 
-var player
+var player: Node2D
 var weapon: Weapon
 var velocity = Vector2.ZERO
 var dead = false
 var health_ratio
 var health_percentage
+var sees_player: bool
 
 func _ready() -> void:
 	weapon = Weapons.create_basic_enemy_gun()
@@ -36,7 +37,6 @@ func _ready() -> void:
 	_err = navigation_agent.connect("target_reached", self, "target_reached")
 	var players = get_tree().get_nodes_in_group("player")
 	self.player = players[0]
-	ship_collision_shape.connect()
 
 	$AnimationPlayer.play("fade_in")
 	if health < 0 or health > max_health:
@@ -65,6 +65,17 @@ func target_reached() -> void:
 	pass
 
 func _process(_delta: float) -> void:
+	var is_player_in_visibility_cone = Geometry.is_point_in_polygon(player.global_position, viewcone_polygon2d.polygon)
+	if is_player_in_visibility_cone:
+		var space_state = get_world_2d().direct_space_state
+		var intersections = space_state.intersect_ray(global_position, player.global_position, [self])
+		if intersections.size() == 1:
+			var collider = intersections[0]['collider']
+			sees_player = collider == player
+
+	if sees_player:
+		set_target(player.global_position)
+
 	var pb: ProgressBar = $Graphics/Alive/Container/ProgressBar
 	health_ratio = float(health) / float(max_health)
 	health_percentage = health_ratio * 100
diff --git a/actors/Enemy.tscn b/actors/Enemy.tscn
index 972d51c..428dbb9 100644
--- a/actors/Enemy.tscn
+++ b/actors/Enemy.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=11 format=2]
+[gd_scene load_steps=13 format=2]
 
 [ext_resource path="res://effects/Trails.tscn" type="PackedScene" id=2]
 [ext_resource path="res://actors/Enemy.gd" type="Script" id=3]
@@ -86,6 +86,12 @@ tracks/2/keys = {
 "values": [ 1.0, 0.0 ]
 }
 
+[sub_resource type="Gradient" id=7]
+colors = PoolColorArray( 1, 0, 0, 1, 1, 0, 0, 0 )
+
+[sub_resource type="GradientTexture" id=8]
+gradient = SubResource( 7 )
+
 [node name="Enemy" type="KinematicBody2D"]
 z_index = 10
 collision_layer = 2
@@ -150,3 +156,9 @@ radius = 40.0
 max_neighbors = 20
 time_horizon = 30.0
 max_speed = 50.0
+
+[node name="ViewconePolygon2D" type="Polygon2D" parent="."]
+texture = SubResource( 8 )
+texture_scale = Vector2( 7, 1 )
+texture_rotation_degrees = 90.0
+polygon = PoolVector2Array( -1, 0, -182, -330, 165, -330 )
diff --git a/scenes/World.gd b/scenes/World.gd
index 75178fa..8f7febb 100644
--- a/scenes/World.gd
+++ b/scenes/World.gd
@@ -254,10 +254,12 @@ func _on_UpdateTimer_timeout() -> void:
 	for ei in env_items:
 		var item = ei as Node2D
 		var enemy := item as Enemy
-		if enemy:
-			# if item is enemy, have them target the player
-			enemy.set_target($Player.position)
-	
+
+#		# if item is enemy, have them target the player
+#		if enemy:
+#			enemy.set_target($Player.position)
+
+		# if the item is too far from the player, teleport it to a closer location
 		var diff = item.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 420a063..7a68f8b 100644
--- a/scenes/World.tscn
+++ b/scenes/World.tscn
@@ -58,6 +58,7 @@ __meta__ = {
 [node name="StarField2" parent="Background/ParallaxBackground/Background2" instance=ExtResource( 5 )]
 
 [node name="Player" parent="." instance=ExtResource( 2 )]
+position = Vector2( 251, 399 )
 
 [node name="Environment" type="Node2D" parent="."]
 
@@ -76,7 +77,5 @@ navpoly = SubResource( 2 )
 navigation_layers = 2
 
 [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"]
 [connection signal="timeout" from="ShootTimer" to="." method="_on_ShootTimer_timeout"]
 [connection signal="timeout" from="UpdateTimer" to="." method="_on_UpdateTimer_timeout"]