Keep your place in this quest

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

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

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

  • У каждого объекта есть AABB (Axis-Aligned Bounding Box), основанный на размере его спрайта
  • Спрайты могут иметь пользовательские границы коллайдера (установленные в редакторе спрайтов)
  • Столкновение проверяется каждую рамку для динамических объектов

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

  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))
    }

    // Игрокa ударил враг (оба динамические)
    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() подвержены гравитации и имеют автоматически применяемую скорость.