fuzzyworld

godot-shooter / meteor / files / World.gd

Branch meteor · default branch · all branches

World.gd

3.2 KB · history · blame

1extends Node2D
2
3const Utils = preload("res://Utils.gd")
4const Enemy = preload("res://Enemy.tscn")
5export var enemy_count = 4
6var destination: Vector2
7var is_destination_set = false
8
9func _ready() -> void:
10 for n in enemy_count:
11 add_new_enemy(true)
12
13func _on_enemy_killed() -> void:
14 $CanvasLayer/HUD.score += 1
15 # use call_deferred to ensure that this happens after the collision has been processed
16 call_deferred("add_new_enemy")
17
18func add_new_enemy(should_be_visible: bool = false) -> void:
19 var pos_angle = randi() % 360
20 var unit_vector = Vector2.UP.rotated(pos_angle)
21 var screen_radius = get_viewport().get_visible_rect().size.length() / 2 + 10
22 var enemy_spawn_dist = 400 if should_be_visible else screen_radius
23 var pos = unit_vector * enemy_spawn_dist + $Player.global_position
24
25 var enemy = Enemy.instance()
26 enemy.connect("enemy_killed", self, "_on_enemy_killed")
27 enemy.position = pos
28 enemy.add_to_group("enemies")
29 add_child(enemy)
30
31func _input(event: InputEvent) -> void:
32 if event is InputEventScreenTouch:
33 if event.pressed && !$Player.dead:
34 Utils.log("event position", event.position)
35 Utils.log("to_global(event.position)", to_global(event.position))
36 Utils.log("player", $Player.position)
37 var result = event.position + $Player.position - Vector2(500, 300)
38 set_destination(result)
39
40func _process(_delta: float) -> void:
41 if Input.is_action_just_pressed("click") and !$Player.dead:
42 var pos = get_global_mouse_position()
43 set_destination(pos)
44 if Input.is_action_just_pressed("pause"):
45 get_tree().paused = true
46 $CanvasLayer/PauseMenu.show()
47
48 if is_destination_set:
49 var diff = destination - $Player.global_position
50 var unit = diff.normalized()
51 $Player.velocity = unit * $Player.move_speed
52 $Destination.visible = true
53 else:
54 $Destination.visible = false
55 $Player.velocity = Vector2.ZERO
56
57func set_destination(pos: Vector2) -> void:
58 Utils.log("setting destination to ", pos)
59 destination = pos
60 is_destination_set = true
61 $Destination.global_position = pos
62 $Destination.visible = true
63 $Player. global_rotation = global_position.direction_to(get_global_mouse_position()).angle() + PI/2.0
64
65func _on_Destination_body_entered(body: Node) -> void:
66 if body == $Player:
67 is_destination_set = false
68
69func sort_enemies_ascending_distance(a: Enemy,b: Enemy):
70 var distA = $Player.global_position.distance_to(a.global_position)
71 var distB = $Player.global_position.distance_to(b.global_position)
72 var result = distA < distB
73 return result
74
75func filter_invalid_enemies(enemy: Enemy) -> bool:
76 if enemy.dead:
77 return false
78 return true
79
80func _on_ShootTimer_timeout() -> void:
81 if $Player.dead:
82 return
83 var enemies = get_tree().get_nodes_in_group("enemies")
84 for e in enemies:
85 var enemy: Enemy = e
86 enemy.is_targeted = false
87
88 var filteredEnemies = Utils.filter(funcref(self,"filter_invalid_enemies"), enemies)
89 if filteredEnemies.size() > 0:
90 filteredEnemies.sort_custom(self, "sort_enemies_ascending_distance")
91 var closest_enemy: Enemy = filteredEnemies[0]
92 closest_enemy.is_targeted = true
93 $Player.shoot_at(closest_enemy.global_position)
94 $PlayerToTarget.points[0] = $Player.global_position
95 $PlayerToTarget.points[1] = closest_enemy.global_position
96
97func _on_Button_pressed() -> void:
98 get_tree().paused = false
99 $CanvasLayer/PauseMenu.hide()