Создание 2D-игр с Tiniest2D
Коллизия и физика
Lesson 9 of 11 • 10 XP
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), основанный на размере его спрайта
- Спрайты могут иметь пользовательские границы коллайдера (установленные в редакторе спрайтов)
- Столкновение проверяется каждую рамку для динамических объектов
Объяснение типов столкновений
- Нет - Объект полностью игнорируется системой столкновений
- Статический - Действует как неподвижная стена (используется для местности, платформ)
- Динамический - Двигается и выталкивается из других коллайдеров (используется для игрока, врагов)
- Триггер - Обнаруживает пересечение, но не блокирует движение (используется для собираемых предметов, зон)
Разрешение столкновений
- Динамические объекты автоматически выталкиваются из статических и других динамических объектов
- Триггеры никогда не блокируют движение - они только обнаруживают пересечения
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 имеет встроенную физическую систему, которая автоматически управляет гравитацией и скоростью для динамических объектов.
Как работает физика
Каждую рамку движок автоматически:
- Применяет гравитацию сцены к скорости каждого динамического объекта
- Применяет скорость к позиции каждого динамического объекта
// Физический пайплайн (обрабатывается автоматически движком):
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() подвержены гравитации и имеют автоматически применяемую скорость.