/
mrFeld
/
Platformer
Обзор
Документация
Войти
/
mrFeld
/
Platformer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
inventory
Script/Zones/enemy_spawn_zone.gd
63 строки
2 KB
mrFeld
inv0.1
10 май 2025, 04:47
10 май 2025, 04:47
c90da6d
Код
Авторство
О чём код?
extends Area2D @export var max_enemies: int = 5 @export var respawn_delay: float = 3.0 @export var enemy_scene: PackedScene @onready var collision_shape: CollisionShape2D = $CollisionShape2D @onready var timer: Timer = $RespawnTimer var enemies: Array = [] func _ready(): timer.wait_time = respawn_delay timer.timeout.connect(_on_respawn_timer_timeout) body_exited.connect(_on_body_exited) call_deferred("spawn_missing_enemies") func spawn_missing_enemies(): while enemies.size() < max_enemies: var enemy = enemy_scene.instantiate() var spawn_pos = get_random_spawn_position() enemy.global_position = spawn_pos get_parent().add_child(enemy) enemies.append(enemy) enemy.connect("tree_exited", Callable(self, "_on_enemy_removed").bind(enemy)) func get_random_spawn_position() -> Vector2: var shape := collision_shape.shape as RectangleShape2D var extents = shape.extents var zone_center = collision_shape.global_position var top_left = zone_center - extents var spawn_rect = Rect2(top_left, extents * 2) return Vector2( randf_range(spawn_rect.position.x, spawn_rect.end.x), randf_range(spawn_rect.position.y, spawn_rect.end.y) ) func _on_enemy_removed(enemy): enemies.erase(enemy) if not timer.is_inside_tree(): add_child(timer) if timer.is_stopped(): timer.start() func _on_body_exited(body: Node): if body in enemies: _on_enemy_removed(body) func _on_respawn_timer_timeout(): spawn_missing_enemies() func _draw(): if not collision_shape or not collision_shape.shape: return var shape := collision_shape.shape as RectangleShape2D var extents = shape.extents var top_left = collision_shape.position - extents var size = extents * 2 draw_rect(Rect2(top_left, size), Color(0, 1, 0, 0.2), true) draw_rect(Rect2(top_left, size), Color(0, 0.7, 0), false)