我想检查激光束(一条线)是否穿过物体以及在什么位置穿过。目前,我正在重新创建grapefrukt的Asteroids项目。有关更多详细信息,请查看此视频(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代替圆形
答案 0 :(得分:0)
Apple文档包括有关使用SKPhysics进行光线投射的指南:
Searching the World for Physics Bodies
要找到射线照射到的最近的物理物体,可以使用body(alongRayStart:end:)
。这是SKPhysicsWorld
上的一种方法。
如果要获取所有被射线击中的物体以及它们被击中的位置,则还有enumerateBodies(alongRayStart:end:using:)
。此方法使用以下参数为射线接触的每个物理物体调用您的块:
body
:射线相交的物理物体。point
:场景坐标中的射线与物理物体接触的点。normal
:物理物体在接触点的法向向量。stop
:指向布尔变量的指针。您可以将块设置为true来终止枚举。答案 1 :(得分:0)
通常我会按照福特所说的去做(这是我回答问题后要提供的答案),但是如果您需要知道交叉点,我会创建一个{{1 }},并使用contactBegins获取交点
SKNode