Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Система столкновений

Как это работает

  • Каждый объект имеет коллайдер в виде прямоугольника на основе размера своего спрайта
  • Спрайты могут иметь пользовательские границы коллайдера (настраиваются в Sprite Editor)
  • Поворот объекта вращает коллайдер вокруг центра объекта
  • Столкновение использует SAT (Теорема о разделяющей оси), так что повёрнутые прямоугольники сталкиваются с их фактической повёрнутой формой
  • Столкновения проверяются в каждом кадре для динамических объектов

Объяснение типов столкновений

  1. Нет - Объект полностью игнорируется системой столкновений
  2. Статический - Действует как неподвижная стена (используется для ландшафта, платформ)
  3. Динамический - Двигается и выталкивается из других коллайдеров (используется для игрока, врагов)
  4. Триггер - Обнаруживает пересечение, но не блокирует движение (используется для собираемых предметов, зон)

Разрешение столкновений

  • Динамические объекты автоматически выталкиваются из статических и других динамических объектов
  • Триггеры никогда не блокируют движение - они только обнаруживают пересечения
  • Поворот коллайдеров разрешается вдоль направления наименьшего перекрытия

Callback onCollision

Функция onCollision(objA, objB) вызывается, когда объекты перекрываются. Шаблоны обратных вызовов:

Тип objA Тип objB Генерируется обратный вызов? Примечания
Динамический Статический Да Динамический выталкивается из статического
Динамический Динамический Да (в обеих направлениях) Оба объекта получают обратные вызовы
Динамический Триггер Да Обнаружен триггер
Триггер Триггер Да Оба триггера обнаруживают друг друга
Статический Статический Нет Статические не генерируют обратные вызовы
Статический Триггер Нет Ни один не генерирует обратного вызова

Основные правила:

  • objA всегда либо Динамический, либо Триггер
  • Когда два динамических объекта сталкиваются, оба получают обратный вызов (каждый как objA)
  • Когда два триггера перекрываются, генерируется один обратный вызов (первый триггер как objA)
  • Статические объекты никогда не появляются как objA

Пример: Обнаружение различных типов столкновений

func onCollision(objA, objB) {
    var typeA = getCollisionType(objA)
    var typeB = getCollisionType(objB)

    // Игрок (динамический) касается монетки (триггер)
    if (getName(objA) == "player" && typeB == COLLISION_TRIGGER()) {
        print("Собрано!")
        removeObject(gameScene, objB)
    }

    // Два триггера перекрываются (например, зоны обнаружения)
    if (typeA == COLLISION_TRIGGER() && typeB == COLLISION_TRIGGER()) {
        print(getName(objA) + " вошёл в зону " + getName(objB))
    }

    // Игрока ударил враг (оба динамические)
    if (getName(objA) == "player" && getName(objB) == "enemy") {
        print("Игрока ударили!")
    }
}

Физическая система

Tiniest Engine включает встроенную физическую систему, которая автоматически управляет гравитацией и скоростью для динамических объектов.

Как работает физика

Каждый кадр движок автоматически:

  1. Применяет гравитацию сцены к скорости каждого динамического объекта
  2. Применяет скорость к позиции каждого динамического объекта
// Физический процесс (обрабатывается автоматически движком):
velocity += gravity * dt
position += velocity * dt

Настройка гравитации

Настройте гравитацию на сцене, чтобы динамические объекты падали:

func start() {
    // Установить гравитацию вниз (300 пикселей в секунду в квадрате)
    setGravityY(gameScene, 300)

    // Необязательно: горизонтальная гравитация (эффект ветра)
    setGravityX(gameScene, 0)

    setScene(gameScene)
}

Использование скорости

Управляйте объектами с помощью скорости вместо установки позиции напрямую:

var player = Object("player")
var jumpForce = -200  // Негативное = вверх

func start() {
    setCollisionType(player, COLLISION_DYNAMIC())
    addObject(gameScene, player)
    setGravityY(gameScene, 300)
    setScene(gameScene)
}

func onUpdate(dt) {
    // Горизонтальное движение через скорость
    if (isKeyHeld(KEY_LEFT())) {
        setVelocityX(player, -100)
    } else if (isKeyHeld(KEY_RIGHT())) {
        setVelocityX(player, 100)
    } else {
        setVelocityX(player, 0)
    }

    // Прыжок, устанавливая вертикальную скорость
    if (isKeyPressed(KEY_SPACE())) {
        setVelocityY(player, jumpForce)
    }
}

Функции физики

Функция Описание
getVelocityX(obj) Возвращает X скорость объекта
setVelocityX(obj, vx) Устанавливает X скорость объекта
getVelocityY(obj) Возвращает Y скорость объекта
setVelocityY(obj, vy) Устанавливает Y скорость объекта
getGravityX(scene) Возвращает компонент гравитации сцены по оси X
setGravityX(scene, gx) Устанавливает компонент гравитации сцены по оси X
getGravityY(scene) Возвращает компонент гравитации сцены по оси Y
setGravityY(scene, gy) Устанавливает гравитацию по оси Y сцены (положительное = вниз)

Важно: Только объекты COLLISION_DYNAMIC() подвержены воздействию гравитации и имеют их скорость, применяемую автоматически