---
key: lesson/collision-basics
type: lesson
id: collision-basics
lang: ru
title: Основы столкновений
summary: >-
  Различаем обнаружение контакта, физическую реакцию и игровое событие;
  проверяем границы, скорость и повторный урон.
updatedAt: '2026-10-20'
status: active
url: 'https://gamemechanics.pro/ru/lessons/collision-basics/'
jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/lesson/collision-basics.json'
markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/lesson/collision-basics.md'
aliases:
  - столкновения
  - коллизии
  - collider
  - collision
tags:
  - collision
  - physics
  - testing
sourceIds:
  - source-7c0748c4a86f7409
  - source-8cc54cd9f9a5c8e8
sources:
  - id: source-7c0748c4a86f7409
    title: 'MDN: 2D collision detection'
    url: >-
      https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection
    verifiedAt: null
  - id: source-8cc54cd9f9a5c8e8
    title: 'Godot: Physics introduction'
    url: >-
      https://docs.godotengine.org/en/stable/tutorials/physics/physics_introduction.html
    verifiedAt: null
relations:
  - type: requires
    direction: outgoing
    label: Перед началом
    key: lesson/game-loop
    title: Игровой цикл и время
    url: 'https://gamemechanics.pro/ru/lessons/game-loop/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/lesson/game-loop.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/lesson/game-loop.md'
  - type: requires
    direction: incoming
    label: Продолжить изучение
    key: lesson/level-blockout
    title: 'Блокаут: проверяем пространство до графики'
    url: 'https://gamemechanics.pro/ru/lessons/level-blockout/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/lesson/level-blockout.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/lesson/level-blockout.md'
  - type: requires
    direction: incoming
    label: Продолжить изучение
    key: lesson/npc-pathfinding
    title: Поиск пути и выполнение маршрута
    url: 'https://gamemechanics.pro/ru/lessons/npc-pathfinding/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/lesson/npc-pathfinding.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/lesson/npc-pathfinding.md'
  - type: explains
    direction: outgoing
    label: Применение принципа
    key: mechanic/point-and-click--family-20
    title: 'Физика, свойства среды и эксперимент'
    url: >-
      https://gamemechanics.pro/ru/knowledge/mechanic/point-and-click--family-20/
    jsonUrl: >-
      https://gamemechanics.pro/api/v1/knowledge/ru/mechanic/point-and-click--family-20.json
    markdownUrl: >-
      https://gamemechanics.pro/content/knowledge/ru/mechanic/point-and-click--family-20.md
  - type: contains
    direction: incoming
    label: Учебные маршруты
    key: path/first-prototype
    title: Первый проверяемый прототип
    url: 'https://gamemechanics.pro/ru/learn/first-prototype/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/path/first-prototype.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/path/first-prototype.md'
  - type: requires
    direction: incoming
    label: Продолжить изучение
    key: path/npc-behavior
    title: Поведение NPC
    url: 'https://gamemechanics.pro/ru/learn/npc-behavior/'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/path/npc-behavior.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/path/npc-behavior.md'
  - type: uses
    direction: outgoing
    label: Источники в подборке
    key: resource/collision-2d
    title: 'MDN: столкновения в 2D'
    url: 'https://gamemechanics.pro/ru/resources/#resource-collision-2d'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/resource/collision-2d.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/resource/collision-2d.md'
  - type: uses
    direction: outgoing
    label: Источники в подборке
    key: resource/godot-physics
    title: 'Godot: введение в физику'
    url: 'https://gamemechanics.pro/ru/resources/#resource-godot-physics'
    jsonUrl: 'https://gamemechanics.pro/api/v1/knowledge/ru/resource/godot-physics.json'
    markdownUrl: 'https://gamemechanics.pro/content/knowledge/ru/resource/godot-physics.md'
placements: []
supersededBy: []
attributes:
  category: engineering
  level: intermediate
  minutes: 6
endsAt: null
provenance: >-
  Авторский материал gamemechanics.pro. Учебные примеры требуют проверки в своём
  проекте.
license: CC-BY-4.0
codeLicense: MIT
attribution: gamemechanics.pro contributors
---
# Основы столкновений

id: collision-basics
type: lesson
key: lesson/collision-basics
lang: ru
status: active
url: https://gamemechanics.pro/ru/lessons/collision-basics/

Различаем обнаружение контакта, физическую реакцию и игровое событие; проверяем границы, скорость и повторный урон.

## Что нужно знать

Нужны координаты и простые условия. Для упражнения используйте два прямоугольника без поворота. Задача урока: определить, что считается контактом, и не смешать геометрию с правилами урона.

## Принцип

Обнаружение отвечает на вопрос «пересекаются ли формы?». Разрешение столкновения определяет, как убрать проникновение и изменить движение. Игровая реакция решает, что контакт означает: урон, подбор предмета или открытие двери. Эти три задачи могут использовать одно событие, но у них разные правила.

Для прямоугольников, стороны которых параллельны осям, достаточно сравнить интервалы по X и Y. Для сложной сцены сначала можно отобрать возможных соседей, а затем провести точную проверку. Эти основы описаны в [MDN: 2D collision detection](https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection).

В движке сначала разберитесь в типах физических объектов и фильтрах взаимодействия. Например, [введение в физику Godot](https://docs.godotengine.org/en/stable/tutorials/physics/physics_introduction.html) различает области обнаружения и физические тела, а также объясняет слои и маски. Не добавляйте собственное перемещение поверх физического решателя без понимания порядка обновления.

<span id="пример-область-опасности"></span>

## Практический пример

### Область опасности

Пусть координаты прямоугольника задают левый верхний угол, а ширина и высота положительны. В этом упражнении касание границ без площади пересечения не считается попаданием.

```text
overlap(a, b):
    separatedX = a.right <= b.left or b.right <= a.left
    separatedY = a.bottom <= b.top or b.bottom <= a.top
    return not (separatedX or separatedY)
```

Теперь задайте правило: опасная область наносит один удар при входе. Храните множество пар, пересекавшихся на прошлом шаге. Для каждой текущей пары отправляйте событие входа, только если раньше её не было. После обработки заменяйте предыдущее множество текущим. Пару идентифицируют стабильные идентификаторы объектов, а не их координаты.

Это правило намеренно отличается от «урон каждый кадр». Если нужен периодический урон, задайте отдельный интервал в секундах. Если удар должен происходить один раз за всё время жизни снаряда, история входов недостаточна: после первого попадания пометьте снаряд использованным.

## Частые ошибки

Графический спрайт и форма столкновения не обязаны совпадать, но их расхождение должно быть осмысленным. Включите отладочный показ форм и проверьте локальные координаты, масштаб и точку привязки.

Быстрый объект может оказаться по разные стороны тонкой стены между двумя дискретными проверками. Для такого сценария исследуйте непрерывное обнаружение движка, проверку пройденного отрезка или другой подход под выбранные формы. Одно увеличение размера стены не объясняет проблему.

Не удаляйте элементы коллекции посреди её обхода, если это меняет индексы ещё не обработанных объектов. Соберите события, примените реакции и удаление в определённом порядке. При уничтожении объекта очищайте связанные записи контактов.

## Проверка результата

- Раздельные, пересекающиеся и ровно касающиеся формы дают ожидаемый результат.
- Полное вложение одной формы в другую распознаётся.
- Вход даёт один удар, выход и повторный вход работают по правилу.
- Удаление объекта не оставляет ложный контакт.
- Самый быстрый снаряд проверен на самой тонкой допустимой стене.
- Слои исключают пары, которые не должны взаимодействовать.

## Задание для ИИ-агента

> Найди формы столкновений и правила реакции. Зафиксируй соглашение о касании границ, порядок событий и частоту урона. Проверь вложение, повторный вход, удаление во время контакта и быстрый снаряд. Используй возможности выбранного движка; не внедряй собственный физический движок ради одного триггера.

## Связанные материалы

- Перед началом: [Игровой цикл и время](https://gamemechanics.pro/ru/lessons/game-loop/) (key: lesson/game-loop)
- Продолжить изучение: [Блокаут: проверяем пространство до графики](https://gamemechanics.pro/ru/lessons/level-blockout/) (key: lesson/level-blockout)
- Продолжить изучение: [Поиск пути и выполнение маршрута](https://gamemechanics.pro/ru/lessons/npc-pathfinding/) (key: lesson/npc-pathfinding)
- Применение принципа: [Физика, свойства среды и эксперимент](https://gamemechanics.pro/ru/knowledge/mechanic/point-and-click--family-20/) (key: mechanic/point-and-click--family-20)
- Учебные маршруты: [Первый проверяемый прототип](https://gamemechanics.pro/ru/learn/first-prototype/) (key: path/first-prototype)
- Продолжить изучение: [Поведение NPC](https://gamemechanics.pro/ru/learn/npc-behavior/) (key: path/npc-behavior)
- Источники в подборке: [MDN: столкновения в 2D](https://gamemechanics.pro/ru/resources/#resource-collision-2d) (key: resource/collision-2d)
- Источники в подборке: [Godot: введение в физику](https://gamemechanics.pro/ru/resources/#resource-godot-physics) (key: resource/godot-physics)

## Источники и происхождение

Авторский материал gamemechanics.pro. Учебные примеры требуют проверки в своём проекте.

- [MDN: 2D collision detection](https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection) (id: source-7c0748c4a86f7409)
- [Godot: Physics introduction](https://docs.godotengine.org/en/stable/tutorials/physics/physics_introduction.html) (id: source-8cc54cd9f9a5c8e8)

CC-BY-4.0 · gamemechanics.pro contributors
