Как правильно использовать SKRegion.byIntersection от SpriteKit (с :)? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь использовать метод byIntersection (с :) для SKRegion в SpriteKit, поскольку он является частью стандартного дистрибутива iOS, и я бы предпочел не включать еще одну библиотеку, если я могу избежать этого или, не дай Бог, написать свойсобственный, поскольку произвольное пересечение пути может быть очень сложным во всех случаях.Обратите внимание, что мое приложение не использует SpriteKit как таковой.Я просто хочу использовать эту функциональность бесплатно.

Этот метод предположительно возвращает пересекающуюся область, хотя мне это даже не нужно, поскольку все, что мне действительно нужно, это знать, пересекаются ли области.Моя цель - просто проверить, основана ли область пересечения на пустом пути.

У меня есть два объекта NSBezierPath, которые я преобразую в объекты CGPath при преобразовании точек на путях из исходного NSView в целевой NSView, прежде чем инициализировать новые объекты SKRegion с каждым CGPath, используя SKRegion (path :).Я знаю, что все работает до того, как задействован SpriteKit, так как я полностью протестировал все.

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

Вторая странная вещь, и действительно суть проблемы, заключается в том, чтоэтот regionA.byIntersection (с: regionB), кажется, всегда возвращает regionA, независимо от того, пересекаются ли они полностью, частично или вообще не пересекаются.Я, конечно, проверил, что оба региона являются действительными и разными, и я разумно предполагаю, что третий отдельный регион должен быть возвращен.

Мой вопрос заключается в следующем: действительно ли этот API работает и, если это так, чтоя делаю не так?Если это не работает или качество продукции, работало ли оно когда-либо и почему оно все еще указано в официальной онлайн-документации?Исходя из описания, кажется, что его можно использовать без настройки SKView или каких-либо других настроек SpriteKit, поскольку он предположительно основан исключительно на математических алгоритмах.

Вот несколько простых примеров кода для демонстрациипроблема на игровой площадке:

import SpriteKit
let pathA = CGPath(rect: CGRect(x: 100, y: 100, width: 200, height: 200), transform: nil)
let pathB = CGPath(rect: CGRect(x: 150, y: 150, width: 200, height: 200), transform: nil)
let regionA = SKRegion(path: pathA)
let regionB = SKRegion(path: pathB)
let regionC = regionA.byIntersection(with: regionB)
print(regionC.path ?? "There is no path.")

Вывод:

Path 0x7fb46b67d500:
  moveto (0.666667, 0.666667)
    lineto (2, 0.666667)
    lineto (2, 2)
    lineto (0.666667, 2)
    closepath

Как объяснено ранее, все координаты таинственным образом уменьшаются на 150, поэтому отмена масштабирования дает (x: 100,y: 100, ширина: 200, высота: 200), которая действительно является pathA, вместо (x: 150, y: 150, ширина: 150, высота: 150), что будет правильным ответом.

...