Я хочу проверить, проходит ли лазерный луч (линия) сквозь объекты и в каких точках. В настоящее время я воссоздаю проект Asteroids от grapefrukt. Для более подробной информации вы посмотрите это видео (https://www.youtube.com/watch?v=MeJ76z2Ncyg&t=622s).
В SceneKit есть метод, называемый hitTestWithSegmentFromPoint
.. но я хочу добиться эффекта только с помощью Spritekit.
Редактировать 1: мне нужно знать положение черных кругов (точки пересечения). Астероид красного цвета, луч зеленый.
Редактировать 2: Я надеялся, что решение @ Knight0fDragon будет работать .. но это не так. Поскольку линия появляется через поле, она не определяет правильно первый контакт ... ни второй (при выходе из окна)
Белый круг - это точка контакта. Фиолетовые стрелки указывают, где должны быть точки контакта. Синий круг - это корабль:)
Я также сделал, когда столкновение обнаружено, чтобы сделать физические тела ящиков не динамическими (останавливая их движение)
Редактировать 3: Изображение ближе, чтобы увидеть, где физические тела используют showsPhysics
Редактировать 4: Как я делаю белый круг
let firstBody = contact.bodyA.categoryBitMask > contact.bodyB.categoryBitMask ? contact.bodyB : contact.bodyA
let secondBody = contact.bodyA == firstBody ? contact.bodyB : contact.bodyA
if firstBody.categoryBitMask == UInt32(1){
secondBody.isDynamic = false;
// run only once
print(contact.contactPoint);
createCircleDebug(x: contact.contactPoint.x, y: contact.contactPoint.y, radius: 5)
}
func createCircleDebug (x:CGFloat, y:CGFloat, radius:CGFloat){
let shape = SKShapeNode.init(circleOfRadius: radius);
shape.strokeColor = SKColor.white;
shape.position = CGPoint(x: x, y: y);
self.addChild(shape);
}
Редактировать 5: Относительный путь линии. Круг все еще выключен.
Редактировать 6: теперь линия представляет собой прямоугольник, использующий новый код для ее создания
Редактировать 7: Использование Spritenode вместо круга