Загрузка данных


extends KinematicBody2D
class_name Actor

var velocity = Vector2.ZERO
var gravity = 300.0
var speed = 200.0
var jump_strength = -250.0

func _physics_process(delta: float) -> void:
	# 1. Гравитация
	velocity.y += gravity * delta

	# 2. Горизонтальное движение
	var direction = Input.get_axis("ui_left", "ui_right")
	velocity.x = direction * speed

	# 3. ДВИЖЕНИЕ
	# Важно: сохраняем результат, чтобы скорость обновилась после скольжения
	velocity = move_and_slide(velocity)

	# 4. ПРОВЕРКА СТОЛКНОВЕНИЙ ДЛЯ ПРЫЖКА
	var can_jump = false
	
	# Проверяем все столкновения, которые произошли при движении
	for i in range(get_slide_count()):
		var collision = get_slide_collision(i)
		if not collision:
			continue
		
		# Получаем нормаль поверхности (вектор, перпендикулярный стене/полу/потолку)
		var normal = collision.get_normal()
		
		# ГЛАВНОЕ УСЛОВИЕ:
		# Нормаль пола всегда смотрит ВВЕРХ от поверхности. 
		# В 2D координатах "вверх" для пола — это вектор (0, 1).
		# Если мы уперлись в потолок, нормаль будет (0, -1).
		
		# Используем dot product (скалярное произведение) для проверки направления.
		# Vector2.UP это (0, 1). Если dot > 0.9, значит это пол.
		if normal.dot(Vector2.UP) > 0.9:
			can_jump = true
			break # Нашли пол, дальше проверять не нужно

	# 5. ПРЫЖОК
	if can_jump and Input.is_action_just_pressed("ui_accept"):
		velocity.y = jump_strength