ConcavePolygonShape2D
Набор отрезков для контурной 2D-коллизии; внутри пусто.
ConcavePolygonShape2D хранит независимые отрезки, а не заполненный многоугольник. Segments=[A,B,C,D] задаёт только A–B и C–D. Связи B–C и D–A автоматически не появляются. Даже если отрезки образуют замкнутый контур, маленькая форма целиком внутри него не пересекает границу и не даёт столкновения в прямом запросе.
Для четырёх углов A,B,C,D замкнутый контур нужно задать как [A,B,B,C,C,D,D,A]. Полный проверенный помощник делает это из списка углов. Передавайте каждый угол один раз, без повторения первого в конце. Вызывающий код владеет полученным ресурсом:
using System;
using Reckfell;
public static class ContourFactory2D
{
// Boundary only: this does not fill the enclosed area or check self-intersections.
// Supply each corner once; the last edge is added here. Caller owns the resource.
public static ConcavePolygonShape2D Closed(ReadOnlySpan<Vector2> corners)
{
if (corners.Length < 3)
throw new ArgumentException("At least three corners are required.", nameof(corners));
var segments = new Vector2[checked(corners.Length * 2)];
for (int i = 0; i < corners.Length; i++)
{
Vector2 a = corners[i];
Vector2 b = corners[(i + 1) % corners.Length];
if (!float.IsFinite(a.X) || !float.IsFinite(a.Y) || a == b)
throw new ArgumentException("Corners must be finite and adjacent corners distinct.", nameof(corners));
segments[2 * i] = a;
segments[2 * i + 1] = b;
}
var shape = new ConcavePolygonShape2D();
shape.SetSegments(segments.AsSpan());
return shape;
}
}Помощник проверяет количество углов, конечность координат и отсутствие рёбер нулевой длины. Он не проверяет самопересечения, площадь или корректность художественного контура и не заполняет его. Для заполненного выпуклого объекта используйте ConvexPolygonShape2D; вогнутую заполненную форму разбивайте на выпуклые части.
Новый ресурс пуст. Количество элементов Segments должно быть чётным; пустой массив очищает форму. Getter возвращает независимый массив, который нужно назначить обратно после редактирования. Обе перегрузки SetSegments копируют вход. Changed испускается и при повторных данных. GetRect() охватывает все концы отрезков в локальных координатах, но наличие точки внутри этих границ не означает столкновение с отрезком.
Для коллайдера назначьте ресурс свойству Shape у CollisionShape2D, который является непосредственным дочерним Entity CollisionObject2D. Ресурс сам по себе не добавляет тело в мир.
Проверены массивы и ReadOnlySpan, независимые копии, очистка, локальные границы, Changed и точный помощник. Прямые запросы подтвердили пустую середину замкнутого квадрата, столкновение у его края и отсутствие столкновения с удалённым кругом. Движение тел, непрерывное обнаружение быстрых столкновений, производительность и отрисовка не проверялись.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
ConcavePolygonShape2DКонструктор
public ConcavePolygonShape2D();Создаёт ресурс с пустым массивом отрезков и пустыми локальными границами. Форма описывает только отрезки, без заполненной области.
Свойства1
SegmentsСвойство
public Vector2[] Segments { get; set; }Пары концов независимых отрезков: [A,B,C,D] задаёт A–B и C–D. Это не последовательность углов; B–C и D–A не добавляются. Пустой массив очищает геометрию. Количество элементов должно быть чётным; задавайте конечные координаты и разные концы каждого отрезка. Setter копирует данные и испускает Changed даже при повторе; getter возвращает независимый массив. Замкнутый набор отрезков не заполняет внутреннюю область.
Методы3
GetSegmentsVector2[]
public Vector2[] GetSegments();Независимая копия пар концов отрезков, либо пустой массив. Для изменения геометрии назначьте данные обратно через Segments или SetSegments.
Vector2[]Независимая копия пар концов отрезков, либо пустой массив. Для изменения геометрии назначьте данные обратно через Segments или SetSegments.
SetSegments2 перегрузки
public void SetSegments(Vector2[] segments);Пары концов независимых отрезков: [A,B,C,D] задаёт A–B и C–D. Это не последовательность углов; B–C и D–A не добавляются. Пустой массив очищает геометрию. Количество элементов должно быть чётным; задавайте конечные координаты и разные концы каждого отрезка. Setter копирует данные и испускает Changed даже при повторе; getter возвращает независимый массив. Замкнутый набор отрезков не заполняет внутреннюю область.
| Имя | Тип | По умолчанию |
|---|---|---|
segments | Vector2[] | — |
segmentsЧётное число конечных координат, по два разных конца на отрезок. Пустой набор очищает форму. Соседние пары не соединяются автоматически.
public void SetSegments(ReadOnlySpan<Vector2> segments);Пары концов независимых отрезков: [A,B,C,D] задаёт A–B и C–D. Это не последовательность углов; B–C и D–A не добавляются. Пустой массив очищает геометрию. Количество элементов должно быть чётным; задавайте конечные координаты и разные концы каждого отрезка. Setter копирует данные и испускает Changed даже при повторе; getter возвращает независимый массив. Замкнутый набор отрезков не заполняет внутреннюю область.
| Имя | Тип | По умолчанию |
|---|---|---|
segments | ReadOnlySpan<Vector2> | — |
segmentsЧётное число конечных координат, по два разных конца на отрезок. Пустой набор очищает форму. Соседние пары не соединяются автоматически.