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