SpriteKit如何添加激光束并在碰撞点调整大小

时间:2015-01-25 19:08:34

标签: sprite collision detection

我正在用SpriteKit开发我的第一个游戏,我需要拍摄激光束。我不知道怎么做,因为我不知道激光精灵的大小,是否必须与屏幕高度一致,并在检测到碰撞时裁剪图像?有人能指出我正确的方向吗?不知道这个XD

感谢您的评论:D

2 个答案:

答案 0 :(得分:1)

这可以通过搜索物理机构一节中描述的here中的视线检测系统来完成:

有用的方法是来自SKPhysicsWorld类的enumerateBodiesAlongRayStart:end:usingBlock:,它枚举场景中与光线相交的所有物理实体。

基本上你必须使用上面的方法设置起点并搜索终点。当你知道交叉点(激光束的终点)在哪里时,你可以很容易地绘制它。

答案 1 :(得分:0)

这是一种迟到的回应,但我有一个非常好的解决方案。这就是它的样子(Swift 3):

在我的代码中,我在旋转节点时调用此功能,我希望激光器可以拍摄出来:

self.laser = SKShapeNode()
laser.lineWidth = 6
laser.glowWidth = 8
laser.strokeColor = .red

let _ = isTargetVisibleAtAngle(startPoint: startPoint, angle: selectedBeam!.zRotation + (CGFloat.pi / 2), distance: frame.size.height)

这就是方法。显然你放入了你想要的任何角度。 "找到了一个"如果光线穿过多个目标

,它就会停在第一个对象上
func isTargetVisibleAtAngle(startPoint: CGPoint, angle: CGFloat, distance: CGFloat) -> Bool {
    let rayStart = startPoint
    let rayEnd = CGPoint(x: rayStart.x + distance * cos(angle),
                         y: rayStart.y + distance * sin(angle))

    let path = CGMutablePath()
    path.move(to: rayStart)
    path.addLine(to: rayEnd)
    laser.path = path

    var foundOne = false
    let _ = physicsWorld.enumerateBodies(alongRayStart: rayStart, end: rayEnd) { (body, point, vector, stop) in
        if !foundOne {
            foundOne = true
            let p = CGMutablePath()
            p.move(to: rayStart)
            p.addLine(to: point)
            self.laser.path = p
        }
    }
    return false
}

enter image description here

enter image description here