{"schemaVersion":1,"record":{"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}],"sections":[{"id":"prerequisites","title":"Что нужно знать","body":"Нужны координаты и простые условия. Для упражнения используйте два прямоугольника без поворота. Задача урока: определить, что считается контактом, и не смешать геометрию с правилами урона."},{"id":"principle","title":"Принцип","body":"Обнаружение отвечает на вопрос «пересекаются ли формы?». Разрешение столкновения определяет, как убрать проникновение и изменить движение. Игровая реакция решает, что контакт означает: урон, подбор предмета или открытие двери. Эти три задачи могут использовать одно событие, но у них разные правила.\n\nДля прямоугольников, стороны которых параллельны осям, достаточно сравнить интервалы по X и Y. Для сложной сцены сначала можно отобрать возможных соседей, а затем провести точную проверку. Эти основы описаны в [MDN: 2D collision detection](https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection).\n\nВ движке сначала разберитесь в типах физических объектов и фильтрах взаимодействия. Например, [введение в физику Godot](https://docs.godotengine.org/en/stable/tutorials/physics/physics_introduction.html) различает области обнаружения и физические тела, а также объясняет слои и маски. Не добавляйте собственное перемещение поверх физического решателя без понимания порядка обновления.\n\n<span id=\"пример-область-опасности\"></span>"},{"id":"example","title":"Практический пример","body":"### Область опасности\n\nПусть координаты прямоугольника задают левый верхний угол, а ширина и высота положительны. В этом упражнении касание границ без площади пересечения не считается попаданием.\n\n```text\noverlap(a, b):\n    separatedX = a.right <= b.left or b.right <= a.left\n    separatedY = a.bottom <= b.top or b.bottom <= a.top\n    return not (separatedX or separatedY)\n```\n\nТеперь задайте правило: опасная область наносит один удар при входе. Храните множество пар, пересекавшихся на прошлом шаге. Для каждой текущей пары отправляйте событие входа, только если раньше её не было. После обработки заменяйте предыдущее множество текущим. Пару идентифицируют стабильные идентификаторы объектов, а не их координаты.\n\nЭто правило намеренно отличается от «урон каждый кадр». Если нужен периодический урон, задайте отдельный интервал в секундах. Если удар должен происходить один раз за всё время жизни снаряда, история входов недостаточна: после первого попадания пометьте снаряд использованным."},{"id":"mistakes","title":"Частые ошибки","body":"Графический спрайт и форма столкновения не обязаны совпадать, но их расхождение должно быть осмысленным. Включите отладочный показ форм и проверьте локальные координаты, масштаб и точку привязки.\n\nБыстрый объект может оказаться по разные стороны тонкой стены между двумя дискретными проверками. Для такого сценария исследуйте непрерывное обнаружение движка, проверку пройденного отрезка или другой подход под выбранные формы. Одно увеличение размера стены не объясняет проблему.\n\nНе удаляйте элементы коллекции посреди её обхода, если это меняет индексы ещё не обработанных объектов. Соберите события, примените реакции и удаление в определённом порядке. При уничтожении объекта очищайте связанные записи контактов."},{"id":"checks","title":"Проверка результата","body":"- Раздельные, пересекающиеся и ровно касающиеся формы дают ожидаемый результат.\n- Полное вложение одной формы в другую распознаётся.\n- Вход даёт один удар, выход и повторный вход работают по правилу.\n- Удаление объекта не оставляет ложный контакт.\n- Самый быстрый снаряд проверен на самой тонкой допустимой стене.\n- Слои исключают пары, которые не должны взаимодействовать."},{"id":"agent-task","title":"Задание для ИИ-агента","body":"> Найди формы столкновений и правила реакции. Зафиксируй соглашение о касании границ, порядок событий и частоту урона. Проверь вложение, повторный вход, удаление во время контакта и быстрый снаряд. Используй возможности выбранного движка; не внедряй собственный физический движок ради одного триггера."}],"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"}}