如何在Spritekit中实现光线投射

时间:2019-06-13 08:58:29

标签: swift sprite-kit raycasting

我想检查激光束(一条线)是否穿过物体以及在什么位置穿过。目前,我正在重新创建grapefrukt的Asteroids项目。有关更多详细信息,请查看此视频(https://www.youtube.com/watch?v=MeJ76z2Ncyg&t=622s)。

SceneKit中有一个名为hitTestWithSegmentFromPoint ..的方法,但我想仅使用Spritekit来实现效果。

enter image description here 编辑1:我需要知道黑色圆圈的位置(交点)。小行星为红色,光束为绿色。

编辑2:我希望@ Knight0fDragon解决方案可以工作..但是没有。由于该行是通过框显示的,因此无法正确检测到第一个接触..也不可以检测到第二个(离开框时)

白色圆圈是接触点。紫色箭头指向接触点应位于的位置。蓝色圆圈是飞船:)

当检测到碰撞时,我也做出了努力,使盒子的物理物体不动态(阻止它们移动)

enter image description here

编辑3:更近的图像以查看物理物体正在使用showsPhysics

enter image description here

编辑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:相对行路径。圆圈仍在。

enter image description here

编辑6:线现在是使用新代码创建矩形的矩形

enter image description here

编辑7:使用Spritenode代替圆形

enter image description here

2 个答案:

答案 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