godot-shooter / commit
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"]