我正在用SpriteKit开发我的第一个游戏,我需要拍摄激光束。我不知道怎么做,因为我不知道激光精灵的大小,是否必须与屏幕高度一致,并在检测到碰撞时裁剪图像?有人能指出我正确的方向吗?不知道这个XD
感谢您的评论:D
答案 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
}