我有2个SKSpriteNode:
我需要随时检查另一个SKSpriteNode(一个球)的中心是否位于其中一个方格内。 球和方块具有相同的父级(主场景)。
override func update(_ currentTime: TimeInterval) {
let spriteArray = self.nodes(at: ball.position)
let arr = spriteArray.filter {$0.name == "square"}
for square in arr {
print(square.letter)
if(square.contains(self.puck.position)) {
print("INSIDE")
}
}
}
使用简单的方形(A),我的代码可以正常工作。数据是对的。我知道,在任何时候,如果CGPoint中心位于广场内部或外部。
但是对于具有旋转(B)的正方形,数据不是所希望的。 CGPoint在包含钻石形状的正方形中被检测到。
SKSpriteNode方块是通过关卡编辑器创建的。
如何才能获得钻石形状的正确结果?
编辑1
使用
view.showsPhysics = true
我可以看到所有SKSpriteNode与physicsBody的界限。我的钻石方块的边界是菱形方形,而不是灰色方形区域。
square.frame.size -> return the grey area
square.size -> return the diamond-square
在Apple文档func nodes(at p: CGPoint) -> [SKNode]中,方法是关于节点而不是框架,那么为什么它不起作用?
答案 0 :(得分:2)
有很多方法可以做到这一点,通常我喜欢使用路径,所以如果你有一个完美的钻石,你想提供一个与评论不同的方式,你可以创建一个完全匹配的路径你的钻石有UIBezierPath
,因为它有方法containsPoint
:
let f = square.frame
var diamondPath = UIBezierPath.init()
diamondPath.moveToPoint(CGPointMake(f.size.width-f.origin.x,f.origin.y))
diamondPath.addLineToPoint(CGPointMake(f.origin.x,f.size.height-f.origin.y))
diamondPath.addLineToPoint(CGPointMake(f.size.width-f.origin.x,f.size.height))
diamondPath.addLineToPoint(CGPointMake(f.size.width,f.size.height-f.origin.y))
diamondPath.closePath()
if diamondPath.containsPoint(<#T##point: CGPoint##CGPoint#>) {
// point is inside diamond
}